Android Http模拟浏览器multipart/form-data多文件上传服务器
来源:互联网 发布:拉爆淘宝首页流量 编辑:程序博客网 时间:2024/06/08 01:30
这里我引用一下网上其他一些大神的截图:
我的理解是简单点说文件的上传归根结底是数据的拼接,转化为2进制流传给服务器,对照截图,看代码
public class UploadUtil { private static final int TIME_OUT = 10 * 1000; //超时时间 private static final String CHARSET = "utf-8"; //设置编码 private static ImageSendDomain imageSendDomain; private static String result = null; static String BOUNDARY = UUID.randomUUID().toString(); //边界标识 随机生成 private static String PREFIX = "--", LINE_END = "\r\n"; static String CONTENT_TYPE = "multipart/form-data"; //内容类型 private static DataOutputStream dos = null; private static HttpURLConnection conn; public static int res; /** * android上传文件到服务器 * * @param pathList * @param files * @param RequestURL 请求的rul @return 返回响应的内容 */ public static String uploadFile(ArrayList<ImageItem> pathList, String RequestURL, FormFile[] files) { try { URL url = new URL(RequestURL); conn = (HttpURLConnection) url.openConnection(); conn.setReadTimeout(TIME_OUT); conn.setConnectTimeout(TIME_OUT); conn.setDoInput(true); //允许输入流 conn.setDoOutput(true); //允许输出流 conn.setUseCaches(false); //不允许使用缓存 conn.setRequestMethod("POST"); //请求方式 conn.setRequestProperty("Charset", CHARSET); //设置编码 conn.setRequestProperty("connection", "keep-alive"); conn.setRequestProperty("Content-Type", CONTENT_TYPE + ";boundary=" + BOUNDARY); conn.connect(); dos = new DataOutputStream(conn.getOutputStream()); for (FormFile file1 : files) { dos.writeBytes(PREFIX + BOUNDARY + LINE_END); dos.writeBytes("Content-Disposition: form-data; name=\"img\"; filename=\"" + file1.getFilname().substring(file1.getFilname().length() - 5, file1.getFilname().length()) + "\"" + LINE_END); dos.writeBytes("Content-Type: " + CONTENT_TYPE + " charset=" + CHARSET + LINE_END); dos.writeBytes(LINE_END); FileInputStream fStream = new FileInputStream(file1.getFile()); int bufferSize = 1024; byte[] buffer = new byte[bufferSize]; int length = -1; while ((length = fStream.read(buffer)) != -1) { dos.write(buffer, 0, length); } dos.writeBytes(LINE_END); fStream.close(); dos.writeBytes(PREFIX + BOUNDARY + LINE_END); } dos.writeBytes(PREFIX + BOUNDARY + PREFIX + LINE_END); dos.flush(); /** * 获取响应码 200=成功 * 当响应成功,获取响应的流 */ res = conn.getResponseCode(); if (res == 200) { InputStream input = conn.getInputStream(); StringBuffer sb1 = new StringBuffer(); int ss; while ((ss = input.read()) != -1) { sb1.append((char) ss); } result = sb1.toString(); Gson gson = new Gson(); imageSendDomain = gson.fromJson(result, ImageSendDomain.class); System.out.println(result); System.out.println(imageSendDomain.getErrCode()); return !imageSendDomain.getErrCode().equals("") ? imageSendDomain.getErrCode() : "-1"; } } catch (MalformedURLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return RequestURL; }}
在数据全部拼接完以后,结尾是“--”也就是代码中的PREFIX
dos.writeBytes(PREFIX + BOUNDARY + PREFIX + LINE_END);
文件之前需要有分割
dos.writeBytes(PREFIX + BOUNDARY + LINE_END);
如果说在添加一个文件后,直接加上PREFIX,很显然拼接结束,不会在后面拼接上其他文件,而是重新拼接。从而只能单文件。
ps:1、不要管上述代码中FormFile imageItem等是什么,知道文件路径就行了,file1.getFile是文件路径
2、如果说一次性上传的文件或图片过大的话,可能在上传的时候出现丢包或者中断,使用httpUrlConnection,内存过大也可能内存溢出等问题。
以上是我自己遇到的问题以及解决后的总结,说的有点简单,表达可能不是很合理,如果能理解,希望对有需要的朋友有所帮助吧,如果有问题,麻烦请指出,谢谢!!
阅读全文
0 0
- Android Http模拟浏览器multipart/form-data多文件上传服务器
- Http 上传文件之multipart form-data
- Python模拟浏览器上传文件脚本(Multipart/form-data格式)
- multipart/form-data多文件上传
- Android模拟 HTTP multipart/form-data 请求协议信息实现图片上传
- Android模拟 HTTP multipart/form-data 请求协议信息实现图片上传
- Android模拟 HTTP multipart/form-data 请求协议信息实现图片上传
- 在Android上通过模拟HTTP multipart/form-data请求协议信息实现图片上传
- 在 Android 上通过模拟 HTTP multipart/form-data 请求协议信息实现图片上传
- Android模拟 HTTP multipart/form-data 请求协议信息实现图片上传
- 在 Android 上通过模拟 HTTP multipart/form-data 请求协议信息实现图片上传
- Android模拟 HTTP multipart/form-data 请求协议信息实现图片上传
- 在 Android 上通过模拟 HTTP multipart/form-data 请求协议信息实现图片上传
- Android模拟 HTTP multipart/form-data 请求协议信息实现图片上传
- multipart/form-data 上传文件
- HTTP multipart/form-data格式之文件上传
- android向服务器上传multipart/form-data文件(upload using multipart post using httpclient in android)
- Http multipart/form-data多参数Post方式上传数据
- 第三周【项目4
- Java基础
- Hadoop环境搭建
- flask-restful获取当前页的访问路径
- 第四周项目3(1)——单链表应用
- Android Http模拟浏览器multipart/form-data多文件上传服务器
- 大数据第一天: linux里文本第一行一般为shell脚本解释器的路径
- 机器人学杂记
- 第三周 --顺序表 的基本运算
- SimHash , 用于文本的局部敏感哈希
- Java多线程系列--“JUC锁”09之 CountDownLatch原理和示例
- 汉语转拼音
- MaterialDrawer库的Gradle配置
- 使用Arrays.asList()需要注意的点