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
原创粉丝点击