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币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
Android 发送HTTP GET POST 请求以及通过 MultipartEntityBuilder 上传文件(二)
Android 发送HTTP GET POST 请求以及通过 MultipartEntityBuilder 上传文件第二版 上次粗略的写了相同功能的代码,这次整理修复了之前的一些BUG,应用更加方便点 http://blog.csdn.net/zhouzme/article/details/18940279 直接上代码了: ZHttpRequset.java packag
Android 发送HTTP GET POST 请求以及通过 MultipartEntityBuilder 上传文件
折腾了好几天的 HTTP 终于搞定了,经测试正常,不过是初步用例测试用的,因为后面还要修改先把当前版本保存在博客里吧。 其中POST因为涉及多段上传需要导入两个包文件,我用的是最新的 httpmine4.3 发现网上很多 MultipartEntity 相关的文章都是早起版本的,以前的一些方法虽然还可用,但新版本中已经不建议使用了,所以全部使用新的方式 MultipartEntityBuilde
HttpClient 4.3.6 使用MultipartEntityBuilder实现类似form表单提交方式的文件上传
最近在做 Android 端文件上传,要求采用 form 表单的方式提交,项目使用的 afinal 框架有文件上传功能,但是始终无法与php写的服务端对接上,无法上传成功。读源码发现:afinal 使用了某大神写的 MultipartEntity.java 生成 form 表单内容,然而生成的内容格式不够标准,而且还存在诸多问题,如:首先将所有文件读入到内存,再生成字节流写入到 socket。
HttpClient MultipartEntityBuilder 上传文件
http://blog.csdn.net/yan8024/article/details/46531901 http://www.51testing.com/html/56/n-3707756.html  在HttpCient4.3之后上传文件主要使用的类是位于org.apache.http.entity.mime下的MultipartEntityBuilder(原先的Mu
HttpClient使用MultipartEntityBuilder实现多文件上传
一、MultipartEntityBuilder 实现文件上传步骤    在HttpCient4.3之后上传文件主要使用的类是位于org.apache.http.entity.mime下的MultipartEntityBuilder(原先的MultipartEntity已经基本弃用了)基本实现步骤如下:    1.设置上传的模式;   setMode(HttpMultipartM
HTTPCLIENT MultipartEntity 上传中文乱码
在使用MultipartEntity混合上传,有文件和有文本字段的时候,文本字段会出现乱码,解决方法如下: HttpPost post=new HttpPost(url); //准备builder MultipartEntityBuilder builder =MultipartEntityBuilder.create(); //首先创建一个contentType声明上传字段的数据类型和编
MultipartEntity上传文件时传递中文参数出现乱码的解决方案
最近项目中有个模块需要上传多张图片,在传递每个文件的文件名字的时候,服务端收到的中文是乱码,经检查发现双方都是utf-8,各种调试之后,我把问题定位到MultipartEntity的设置上面,最终找到解决方案,就是设置HttpMultipartMode为浏览器兼容模式,即: MultipartEntity entity = new MultipartEntity(HttpMultipartM
使用MultipartEntity上传图片文件
自己写一个MultipartEntity:public class MultipartEntity {private final static char[]
httpmime-4.5
使用Android SDK中的HttpClient 和 MultipartEntityBuilder上传文件
使用MultipartEntity对文字、图片、视频进行综合上传
package com.home.upload; import java.io.File; import java.nio.charset.Charset; import java.util.ArrayList; import java.util.List; import org.apache.http.HttpResponse; import org.apache.http.