天天看点

android Volley 上传文件上传图片

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方法就能够了