【问题标题】:Post multipart request with Android SDK使用 Android SDK 发布多部分请求
【发布时间】:2011-01-02 07:26:59
【问题描述】:

我正在尝试做一些我认为相对简单的事情:使用 Android SDK 将图像上传到服务器。我发现了很多示例代码:

http://groups.google.com/group/android-developers/browse_thread/thread/f9e17bbaf50c5fc/46145fcacd450e48

http://linklens.blogspot.com/2009/06/android-multipart-upload.html

但两者都不适合我。我一直遇到的困惑是提出多部分请求真正需要的东西。 最简单的 Android 分段上传(带图片)方法是什么?

任何帮助或建议将不胜感激!

【问题讨论】:

  • 到目前为止您尝试过的方法有哪些问题?
  • 哦,很多问题。目前正在将照片 uri 从照片选择器传回我可以附加到 MultipartEntity 的文件中。但我什至不确定这是构造多端口请求的正确方法。
  • 真的老了。有人需要用现代库来回答这个问题,或者至少发布有效的代码!自从提出这个问题以来的十年里,很多东西都被弃用了,我很难找到甚至可以编译的东西。

标签: android http multipartform-data android-sdk-2.1


【解决方案1】:

您可以使用 GentleRequest,这是一个用于发出 http 请求的轻量级库(免责声明:我是作者):

Connections connections = new HttpConnections();
Binary binary = new PacketsBinary(new 
BufferedInputStream(new FileInputStream(file)), 
   file.length());
//Content-Type is set to multipart/form-data; boundary= 
//{generated by multipart object}
MultipartForm multipart = new HttpMultipartForm(
    new HttpFormPart("user", "aplication/json", 
       new JSONObject().toString().getBytes()),
    new HttpFormPart("java", "java.png", "image/png", 
       binary.content()));
Response response = connections.response(new 
    PostRequest(url, multipart));
if (response.hasSuccessCode()) {
    byte[] raw = response.body().value();
    String string = response.body().stringValue();
    JSONOBject json = response.body().jsonValue();
 } else {

 }

欢迎查看:https://github.com/Iprogrammerr/Gentle-Request

【讨论】:

    【解决方案2】:
    public class Multipart{
        private final Map<String, String> headrs;
        private String url;
        private HttpURLConnection con;
        private OutputStream os;
    
        private String delimiter = "--";
        private String boundary = "TRR" + Long.toString(System.currentTimeMillis()) + "TRR";
    
        public Multipart (String url, Map<String, String> headers) {
            this.url = url;
            this.headrs = headers;
        }
    
        public void connectForMultipart() throws Exception {
            con = (HttpURLConnection) (new URL(url)).openConnection();
            con.setRequestMethod("POST");
            con.setDoInput(true);
            con.setDoOutput(true);
            con.setRequestProperty("Connection", "Keep-Alive");
            for (Map.Entry<String, String> entry : headrs.entrySet()) {
                con.setRequestProperty(entry.getKey(), entry.getValue());
            }
            con.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + boundary);
            con.connect();
            os = con.getOutputStream();
        }
    
        public void addFormPart(String paramName, String value) throws Exception {
            writeParamData(paramName, value);
        }
    
        public void addFilePart(String paramName, String fileName, byte[] data) throws Exception {
            os.write((delimiter + boundary + "\r\n").getBytes());
            os.write(("Content-Disposition: form-data; name=\"" + paramName + "\"; filename=\"" + fileName + "\"\r\n").getBytes());
            os.write(("Content-Type: application/octet-stream\r\n").getBytes());
            os.write(("Content-Transfer-Encoding: binary\r\n").getBytes());
            os.write("\r\n".getBytes());
    
            os.write(data);
    
            os.write("\r\n".getBytes());
        }
    
        public void finishMultipart() throws Exception {
            os.write((delimiter + boundary + delimiter + "\r\n").getBytes());
        }
    
    
        public String getResponse() throws Exception {
            InputStream is = con.getInputStream();
            byte[] b1 = new byte[1024];
            StringBuffer buffer = new StringBuffer();
    
            while (is.read(b1) != -1)
                buffer.append(new String(b1));
    
            con.disconnect();
    
            return buffer.toString();
        }
    
    
        private void writeParamData(String paramName, String value) throws Exception {
    
    
            os.write((delimiter + boundary + "\r\n").getBytes());
            os.write("Content-Type: text/plain\r\n".getBytes());//;charset=utf-8
            os.write(("Content-Disposition: form-data; name=\"" + paramName + "\"\r\n").getBytes());
            ;
            os.write(("\r\n" + value + "\r\n").getBytes());
    
    
        }
    }
    

    然后在下面调用

    Multipart multipart = new Multipart(url__, map);
                multipart .connectForMultipart();
    multipart .addFormPart(entry.getKey(), entry.getValue());
    multipart .addFilePart(KeyName, "FileName", imagedata);
    multipart .finishMultipart();
    

    【讨论】:

      【解决方案3】:

      删除你所有的 httpclient、httpmime 依赖并添加这个依赖compile 'commons-httpclient:commons-httpclient:3.1'。这个依赖已经内置在 MultipartRequestEntity 中,因此您可以轻松地将一个或多个文件上传到服务器

      public class FileUploadUrlConnection extends AsyncTask<String, String, String> {
      private Context context;
      private String url;
      private List<File> files;
      
      public FileUploadUrlConnection(Context context, String url, List<File> files) {
          this.context = context;
          this.url = url;
          this.files = files;
      }
      
      @Override
      protected String doInBackground(String... params) {
      
          HttpClient client = new HttpClient();
          PostMethod post = new PostMethod(url);
          HttpClientParams connectionParams = new HttpClientParams();
      
          post.setRequestHeader(// Your header goes here );
      
          try {
              Part[] parts = new Part[files.size()];
              for (int i=0; i<files.size(); i++) {
                  Part part = new FilePart(files.get(i).getName(), files.get(i));
                  parts[i] = part;
              }
      
              MultipartRequestEntity entity = new MultipartRequestEntity(parts, connectionParams);
      
              post.setRequestEntity(entity);
      
              int statusCode = client.executeMethod(post);
              String response = post.getResponseBodyAsString();
      
              Log.v("Multipart "," "+response);
              if(statusCode == 200) {
                  return response;
              }
          } catch (IOException e) {
              e.printStackTrace();
          } 
       return null;
      }
      

      还可以添加请求和响应超时

      client.getParams().setParameter(CoreConnectionPNames.CONNECTION_TIMEOUT, 10000);
      client.getParams().setParameter(CoreConnectionPNames.SO_TIMEOUT, 10000);
      

      【讨论】:

        【解决方案4】:

        对于后代,我没有看到 okhttp 被提及。 Related post.

        基本上,您使用 MultipartBody.Builder 构建主体,然后将其发布到请求中。

        kotlin 中的示例:

            val body = MultipartBody.Builder()
                    .setType(MultipartBody.FORM)
                    .addFormDataPart(
                        "file", 
                        file.getName(),
                        RequestBody.create(MediaType.parse("image/png"), file)
                    )
                    .addFormDataPart("timestamp", Date().time.toString())
                    .build()
        
            val request = Request.Builder()
                    .url(url)
                    .post(body)
                    .build()
        
            httpClient.newCall(request).enqueue(object : okhttp3.Callback {
                override fun onFailure(call: Call?, e: IOException?) {
                    ...
                }
        
                override fun onResponse(call: Call?, response: Response?) {
                    ...
                }
            })
        

        【讨论】:

          【解决方案5】:

          这是对我有用的轻量级解决方案,无需外部 HTTPCore 和此类库。我遇到了 64K 方法的问题,所以没有办法避免使用 HTTPCore 库

          import java.util.List;
          
          import java.io.BufferedReader;
          
          import java.io.File;
          import java.io.FileInputStream;
          import java.io.IOException;
          import java.io.InputStreamReader;
          import java.io.OutputStream;
          import java.io.OutputStreamWriter;
          import java.io.PrintWriter;
          import java.net.HttpURLConnection;
          import java.net.URL;
          import java.net.URLConnection;
          import java.util.ArrayList;
          import java.util.List;
          
          /**
           * This utility class provides an abstraction layer for sending multipart HTTP
           * POST requests to a web server.
           *
           * @author www.codejava.net
           */
          public class MultipartUtility {
              private final String boundary;
              private static final String LINE_FEED = "\r\n";
              private HttpURLConnection httpConn;
              private String charset;
              private OutputStream outputStream;
              private PrintWriter writer;
          
              /**
               * This constructor initializes a new HTTP POST request with content type
               * is set to multipart/form-data
               *
               * @param requestURL
               * @param charset
               * @throws IOException
               */
              public MultipartUtility(String requestURL, String charset)
                      throws IOException {
                  this.charset = charset;
          
                  // creates a unique boundary based on time stamp
                  boundary = "===" + System.currentTimeMillis() + "===";
          
                  URL url = new URL(requestURL);
                  httpConn = (HttpURLConnection) url.openConnection();
                  httpConn.setUseCaches(false);
                  httpConn.setDoOutput(true); // indicates POST method
                  httpConn.setDoInput(true);
                  httpConn.setRequestProperty("Content-Type",
                          "multipart/form-data; boundary=" + boundary);
                  httpConn.setRequestProperty("User-Agent", "CodeJava Agent");
                  httpConn.setRequestProperty("Test", "Bonjour");
                  outputStream = httpConn.getOutputStream();
                  writer = new PrintWriter(new OutputStreamWriter(outputStream, charset),
                          true);
              }
          
              /**
               * Adds a form field to the request
               *
               * @param name  field name
               * @param value field value
               */
              public void addFormField(String name, String value) {
                  writer.append("--" + boundary).append(LINE_FEED);
                  writer.append("Content-Disposition: form-data; name=\"" + name + "\"")
                          .append(LINE_FEED);
                  writer.append("Content-Type: text/plain; charset=" + charset).append(
                          LINE_FEED);
                  writer.append(LINE_FEED);
                  writer.append(value).append(LINE_FEED);
                  writer.flush();
              }
          
              /**
               * Adds a upload file section to the request
               *
               * @param fieldName  name attribute in <input type="file" name="..." />
               * @param uploadFile a File to be uploaded
               * @throws IOException
               */
              public void addFilePart(String fieldName, File uploadFile)
                      throws IOException {
                  String fileName = uploadFile.getName();
                  writer.append("--" + boundary).append(LINE_FEED);
                  writer.append(
                          "Content-Disposition: form-data; name=\"" + fieldName
                                  + "\"; filename=\"" + fileName + "\"")
                          .append(LINE_FEED);
                  writer.append(
                          "Content-Type: "
                                  + URLConnection.guessContentTypeFromName(fileName))
                          .append(LINE_FEED);
                  writer.append("Content-Transfer-Encoding: binary").append(LINE_FEED);
                  writer.append(LINE_FEED);
                  writer.flush();
          
                  FileInputStream inputStream = new FileInputStream(uploadFile);
                  byte[] buffer = new byte[4096];
                  int bytesRead = -1;
                  while ((bytesRead = inputStream.read(buffer)) != -1) {
                      outputStream.write(buffer, 0, bytesRead);
                  }
                  outputStream.flush();
                  inputStream.close();
          
                  writer.append(LINE_FEED);
                  writer.flush();
              }
          
              /**
               * Adds a header field to the request.
               *
               * @param name  - name of the header field
               * @param value - value of the header field
               */
              public void addHeaderField(String name, String value) {
                  writer.append(name + ": " + value).append(LINE_FEED);
                  writer.flush();
              }
          
              /**
               * Completes the request and receives response from the server.
               *
               * @return a list of Strings as response in case the server returned
               * status OK, otherwise an exception is thrown.
               * @throws IOException
               */
              public List<String> finish() throws IOException {
                  List<String> response = new ArrayList<String>();
          
                  writer.append(LINE_FEED).flush();
                  writer.append("--" + boundary + "--").append(LINE_FEED);
                  writer.close();
          
                  // checks server's status code first
                  int status = httpConn.getResponseCode();
                  if (status == HttpURLConnection.HTTP_OK) {
                      BufferedReader reader = new BufferedReader(new InputStreamReader(
                              httpConn.getInputStream()));
                      String line = null;
                      while ((line = reader.readLine()) != null) {
                          response.add(line);
                      }
                      reader.close();
                      httpConn.disconnect();
                  } else {
                      throw new IOException("Server returned non-OK status: " + status);
                  }
          
                  return response;
              }
          }
          

          用法

          private void uploadMedia() {
                  try {
          
                      String charset = "UTF-8";
                      File uploadFile1 = new File("/sdcard/myvideo.mp4");
                      String requestURL = Data.BASE_URL+Data.URL_UPLOAD_REACTION_TEST;
          
                      MultipartUtility multipart = new MultipartUtility(requestURL, charset);
          
          //            multipart.addHeaderField("User-Agent", "CodeJava");
          //            multipart.addHeaderField("Test-Header", "Header-Value");
          
                      multipart.addFormField("friend_id", "Cool Pictures");
                      multipart.addFormField("userid", "Java,upload,Spring");
          
                      multipart.addFilePart("uploadedfile", uploadFile1);
          
                      List<String> response = multipart.finish();
          
                      Log.v("rht", "SERVER REPLIED:");
          
                      for (String line : response) {
                          Log.v("rht", "Line : "+line);
          
                      }
                  } catch (Exception e) {
                      e.printStackTrace();
                  }
          
              }
          

          接受上传的PHP代码

          <?php
          
              $friend_id = $_REQUEST['friend_id'];
              $userid = $_REQUEST['userid'];
          
              echo 'friend_id : '.$friend_id. ' userid '.$userid;
          
              move_uploaded_file($_FILES['uploadedfile']['tmp_name'], "./uploads/".$_FILES["uploadedfile"]["name"]);
          
          ?>
          

          【讨论】:

          • 对于这个边界,我的代码抛出了 400 Bad Request boundary = "===" + System.currentTimeMillis() + "===";然后我将边界更改为边界 = "---" + System.currentTimeMillis();然后请求在后端被正确解析。
          • 为什么这么复杂...?不完全是一个问题。只是烦人,在这种环境下做这件事需要这么多。
          • 我成功地使用了这个,但必须删除 addFilePart() 中的最后一个 append(LINEFEED)。谢谢。
          【解决方案6】:

          如果您使用的是 AOSP 库Volley,这是一个简单的方法。

          扩展类Request&lt;T&gt;如下-

          public class MultipartRequest extends Request<String> {
              private static final String FILE_PART_NAME = "file";
              private final Response.Listener<String> mListener;
              private final Map<String, File> mFilePart;
              private final Map<String, String> mStringPart;
              MultipartEntityBuilder entity = MultipartEntityBuilder.create();
              HttpEntity httpentity;
          
              public MultipartRequest(String url, Response.ErrorListener errorListener,
                                      Response.Listener<String> listener, Map<String, File> file,
                                      Map<String, String> mStringPart) {
                  super(Method.POST, url, errorListener);
                  mListener = listener;
                  mFilePart = file;
                  this.mStringPart = mStringPart;
                  entity.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);
                  buildMultipartEntity();
              }
          
              public void addStringBody(String param, String value) {
                  mStringPart.put(param, value);
              }
          
              private void buildMultipartEntity() {
                  for (Map.Entry<String, File> entry : mFilePart.entrySet()) {
                      // entity.addPart(entry.getKey(), new FileBody(entry.getValue(), ContentType.create("image/jpeg"), entry.getKey()));
                      try {
                          entity.addBinaryBody(entry.getKey(), Utils.toByteArray(new FileInputStream(entry.getValue())), ContentType.create("image/jpeg"), entry.getKey() + ".JPG");
                      } catch (FileNotFoundException e) {
                          e.printStackTrace();
                      }
                  }
                  for (Map.Entry<String, String> entry : mStringPart.entrySet()) {
                      if (entry.getKey() != null && entry.getValue() != null) {
                          entity.addTextBody(entry.getKey(), entry.getValue());
                      }
                  }
              }
          
              @Override
              public String getBodyContentType() {
                  return httpentity.getContentType().getValue();
              }
          
              @Override
              public byte[] getBody() throws AuthFailureError {
                  ByteArrayOutputStream bos = new ByteArrayOutputStream();
                  try {
                      httpentity = entity.build();
                      httpentity.writeTo(bos);
                  } catch (IOException e) {
                      VolleyLog.e("IOException writing to ByteArrayOutputStream");
                  }
                  return bos.toByteArray();
              }
          
              @Override
              protected Response<String> parseNetworkResponse(NetworkResponse response) {
                  Log.d("Response", new String(response.data));
                  return Response.success(new String(response.data), getCacheEntry());
              }
          
              @Override
              protected void deliverResponse(String response) {
                  mListener.onResponse(response);
              }
          }
          

          您可以创建和添加请求,例如-

          Map<String, String> params = new HashMap<>();
                  params.put("name", name.getText().toString());
                  params.put("email", email.getText().toString());
                  params.put("user_id", appPreferences.getInt( Utils.PROPERTY_USER_ID, -1) + "");
                  params.put("password", password.getText().toString());
                  params.put("imageName", pictureName);
                  Map<String, File> files = new HashMap<>();
                  files.put("photo", new File(Utils.LOCAL_RESOURCE_PATH + pictureName));
                  MultipartRequest multipartRequest = new MultipartRequest(Utils.BASE_URL + "editprofile/" + appPreferences.getInt(Utils.PROPERTY_USER_ID, -1), new Response.ErrorListener() {
                      @Override
                      public void onErrorResponse(VolleyError error) {
                          // TODO Auto-generated method stub
                          Log.d("Error: ", error.toString());
                          FugaDialog.showErrorDialog(ProfileActivity.this);
                      }
                  }, new Response.Listener<String>() {
                      @Override
                      public void onResponse(String jsonResponse) {
                          JSONObject response = null;
                          try {
                              Log.d("jsonResponse: ", jsonResponse);
                              response = new JSONObject(jsonResponse);
          
                          } catch (JSONException e) {
                              e.printStackTrace();
                          }
                          try {
                              if (response != null && response.has("statusmessage") && response.getBoolean("statusmessage")) {
                                  updateLocalRecord();
          
                              }
                          } catch (JSONException e) {
                              e.printStackTrace();
                          }
                          FugaDialog.dismiss();
                      }
          
                  }, files, params);
                  RequestQueue queue = Volley.newRequestQueue(this);
                  queue.add(multipartRequest);
          

          【讨论】:

            【解决方案7】:

            我可以推荐它使用 3 个依赖项的 Ion 库,您可以在这两个站点上找到所有三个 jar 文件:
            https://github.com/koush/ion#jars(离子和 androidasync)

            https://code.google.com/p/google-gson/downloads/list (gson)
            try {
               Ion.with(this, "http://www.urlthatyouwant.com/post/page")
               .setMultipartParameter("field1", "This is field number 1")
               .setMultipartParameter("field2", "Field 2 is shorter")
               .setMultipartFile("imagefile",
                    new File(Environment.getExternalStorageDirectory()+"/testfile.jpg"))
               .asString()
               .setCallback(new FutureCallback<String>() {
                    @Override
                    public void onCompleted(Exception e, String result) {
                         System.out.println(result);
                    }});
               } catch(Exception e) {
                 // Do something about exceptions
                    System.out.println("exception: " + e);
               }
            

            这将异步运行,一旦收到响应,回调将在 UI 线程中执行 我强烈建议你去https://github.com/koush/ion 了解更多信息

            【讨论】:

              【解决方案8】:

              MultiPartEntity弃用。所以这是新的方法!你只需要httpcore.jar(latest)httpmime.jar(latest)从Apache网站下载它们。

              try
              {
                  HttpClient client = new DefaultHttpClient();
                  HttpPost post = new HttpPost(URL);
              
                  MultipartEntityBuilder entityBuilder = MultipartEntityBuilder.create();
                  entityBuilder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);
              
                  entityBuilder.addTextBody(USER_ID, userId);
                  entityBuilder.addTextBody(NAME, name);
                  entityBuilder.addTextBody(TYPE, type);
                  entityBuilder.addTextBody(COMMENT, comment);
                  entityBuilder.addTextBody(LATITUDE, String.valueOf(User.Latitude));
                  entityBuilder.addTextBody(LONGITUDE, String.valueOf(User.Longitude));
              
                  if(file != null)
                  {
                      entityBuilder.addBinaryBody(IMAGE, file);
                  }
              
                  HttpEntity entity = entityBuilder.build();
                  post.setEntity(entity);
                  HttpResponse response = client.execute(post);
                  HttpEntity httpEntity = response.getEntity();
                  result = EntityUtils.toString(httpEntity);
                  Log.v("result", result);
              }
              catch(Exception e)
              {
                  e.printStackTrace();
              }
              

              【讨论】:

              • +1 用于使用 Builder,因为不推荐使用直接实例化。
              • 这个答案为我节省了大量时间。谢谢!
              • @muhammad babar 你能告诉我如果我想使用MultipartEntityBuilder上传多张图片吗?
              • 在循环中,然后entityBuilder.addBinaryBody(key, file); 确保密钥是唯一的。
              • 使用 compile 'org.apache.httpcomponents:httpmime:4.3.4' compile 'org.apache.httpcomponents:httpcore:4.3.2' 获取 android studio 依赖项
              【解决方案9】:

              我强烈推荐 Loopj。

              我已经成功地使用它一次上传多个文件,包括不同的 mime 类型。只需这样做:

              File myVideo = new File("/path/to/myvideo.mp4");
              File myPic = new File("/path/to/mypic.jpg");
              RequestParams params = new RequestParams();
              try {
                params.put("profile_picture", myPic);
                params.put("my_video", myVideo);
              } catch(FileNotFoundException e) {}
              

              对于大文件或很多文件,您可能必须增加超时量,否则使用可能太短的默认超时:

              client.setTimeout(500000) //make this the appropriate timeout in milliseconds
              

              请参阅此链接以获取有关 loopj 的完整描述以及如何使用它,这是迄今为止我遇到的最简单的异步 http 库:

              http://loopj.com/android-async-http/ http://loopj.com/android-async-http/doc/com/loopj/android/http/AsyncHttpClient.html

              【讨论】:

                【解决方案10】:

                2014 年 4 月 29 日更新:

                我的回答现在有点老了,我猜你宁愿使用某种高级库,例如Retrofit


                基于此博客,我提出了以下解决方案: http://blog.tacticalnuclearstrike.com/2010/01/using-multipartentity-in-android-applications/

                您必须下载其他库才能让MultipartEntity 运行!

                1) 从http://james.apache.org/download.cgi#Apache_Mime4J 下载 httpcomponents-client-4.1.zip 并将 apache-mime4j-0.6.1.jar 添加到您的项目中。

                2) 从http://hc.apache.org/downloads.cgi 下载 httpcomponents-client-4.1-bin.zip 并将 httpclient-4.1.jar、httpcore-4.1.jar 和 httpmime-4.1.jar 添加到您的项目中。

                3) 使用下面的示例代码。

                private DefaultHttpClient mHttpClient;
                
                
                public ServerCommunication() {
                    HttpParams params = new BasicHttpParams();
                    params.setParameter(CoreProtocolPNames.PROTOCOL_VERSION, HttpVersion.HTTP_1_1);
                    mHttpClient = new DefaultHttpClient(params);
                }
                
                
                public void uploadUserPhoto(File image) {
                
                    try {
                
                        HttpPost httppost = new HttpPost("some url");
                
                        MultipartEntity multipartEntity = new MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE);  
                        multipartEntity.addPart("Title", new StringBody("Title"));
                        multipartEntity.addPart("Nick", new StringBody("Nick"));
                        multipartEntity.addPart("Email", new StringBody("Email"));
                        multipartEntity.addPart("Description", new StringBody(Settings.SHARE.TEXT));
                        multipartEntity.addPart("Image", new FileBody(image));
                        httppost.setEntity(multipartEntity);
                
                        mHttpClient.execute(httppost, new PhotoUploadResponseHandler());
                
                    } catch (Exception e) {
                        Log.e(ServerCommunication.class.getName(), e.getLocalizedMessage(), e);
                    }
                }
                
                private class PhotoUploadResponseHandler implements ResponseHandler<Object> {
                
                    @Override
                    public Object handleResponse(HttpResponse response)
                            throws ClientProtocolException, IOException {
                
                        HttpEntity r_entity = response.getEntity();
                        String responseString = EntityUtils.toString(r_entity);
                        Log.d("UPLOAD", responseString);
                
                        return null;
                    }
                
                }
                

                【讨论】:

                • 我在 Android 中找不到 MultipartEntity 和 HttpMultipartClient 库。你能帮帮我吗?
                • 这是正确答案。很遗憾这个类没有包含在 Android SDK 中。
                • 为什么需要apache-mime4j-0.6.1.jar?
                • 任何正在寻找现在第一组文件的人都在这里:psg.mtu.edu/pub/apache//james/mime4j
                • 感谢您的解决方案。但是,MultipartEntity 现在已弃用。这篇文章可能会指导那些希望使用MultipartEntityBuilder 的人:stackoverflow.com/a/19188010/1276636
                【解决方案11】:

                更简单、更轻便 (32k) 和更多性能:

                Android 异步 Http 客户端库:http://loopj.com/android-async-http/

                实施:

                How to send a “multipart/form-data” POST in Android with Volley

                【讨论】:

                • loopj asynchttpclient 库很棒。但是,如果您想一次上传多个文件,它会失败:S
                • @Perroloco,您可能必须增加超时量才能成功处理大/多个文件。默认超时量可能太低。您是否尝试过更长的超时时间?因为我已经成功地一次用loopj发送了多个文件......
                • thanx @Chris,我试过了,但还是失败了。我通过执行多个请求来管理它。
                • loopj 没有选项显示进度但上传文件非常好
                • 感谢@Hpsatum 过去 6 小时的搜索,效果很好!!
                【解决方案12】:

                试试这个:

                    public void SendMultipartFile() {
                    Log.d(TAG, "UPLOAD: SendMultipartFile");
                    DefaultHttpClient httpclient = new DefaultHttpClient();
                    HttpPost httppost = new HttpPost( <url> );
                
                    File file = new File("/sdcard/spider.jpg");
                
                    Log.d(TAG, "UPLOAD: setting up multipart entity");
                
                    MultipartEntity mpEntity = new MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE);
                    Log.d(TAG, "UPLOAD: file length = " + file.length());
                    Log.d(TAG, "UPLOAD: file exist = " + file.exists());
                
                    try {
                        mpEntity.addPart("datafile", new FileBody(file, "application/octet"));
                        mpEntity.addPart("id", new StringBody("1"));
                    } catch (UnsupportedEncodingException e1) {
                        Log.d(TAG, "UPLOAD: UnsupportedEncodingException");
                        e1.printStackTrace();
                    }
                
                    httppost.setEntity(mpEntity);
                    Log.d(TAG, "UPLOAD: executing request: " + httppost.getRequestLine());
                    Log.d(TAG, "UPLOAD: request: " + httppost.getEntity().getContentType().toString());
                
                
                    HttpResponse response;
                    try {
                        Log.d(TAG, "UPLOAD: about to execute");
                        response = httpclient.execute(httppost);
                        Log.d(TAG, "UPLOAD: executed");
                        HttpEntity resEntity = response.getEntity();
                        Log.d(TAG, "UPLOAD: respose code: " + response.getStatusLine().toString());
                        if (resEntity != null) {
                            Log.d(TAG, "UPLOAD: " + EntityUtils.toString(resEntity));
                        }
                        if (resEntity != null) {
                            resEntity.consumeContent();
                        }
                    } catch (ClientProtocolException e) {
                        e.printStackTrace();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
                

                【讨论】:

                • 这需要像前面的例子一样的 3rd 方库
                • 使用 compile 'org.apache.httpcomponents:httpmime:4.3.4' compile 'org.apache.httpcomponents:httpcore:4.3.2' 获取 android studio 依赖项
                猜你喜欢
                • 2016-05-22
                • 2017-05-26
                • 1970-01-01
                • 1970-01-01
                • 2017-03-05
                • 1970-01-01
                • 1970-01-01
                • 2016-11-11
                • 1970-01-01
                相关资源
                最近更新 更多