2 u012272728 u012272728 于 2014.07.27 17:58 提问

android 文件上传问题,使用MultipartEntityBuilder

android端:
String BOUNDARY= UUID.randomUUID().toString();
boolean hasModifySuccess=false;
String fileName = "contact_0.jpg";
try{
httpClient = new DefaultHttpClient();
post = new HttpPost(path);
post.setHeader("Content-Type","multipart/form-data;boundary="

+ BOUNDARY);
MultipartEntityBuilder builder = MultipartEntityBuilder.create();
builder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);
builder.setCharset(Charset.forName("UTF-8"));
File dirFile=Environment.getExternalStorageDirectory();
File newFile=new File(dirFile.getAbsolutePath()+"/InteCogeFiles/images"+fileName);
FileBody fileBody = new FileBody(newFile);
builder.addPart("image", fileBody);
HttpEntity httpEntity = builder.build();

post.setEntity(httpEntity);
response = httpClient.execute(post);
if(response.getStatusLine().getStatusCode()==HttpStatus.SC_OK){
inStream = response.getEntity().getContent();
hasModifySuccess = true;
}
}catch(Exception e){
e.printStackTrace();
}

服务端:
request.setCharacterEncoding("utf-8");
DiskFileItemFactory factory = new DiskFileItemFactory();

//获取文件上传需要保存的路径,upload文件夹需存在。

String path = request.getSession().getServletContext().getRealPath("/upload");

//设置暂时存放文件的存储室,这个存储室可以和最终存储文件的文件夹不同。因为当文件很大的话会占用过多内存所以设置存储室。

factory.setRepository(new File(path));

//设置缓存的大小,当上传文件的容量超过缓存时,就放到暂时存储室。

factory.setSizeThreshold(1024*1024);

//上传处理工具类(高水平API上传处理?)

String error = "";
ServletFileUpload upload = new ServletFileUpload(factory);

try{

//调用 parseRequest(request)方法 获得上传文件 FileItem 的集合list 可实现多文件上传。
List items = upload.parseRequest(request);
System.out.print(items.size());
int maxSize=50*1024*1024;
Iterator itr = items.iterator();// 枚举方法
while (itr.hasNext()) {
FileItem item = (FileItem) itr.next(); //获取FileItem对象
if (!item.isFormField()) {// 判断是否为文件域
if (item.getName() != null && !item.getName().equals("")) {// 判断是否选择了文件
long upFileSize=item.getSize(); //上传文件的大小
String fileName=item.getName(); //获取文件名
System.out.print("nihao");
//System.out.println("上传文件的大小:" + item.getSize());
if(upFileSize>maxSize){
error="您上传的文件太大,请选择不超过50M的文件";
break;
}
// 此时文件暂存在服务器的内存中
File tempFile = new File(fileName);// 构造临时对象
String uploadPath = this.getServletContext().getRealPath("/upload");
File file = new File(uploadPath,tempFile.getName()); // 获取根目录对应的真实物理路径
InputStream is=item.getInputStream();
int buffer=1024; //定义缓冲区的大小
int length=0;
byte[] b=new byte[buffer];
double percent=0;
FileOutputStream fos=new FileOutputStream(file);
while((length=is.read(b))!=-1){
percent+=length/(double)upFileSize*100D; //计算上传文件的百分比
fos.write(b,0,length); //向文件输出流写读取的数据

                        }
                        fos.close();
                            Thread.sleep(1000);     //线程休眠1秒
                    } else {
                        error="没有选择上传文件!";
                    }
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
            error = "上传文件出现错误:" + e.getMessage();
        }
        if (!"".equals(error)) {
            request.setAttribute("error", error);
        }else {
            request.setAttribute("result", "文件上传成功!");
        }

在服务端中 List items = upload.parseRequest(request);一直为空,没有数据,而我用网页

这样是可以在可以上传图片的。
可能是android端出了问题,因为MultipartEntityBuilder 网上的资料很少,不知道哪里出现了问题,这里跪求大神帮忙解决问题。万分感谢!

1个回答

wangyaninglm
wangyaninglm   Ds   Rxr 2015.01.20 11:21
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!