数行代码实现利用Volley网络框架上传文件

jopen 9年前

首先自己写一个MultipartRequest类,继承自StringRequest。

import com.android.internal.http.multipart.Part;  import com.android.volley.AuthFailureError;  import com.android.volley.Response;  import com.android.volley.VolleyLog;  import com.android.volley.toolbox.StringRequest;    import java.io.ByteArrayOutputStream;  import java.io.IOException;    public class MultipartRequest extends StringRequest {      private Part[] parts;        public MultipartRequest(String url, Part[] parts, Response.Listener<String> listener, Response.ErrorListener errorListener) {          super(Method.POST, url, listener, errorListener);          this.parts = parts;      }        @Override      public String getBodyContentType() {          return "multipart/form-data; boundary=" + Part.getBoundary();      }        @Override      public byte[] getBody() throws AuthFailureError {          ByteArrayOutputStream baos = new ByteArrayOutputStream();          try {              Part.sendParts(baos, parts);          } catch (IOException e) {              VolleyLog.e(e, "error when sending parts to output!");          }          return baos.toByteArray();      }  }


重写了StringRequest中的getBody()和getBodyContentType()方法就可以了。

使用方法:

//构造参数列表  List<Part> partList = new ArrayList<Part>();  partList.add(new StringPart("username", "hellfire"));  partList.add(new StringPart("email", "ouyangjun@aliyun.com"));  try {      partList.add(new FilePart("photo", new File("/mnt/sdcard/Test/hellfire.jpg")));  } catch (FileNotFoundException e) {      e.printStackTrace();  }  //获取队列  RequestQueue requestQueue = Volley.newRequestQueue(this);  String url = "http://test/profileUpdate.do";  //生成请求  MultipartRequest profileUpdateRequest = new MultipartRequest(url, partList.toArray(new Part[partList.size()]), new Response.Listener<String>() {      @Override      public void onResponse(String response) {          //处理成功返回信息          String info = response.substring(0, 20);          Toast.makeText(getApplication(), info, Toast.LENGTH_SHORT).show();      }  }, new Response.ErrorListener() {      @Override      public void onErrorResponse(VolleyError error) {          //处理失败错误信息          Log.e("MultipartRequest", error.getMessage(), error);          Toast.makeText(getApplication(), error.getMessage(), Toast.LENGTH_SHORT).show();      }  });  //将请求加入队列  requestQueue.add(profileUpdateRequest);


来自: http://my.oschina.net/ggsddu/blog/601285