Помогите построить запрос POST с MultipartEntity (вопрос новичка) - PullRequest
5 голосов
/ 09 апреля 2010

Я хотел бы создать многочастный запрос со следующими параметрами: имя (строка), электронная почта (строка) и загрузка файла (файл). Я использую код Java ниже (работает в Android).

httppost.getRequestLine () печатает

POST http://www.myurl.com/upload HTTP/1.1

Так что на клиентском сайте все выглядит хорошо, но мой сервер (Django / Apache) читает его как 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();
  }
 }

Ответы [ 2 ]

0 голосов
/ 12 марта 2014

У меня была такая же проблема с запросом MultipartEntity. Мне нужно загрузить изображение на сервер. Поэтому я сделал запрос MultipartEntity классом HttpURLConnection. Я поставил здесь свой код, думаю, он может быть полезен для вас. Вам нужно установить путь URL и путь к файлу. Для этого используйте метод put.

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;
}}
0 голосов
/ 09 апреля 2010

Кажется вероятным, что вы ищете не в том месте. Вы отправляете сообщение, но ищете данные в запросе. GET:

Попробуйте поискать QueryDict в "request.POST" и "request.FILES" ...

http://docs.djangoproject.com/en/1.6/ref/request-response/#django.http.HttpRequest.FILES

...