volley不解释了吧, android 官方的一个网络请求库.
源码的地址在:
[email protected]:com314159/volleymultipartrequest.git
上面的是ssh
以下的是http地址
https://github.com/com314159/volleymultipartrequest
是依据
https://github.com/smanikandan14/volley-demo
这位大神改动而来的, 可是那位大神的代码有bug, 上传文件不成功.
注: 我的demo里面还集成了okhttp, 不须要的同学不用理这个类就可以
实现方法:
1.加入三个jar包,
httpcore-4.3.2.jar
httpclient-4.3.5.jar
httpmime-4.3.5.jar
2.实现multipartstack
> request,
map<string, string> additionalheaders) throws ioexception, authfailureerror {
if(!(request instanceof multipartrequest)) {
return super.performrequest(request, additionalheaders);
}
else {
return performmultipartrequest(request, additionalheaders);
private static void addheaders(httpurirequest httprequest, map<string, string> headers) {
for (string key : headers.keyset()) {
httprequest.setheader(key, headers.get(key));
public httpresponse performmultipartrequest(request<?
map<string, string> additionalheaders) throws ioexception, authfailureerror {
httpurirequest httprequest = createmultipartrequest(request, additionalheaders);
addheaders(httprequest, additionalheaders);
addheaders(httprequest, request.getheaders());
httpparams httpparams = httprequest.getparams();
int timeoutms = request.gettimeoutms();
// todo: reevaluate this connection timeout based on more wide-scale
// data collection and possibly different for wifi vs. 3g.
httpconnectionparams.setconnectiontimeout(httpparams, 5000);
httpconnectionparams.setsotimeout(httpparams, timeoutms);
/* make a thread safe connection manager for the client */
httpclient httpclient = new defaulthttpclient(httpparams);
return httpclient.execute(httprequest);
static httpurirequest createmultipartrequest(request<?> request,
map<string, string> additionalheaders) throws authfailureerror {
switch (request.getmethod()) {
case method.deprecated_get_or_post: {
// this is the deprecated way that needs to be handled for backwards compatibility.
// if the request's post body is null, then the assumption is that the request is
// get. otherwise, it is assumed that the request is a post.
byte[] postbody = request.getbody();
if (postbody != null) {
httppost postrequest = new httppost(request.geturl());
if(request.getbodycontenttype() != null)
postrequest.addheader(header_content_type, request.getbodycontenttype());
httpentity entity;
entity = new bytearrayentity(postbody);
postrequest.setentity(entity);
return postrequest;
} else {
return new httpget(request.geturl());
case method.get:
case method.delete:
return new httpdelete(request.geturl());
case method.post: {
setmultipartbody(postrequest,request);
case method.put: {
httpput putrequest = new httpput(request.geturl());
putrequest.addheader(header_content_type, request.getbodycontenttype());
setmultipartbody(putrequest,request);
return putrequest;
// added in source code of volley libray.
case method.patch: {
httppatch patchrequest = new httppatch(request.geturl());
patchrequest.addheader(header_content_type, request.getbodycontenttype());
return patchrequest;
default:
throw new illegalstateexception("unknown request method.");
/**
* if request is multipartrequest type, then set multipartentity in the
* httprequest object.
*
* @param httprequest
* @param request
* @throws authfailureerror
*/
private static void setmultipartbody(httpentityenclosingrequestbase httprequest,
request<?> request) throws authfailureerror {
// return if request is not multipartrequest
if (!(request instanceof multipartrequest)) {
return;
// multipartentity multipartentity = new
// multipartentity(httpmultipartmode.browser_compatible);
multipartentitybuilder builder = multipartentitybuilder.create();
/* example for setting a httpmultipartmode */
builder.setmode(httpmultipartmode.browser_compatible);
// iterate the fileuploads
map<string, file> fileupload = ((multipartrequest) request).getfileuploads();
for (map.entry<string, file> entry : fileupload.entryset()) {
builder.addpart(((string) entry.getkey()), new filebody((file) entry.getvalue()));
contenttype contenttype = contenttype.create(http.plain_text_type, http.utf_8);
// iterate the stringuploads
map<string, string> stringupload = ((multipartrequest) request).getstringuploads();
for (map.entry<string, string> entry : stringupload.entryset()) {
try {
builder.addpart(((string) entry.getkey()),
new stringbody((string) entry.getvalue(), contenttype));
} catch (exception e) {
e.printstacktrace();
httprequest.setentity(builder.build());
3. 实现multipartrequest, 这个接口是为了方便扩展
3.用法和volley原生的request的用法是一样的, 仅仅是要使用新的stack, 如以下的是put的方法的用法. 假设是post, 就改动成post方法就能够了