帮助构建一个带有MultipartEntity的POST请求(新手问题)
我想用下面的参数构造一个多部分请求:name(字符串),email(字符串)和fileupload(文件)。我正在使用下面的Java代码(在Android中工作)。帮助构建一个带有MultipartEntity的POST请求(新手问题)
的httppost.getRequestLine()打印
POST http://www.myurl.com/upload HTTP/1.1
所以一切看起来都在客户端站点不错,但我的服务器(Django的/阿帕奇),把它读成一个GET请求,没有GET参数 - request.method
产生' GET',request.GET.items()
产生一个空的字典。
我在做什么错?实际上我不知道如何正确设置多部分参数 - 我正在使用猜测 - 所以可能会出现这种问题。
public void SendMultipartFile() {
Log.e(LOG_TAG, "SendMultipartFile");
DefaultHttpClient httpclient = new DefaultHttpClient();
HttpPost httppost = new HttpPost("http://www.myurl.com/upload");
File file = new File(Environment.getExternalStorageDirectory(),
"video.3gp");
Log.e(LOG_TAG, "setting up multipart entity");
MultipartEntity mpEntity = new MultipartEntity();
ContentBody cbFile = new FileBody(file);
mpEntity.addPart("fileupload", cbFile);
Log.i("SendLargeFile", "file length = " + file.length());
try {
mpEntity.addPart("name", new StringBody(name));
mpEntity.addPart("email", new StringBody(email));;
} catch (UnsupportedEncodingException e1) {
// TODO Auto-generated catch block
Log.e(LOG_TAG, "UnsupportedEncodingException");
e1.printStackTrace();
}
httppost.setEntity(mpEntity);
Log.e(LOG_TAG, "executing request " + httppost.getRequestLine());
HttpResponse response;
try {
Log.e(LOG_TAG, "about to execute");
response = httpclient.execute(httppost);
Log.e(LOG_TAG, "executed");
HttpEntity resEntity = response.getEntity();
Log.e(LOG_TAG, response.getStatusLine().toString());
if (resEntity != null) {
System.out.println(EntityUtils.toString(resEntity));
}
if (resEntity != null) {
resEntity.consumeContent();
}
} catch (ClientProtocolException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
似乎可能是你看错了地方。您发布,但在寻找request.GET中的数据:
尝试寻找的QueryDict的在“request.POST”和“request.FILES” ......
http://docs.djangoproject.com/en/1.6/ref/request-response/#django.http.HttpRequest.FILES
URL是过时的。 – 2014-01-08 14:44:43
我有同样的问题带有MultipartEntity请求。我需要将图像上传到服务器。 所以我通过HttpURLConnection类做了MultipartEntity请求。 我把我的代码放在这里,认为它可以对你有用。 您需要设置URL路径和文件路径。对于这种使用方法。
public class UploadImage
implements Runnable{
private static String delimiter = "--";
private static String boundary = "SwA" + Long.toString(System.currentTimeMillis()) + "SwA";
private static int bytesRead;
private static int bytesAvailable;
private static int bufferSize;
private static byte[] buffer;
private static int maxBufferSize = 1 * 1024 * 1024;
private String URL;
private String file;
@Override
public void run()
{
HttpURLConnection conn = null;
String response = null;
try {
URL url = new URL(URL);
conn = (HttpURLConnection) url.openConnection();
conn.setDoOutput(true);
conn.setDoInput(true);
conn.setUseCaches(false);
conn.setRequestMethod("POST");
conn.setRequestProperty("Connection", "Keep-Alive");
conn.setRequestProperty("Content-type", "multipart/form-data; boundary=" + boundary);
conn.setRequestProperty("USER-AUTH", UserPreferences.getToken());
conn.connect();
//
DataOutputStream dos = new DataOutputStream(conn.getOutputStream());
dos.writeBytes((delimiter + boundary + "\r\n"));
dos.writeBytes("Content-Disposition: form-data; name=\"" + "image" + "\"; filename=\"" + file + "\"\r\n");
dos.writeBytes("Content-Type: mimetype\r\n");// Content-Type:
// text/plain
dos.writeBytes("Content-Transfer-Encoding: binary\r\n\r\n");
// create a buffer of maximum size
FileInputStream fileInputStream = new FileInputStream(new File(file));
bytesAvailable = fileInputStream.available();
bufferSize = Math.min(bytesAvailable, maxBufferSize);
buffer = new byte[bufferSize];
// read file and write it into form...
bytesRead = fileInputStream.read(buffer, 0, bufferSize);
while (bytesRead > 0) {
dos.write(buffer, 0, bufferSize);
bytesAvailable = fileInputStream.available();
bufferSize = Math.min(bytesAvailable, maxBufferSize);
bytesRead = fileInputStream.read(buffer, 0, bufferSize);
}
dos.writeBytes("\r\n");
dos.writeBytes(delimiter + boundary + delimiter + "\r\n");
fileInputStream.close();
dos.flush();
dos.close();
int responseCode = conn.getResponseCode();
if (responseCode != 200) {
throw new Exception(String.format("Received the response code %d from the URL %s", responseCode, url));
}
InputStream is = conn.getInputStream();
ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte[] bytes = new byte[1024];
int bytesRead;
while ((bytesRead = is.read(bytes)) != -1) {
baos.write(bytes, 0, bytesRead);
}
byte[] bytesReceived = baos.toByteArray();
baos.close();
is.close();
response = new String(bytesReceived);
} catch (Exception e) {
e.printStackTrace();
} finally {
if (conn != null) {
conn.disconnect();
}
}
}
public void put(String targetURL, String file)
{
this.URL = targetURL;
this.file = file;
}}
请看一看这个以前回答问题 http://*.com/questions/2017414/post-multipart-request-with-android-sdk – Omie 2012-09-30 10:48:28