android 文件上传问题,使用MultipartEntityBuilder

问题描述

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

时间: 2024-10-29 12:08:27

android 文件上传问题,使用MultipartEntityBuilder的相关文章

简单实现Android文件上传_Android

文件上传在B/S应用中是一种十分常见的功能,那么在Android平台下是否可以实现像B/S那样的文件上传功能呢?答案是肯定的.下面是一个模拟网站程序上传文件的例子. 首先新建一个Android工程,新建主启动Activity: MainActivity.java: package com.xzq.upload; import java.io.DataOutputStream; import java.io.FileInputStream; import java.io.InputStream;

android文件上传示例分享(android图片上传)_Android

主要思路是调用系统文件管理器或者其他媒体采集资源来获取要上传的文件,然后将文件的上传进度实时展示到进度条中. 主Activity 复制代码 代码如下: package com.guotop.elearn.activity.app.yunpan.activity; import java.io.File;import java.io.FileNotFoundException;import java.io.IOException; import android.app.Activity;impor

简单实现Android文件上传

文件上传在B/S应用中是一种十分常见的功能,那么在Android平台下是否可以实现像B/S那样的文件上传功能呢?答案是肯定的.下面是一个模拟网站程序上传文件的例子. 首先新建一个Android工程,新建主启动Activity: MainActivity.java: package com.xzq.upload; import java.io.DataOutputStream; import java.io.FileInputStream; import java.io.InputStream;

android文件上传示例分享(android图片上传)

主要思路是调用系统文件管理器或者其他媒体采集资源来获取要上传的文件,然后将文件的上传进度实时展示到进度条中. 主Activity 复制代码 代码如下:package com.guotop.elearn.activity.app.yunpan.activity; import java.io.File;import java.io.FileNotFoundException;import java.io.IOException; import android.app.Activity;import

android-Android 文件上传出错服务器却可以得到数据

问题描述 Android 文件上传出错服务器却可以得到数据 用的AsyncHttpClient 文件上传时报错:org.apache.http.client.httpresponseExcrption:not found 但是服务器那边可以得到数据

跨域-xmlrequest文件上传 进度

问题描述 xmlrequest文件上传 进度 XMLrequest 跨域文件上传 上传可以跨域 进度不能跨域 大神们 求指点办法 解决方案 android 文件上传 进度框 解决方案二: onprogress 无效?能传获取进度应该不是问题才对XMLHttpRequest Level 2新特性介绍 xhr.upload.onprogress = updateProgress; function updateProgress(event) { if (event.lengthComputable)

Android使用HttpClient实现文件上传到PHP服务器,并监控进度条

上传 服务器端PHP 代码如下 : <?php $target_path = "./tmp/";//接收文件目录 $target_path = $target_path.($_FILES['file']['name']); $target_path = iconv("UTF-8","gb2312", $target_path); if(move_uploaded_file($_FILES['file']['tmp_name'], $targ

酷盘Android版如何将手机本地文件上传至酷盘

  酷盘Android版将手机本地文件上传至酷盘的方法如下: ①选择上传文件的类型:在上传界面选择需要上传的文件类型,如照片.在"更多文件"中可以选择视频.音乐.文档等其他类型文件. ②选择需要上传的文件:可以同时选择多个文件.也可以通过右上角的"全选"按钮,将所有文件选中. ③选择上传位置:在文件选择界面下方显示文件上传位置.点击该区域可以进入位置选择界面,对上传位置进行设置. ④查看上传状态:可以在上传任务界面可以查看文件的上传状态,上传已完成的文件便可通过其他

android带进度的文件上传

http://blog.csdn.net/shinay/article/details/8472756 文章来自:http://toolongdidntread.com/android/android-multipart-post-with-progress-bar/ 文件上传可能是一个比较耗时的操作,如果为上传操作带上进度提示则可以更好的提高用户体验,最后效果如下图: 项目源码:http://download.csdn.net/detail/shinay/4965230 这里只贴出代码,可根据