Volly 不提供使用多部分在服务器上上传文件的直接方式。
要使用 volly 上传多个文件,请按照以下步骤操作:
第 1 步: 创建一个名为 MultipartRequest.java 的新类,它从 volly 扩展 Request,如下所示:
import com.android.volley.AuthFailureError;
import com.android.volley.NetworkResponse;
import com.android.volley.ParseError;
import com.android.volley.Request;
import com.android.volley.Response;
import com.android.volley.VolleyLog;
import com.android.volley.toolbox.HttpHeaderParser;
import org.apache.http.HttpEntity;
import org.apache.http.entity.mime.MultipartEntityBuilder;
import org.apache.http.entity.mime.content.FileBody;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.HashMap;
import java.util.Map;
public class MultipartRequest extends Request<String> { private MultipartEntityBuilder entitybuilder = MultipartEntityBuilder.create(); HttpEntity entity;
private HashMap<String, File> sendFile = new HashMap<>();
/**
*
* @param url url
* @param errorListener volly error listenere
* @param sendFile HashMap with key as file name and value as file object
*/
public MultipartRequest(String url, Response.ErrorListener errorListener, HashMap<String, File> sendFile) {
super(Method.POST, url, errorListener);
this.sendFile = sendFile;
buildMultipartEntity();
entity = entitybuilder.build();
}
private void buildMultipartEntity() {
if (sendFile != null)
for (Map.Entry<String, File> entry : sendFile.entrySet()) {
entitybuilder.addPart(entry.getKey(), new FileBody(entry.getValue()));
// here you can set key as filename
// value will be the file object to be upload
}
}
@Override
public String getBodyContentType() {
return entity.getContentType().getValue();
}
@Override
public byte[] getBody() throws AuthFailureError {
ByteArrayOutputStream bos = new ByteArrayOutputStream();
try {
entity.writeTo(bos);
} catch (IOException e) {
VolleyLog.e("IOException writing to ByteArrayOutputStream");
}
return bos.toByteArray();
}
@Override
protected Response<String> parseNetworkResponse(NetworkResponse networkResponse) {
try {
String json = new String(
networkResponse.data, HttpHeaderParser.parseCharset(networkResponse.headers));
return Response.success(json, HttpHeaderParser.parseCacheHeaders(networkResponse));
} catch (UnsupportedEncodingException e) {
return Response.error(new ParseError(e));
}
}
@Override
protected void deliverResponse(String s) {
//Your response
}
}
第 2 步:
来自您的活动:
public void executeMultipart(String url,HashMap<String, File> fileData) {
try { MultipartRequest mRequest = new MultipartRequest(url , new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError volleyError) {
}
},fileData);
mRequest.setRetryPolicy(new DefaultRetryPolicy(
(int) TimeUnit.SECONDS.toMillis(20),
DefaultRetryPolicy.DEFAULT_MAX_RETRIES,
DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
} catch (Exception e) {
e.printStackTrace();
}
}
第 3 步:在您的应用 build.gradle 文件中添加:
compile('org.apache.httpcomponents:httpmime:4.3.6') { exclude module: 'httpclient' }
注意:从 API 22 开始,org.apache.http.HttpEntity 已被弃用,因此最好使用 URLConnection 或者您可以使用改造库,两者各有优缺点