文件上传

android中的文件上传使用的是post的提交方式。
通过httpwatcher抓一个文件上传时的包,可以更加好的明白下面的代码

//调用此方法时需要传递用户名,密码,文件路径

文件上传时,上传的内容一般分为两部分,一部分是普通字段,另一部分就是真正要上传的内容
下面通过注释对改程序的每行进行解释

android客户端代码:
public boolean upload(String username, String password, String filepath) throws Exception {
String boundary = "---------------------------7db1c523809b2"; // 分割线
File file = new File(filepath); // 要上传的文件 
Uri uri = Uri.parse(address); // 用来解析主机名和端口
URL url = new URL(address); // 用来开启连接 
StringBuilder sb = new StringBuilder(); // 用来拼装请求

// username字段
sb.append("--" + boundary + "\r\n");
sb.append("Content-Disposition: form-data; name=\"username\"" + "\r\n");
sb.append("\r\n");
sb.append(username + "\r\n");

// password字段
sb.append("--" + boundary + "\r\n");
sb.append("Content-Disposition: form-data; name=\"password\"" + "\r\n");
sb.append("\r\n");
sb.append(password + "\r\n");

// 文件部分
sb.append("--" + boundary + "\r\n");
sb.append("Content-Disposition: form-data; name=\"file\"; filename=\"" + filepath + "\"" + "\r\n");
sb.append("Content-Type: application/octet-stream" + "\r\n");
sb.append("\r\n");

// 将开头和结尾部分转为字节数组,因为设置Content-Type时长度是字节长度
byte[] before = sb.toString().getBytes("UTF-8");
byte[] after = ("\r\n--" + boundary + "--\r\n").getBytes("UTF-8");

// 打开连接, 设置请求头
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setConnectTimeout(3000);
conn.setRequestMethod("POST");
conn.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + boundary);
conn.setRequestProperty("Content-Length", before.length + file.length() + after.length + "");
conn.setRequestProperty("HOST", uri.getHost() + ":" + uri.getPort()); // 192.168.1.100:8080
conn.setDoOutput(true);

// 获取输入输出流
OutputStream out = conn.getOutputStream();
FileInputStream fis = new FileInputStream(file);

// 将开头部分写出
out.write(before);

// 写出文件数据
byte[] buf = new byte[1024];
int len;
while ((len = fis.read(buf)) != -1)
out.write(buf, 0, len);

// 将结尾部分写出
out.write(after);

fis.close();
out.close();
return conn.getResponseCode() == 200;
}

//javaweb服务器端代码,方便理解

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
System.out.println("POST:");

boolean isMultipart = ServletFileUpload.isMultipartContent(request);
if (isMultipart) {
try {
FileItemFactory factory = new DiskFileItemFactory();
ServletFileUpload upload = new ServletFileUpload(factory);
List<FileItem> items = upload.parseRequest(request); // 从request中解析出若干表单项
Iterator<FileItem> iter = items.iterator();
while (iter.hasNext()) { // 遍历每一个表单项
   FileItem item = iter.next();
   if (item.isFormField()) { // 如果是普通字段
    String fieldName = item.getFieldName(); // 获取字段名(name)
       String value = item.getString(); // 获取字段值(value)
       System.out.println(fieldName + " = " + value);
   } else { // 不是普通字段, 就是上传文件
    String fieldName = item.getFieldName(); // 获取字段名(name)
       String fileName = new File(item.getName()).getName(); // 获取上传文件的文件名(有些浏览器可能会带着路径)
       System.out.println(fieldName + " = " + fileName);
       File uploadedFile = new File("F:/Upload", fileName); // 在Upload文件夹中创建文件
       item.write(uploadedFile); // 写出数据
   }
}
} catch (Exception e) {
e.printStackTrace();
}
} else {
System.out.println("username = " + request.getParameter("username"));
System.out.println("password = " + request.getParameter("password"));
}
}

android之文件上传相关推荐

  1. 【Android】文件上传

    Android实现文件上传(图片上传) http接口封装 文件上传工具类 页面调用处理 http接口封装 首先是根据自己选用的网络框架进行文件上传的接口封装 @Multipart@POST(" ...

  2. Android 实现文件上传功能(upload)

    文 件上传在B/S应用中是一种十分常见的功能,那么在Android平台下是否可以实现像B/S那样的文件上传功能呢?答案是肯定的.下面是一个模拟网站程 序上传文件的例子.这里只写出了Android部分的 ...

  3. android批量文件上传(android批量图片上传)

    项目中多处用到文件批量上传功能,今天正好解决了此问题,在此写出来,以便日后借鉴. 首先,以下架构下的批量文件上传可能会失败或者不会成功:1.android客户端+springMVC服务端:服务端采用o ...

  4. Android开发文件上传格式,(android开发)使用okhttp上传文件

    开发android手机客户端,常常会需要上传文件到服务器,比如:你手机里的照片. 使用okhttp会是一个很好的选择.它使用很简单,而且运行效率也很高. 首先,在 app/build.gradle 的 ...

  5. android多文件上传错误,微信多图上传解决android多图上传失败问题

    微信提供了文件上传的方法wx.uploadFile来上传我们的图片 wx.chooseImage({ success: function(res) { var tempFilePaths = res. ...

  6. android http文件上传,Android Http文件上传方法和实践

    文件上传在应用中是比较常用的的一种功能,比如用户的意见反馈功能.用户可以上传图片,音视频等文件,方便用户反馈问题的情况. 下来我将和大家一起梳理下需要掌握的知识,少走弯路一步到位,实现文件上传功能. ...

  7. php 上传sb2,基于标准的http来实现Android多文件上传

    实现多文件的上传,基于标准的http来实现. 多文件上传MyUploader类的实现: /** * * 同步上传多个文件 * 基于标准的http实现,需要在非UI线程中调用,以免阻塞UI. * */ ...

  8. android多文件上传错误,在Android中上传大文件而不会出现内存错误

    你尝试过使用过吗? con.setChunkedStreamingMode(1024); 这将帮助您将数据块化为特定大小,这样您就不必将整个文件保留在内存中. 更新: 尝试使用以下方法.我使用此方法上 ...

  9. android模拟器上传,电脑文件怎么传到夜神android模拟器 文件上传夜神模拟器

    电脑传模拟器文件方法: 方法一: 直接拖拽电脑中任意文件到模拟器主界面中,即可跳出如图所示: 例:点击移动后变蓝色的窗口按钮直接点击打开手机文件夹按钮,在文件夹内安装或移动即可: 方法二: ①点击模拟 ...

最新文章

  1. 简明python教程 --C++程序员的视角(六):输入输出IO
  2. Boost:使用mapd_view类将数字数组映射到设备内存
  3. 敏捷个人:提供更多文档下载,并转载一篇敏捷个人读书笔记
  4. unity3d android 后台运行,unity3d发布apk在android虚拟机中运行的详细步骤(unity3d导出android...
  5. arm7 键盘扫描程序
  6. Beta冲刺提交-星期五
  7. 容器技术Docker K8s 32 容器服务ACK基础与进阶-弹性伸缩
  8. chartControl控件常用属性总结
  9. PDCA过程模式在信息安全管理体系的应用
  10. 如果将网络工程师分级你是那个级别?
  11. 建立U盘免疫病毒文件
  12. 咦,我发现了微信的一个秘密
  13. 计算机网络中属于资源子网的是,属于计算机网络的资源子网
  14. 机器学习项目中不可忽视的一个密辛 - 大数定理、中心极限定理
  15. 【Seedlabs】Local DNS Attack Lab
  16. 神州优车粗暴裁员:人与人之间最起码的尊重呢?
  17. Web前端 学习笔记6(浮动)
  18. 思绪——关于《朝花夕誓——于离别之朝束起约定之花》
  19. 怎样使用快捷键在苹果Mac上强制退出应用程序?
  20. 离线安装docker-compose

热门文章

  1. Linux for pogoplug pro 安装指导手册
  2. CUMT学习日记——Verilog课程学习全记录
  3. 简易版------打砖块
  4. ONVIF局域网搜索工具
  5. 2007-2008年中国十大平面设计公司排名
  6. 12864c语言接温度计,单片机万年历+温度计+12864LCD液晶显示 仿真+程序
  7. 查找薪水变动超过15次的员工号emp_no以及其对应的变动次数t
  8. 日本规定宠物需植入芯片,防止饲主遗弃虐待 违者最长监禁4年。
  9. 百度之星1002——模拟——列变位法解密
  10. Linux中fork()系统调用创建两个子进程