问题描述
- 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 网上的资料很少,不知道哪里出现了问题,这里跪求大神帮忙解决问题。万分感谢!
解决方案
http://www.mamicode.com/info-detail-247544.html