Android Http模拟浏览器multipart/form-data多文件上传服务器

这里我引用一下网上其他一些大神的截图:

我的理解是简单点说文件的上传归根结底是数据的拼接,转化为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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值