文件上传


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"));
}
}

更多相关文章

  1. android apk安装原理分析
  2. android四层框架
  3. Flutter 解决webview_flutter 插件Android端无法上传文件问题
  4. 手把手教您-将Android的Camera源码导入到eclipse中进行开发
  5. Android中怎么使图片显示
  6. Android数据存储方案ContentProvider存储数据
  7. 使用Android内部的DownloadProvider下载文件,并获取cache权限
  8. NPM 和webpack 的基础使用
  9. 【阿里云镜像】使用阿里巴巴DNS镜像源——DNS配置教程

随机推荐

  1. android: 大量开源项目源代码分享
  2. Android平台开发-Android(安卓)keypad ma
  3. Android(安卓)获取已经安装的程序
  4. Android(安卓)逐帧动画的小例子
  5. 设置环境变量
  6. Android(安卓)新手摸石头过河
  7. Android(安卓)点击空白处隐藏键盘
  8. Android出现adb device offline
  9. Android(安卓)kernel 下载编译笔记
  10. Transport endpoint is not connected 报