• HttpURLConnection下载文件,byte数组POST multipart/form-data


    查看POST multipart/form-data协议格式

    下载文件存到到字节数组并且POST multipart/form-data接口

    package com.http;
    
    import java.io.BufferedInputStream;
    import java.io.BufferedReader;
    import java.io.Closeable;
    import java.io.DataOutputStream;
    import java.io.File;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.io.OutputStream;
    import java.net.HttpURLConnection;
    import java.net.URL;
    import java.util.HashMap;
    import java.util.Iterator;
    import java.util.Map;
    
    public class HttpDownload {
        /**
         * 
         * @param  urlPath     下载路径
         * @param  downloadDir 下载存放目录
         * @return             返回下载文件
         */
        public static byte[] downloadFile(String urlPath, String downloadDir, String fileName) {
            BufferedInputStream in = null;
            OutputStream out = null;
            HttpURLConnection connection = null;
            try {
                URL url = new URL(urlPath);
                connection = (HttpURLConnection)url.openConnection();
                connection.setRequestMethod("GET");
                connection.setRequestProperty("Content-Type", "application/octet-stream;charset=utf-8");
                connection.setRequestProperty("Connection", "close");
                connection.setConnectTimeout(5000);
                connection.setDoOutput(true);
                connection.setDoInput(true);
                connection.connect();
    
                // 文件大小
                int fileLength = connection.getContentLength();
                System.out.println("file length-------------" + fileLength + " (byte)");
                in = new BufferedInputStream(connection.getInputStream());
                String path = downloadDir + File.separatorChar + fileName;
                // 下载文件到本地
                File file = new File(path);
                if (!file.getParentFile().exists()) {
                    file.getParentFile().mkdirs();
                }
                out = new FileOutputStream(file);
                int size = 0;
                int len = 0;
                byte[] buf = new byte[1024 * 1024];
                byte[] data = new byte[fileLength];
                int dataPos = 0;
                while ((size = in.read(buf)) != -1) {
                    len += size;
                    out.write(buf, 0, size);
                    for (int i = 0; i < size; i++) {
                        data[dataPos] = buf[i];
                        dataPos++;
                    }
                }
                System.out.println("download finish--" + fileLength + "," + len + "," + dataPos + " (byte)");
                return data;
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                close(in, out);
                closeConnection(connection);
            }
            return new byte[0];
        }
    
        public static String uploadFile(String actionUrl, Map<String, String> textMap, String filekey, byte[] data,
            String fileName) {
            String end = "
    ";
            String boundary = "----WebKitFormBoundaryLBFuobxXx0AmQVFR";
            DataOutputStream out = null;
            BufferedReader reader = null;
            HttpURLConnection connection = null;
            try {
                URL url = new URL(actionUrl);
                connection = (HttpURLConnection)url.openConnection();
                connection.setDoInput(true);
                connection.setDoOutput(true);
                connection.setUseCaches(false);
                connection.setRequestMethod("POST");
                connection.setRequestProperty("Connection", "close");
                connection.setRequestProperty("Charset", "utf-8");
                connection.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + boundary);
                out = new DataOutputStream(connection.getOutputStream());
    
                // 处理文本==============================
                String strData = "";
                if (textMap != null) {
                    Iterator<Map.Entry<String, String>> iter = textMap.entrySet().iterator();
                    while (iter.hasNext()) {
                        Map.Entry<String, String> entry = iter.next();
                        String name = (String)entry.getKey();
                        String value = (String)entry.getValue();
                        if (value == null) {
                            continue;
                        }
                        value = new String(value.getBytes("utf-8"));
                        strData = end + "--" + boundary + end;
                        System.out.println(strData);
                        out.writeBytes(strData);
                        strData = "Content-Disposition: form-data; name="" + name + """ + end + end + value;
                        System.out.println(strData);
                        out.writeBytes(strData);
                    }
                }
                // 处理文本结束==============================
                // 开始上传文件========================================
                strData = end + "--" + boundary + end;
                System.out.println(strData);
                out.writeBytes(strData);
                strData =
                    "Content-Disposition: form-data;" + " name="" + filekey + ""; filename="" + fileName + """ + end;
                System.out.println(strData);
                out.writeBytes(strData);
                strData = "Content-Type:" + " text/plain" + end + end;
                System.out.println(strData);
                out.writeBytes(strData);
                System.out.println("二进制...");
                out.write(data);
                System.out.println(end);
                out.writeBytes(end);
                strData = "--" + boundary + "--" + end;
                System.out.println(strData);
                // 开上传文件结束========================================
                // 请求结束标志
                out.writeBytes(strData);
                out.flush();
    
                // 获取响应
                if (connection.getResponseCode() >= 300) {
                    throw new Exception("HTTP Request fail,response code " + connection.getResponseCode());
                }
                StringBuilder sb = new StringBuilder();
                if (connection.getResponseCode() == HttpURLConnection.HTTP_OK) {
                    reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
                    String strLine = null;
                    while ((strLine = reader.readLine()) != null) {
                        sb.append(strLine);
                    }
                }
                return sb.toString();
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                close(out, reader);
                closeConnection(connection);
            }
            return "";
        }
    
        public static void close(Closeable... args) {
            for (Closeable closeable : args) {
                if (closeable != null) {
                    try {
                        closeable.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    
        private static void closeConnection(HttpURLConnection connection) {
            if (connection != null) {
                connection.disconnect();
            }
        }
    
        public static void main(String[] args) {
            byte[] data = downloadFile(
                "https://4f7fce38e855e98a0d722672fc0a4ef4.dlied1.cdntips.net/dl.softmgr.qq.com/original/Picture/FocusOnIV64_1.23.exe?mkey=607322a66f1278d3&f=9870&cip=111.18.94.38&proto=https",
                "C:\Users\admin\Desktop", "FocusOnIV64_1.23.exe");
            Map<String, String> textMap = new HashMap<String, String>();
            textMap.put("id", "123");
            textMap.put("name", "zinredible");
            String responseStr =
                uploadFile("http://127.0.0.1/api/his/upload", textMap, "testFile", data, "FocusOnIV64_1.23.exe");
            System.out.println(responseStr);
        }
    }
    // springboot接口
    @PostMapping(value = "/api/his/upload", produces = "multipart/form-data;charset=UTF-8")
        @ApiImplicitParams({@ApiImplicitParam(name = "id", paramType = "form"),
            @ApiImplicitParam(name = "name", paramType = "form")})
        public String uploadFile(TestParam param, MultipartFile testFile,HttpServletRequest request) throws Exception
  • 相关阅读:
    仿苹果菜单的效果
    不用系统自带的复选框,单选按钮,选择框的样式,该怎么做
    js面向对象(三)---组件开发
    JS面向对象(二)---继承
    js面向对象(一)---基本的概念、属性、方法
    移动端新建html页面
    《程序员思维修炼》读后摘录
    做一个简单的贪吃蛇游戏
    做一个简单的遮罩层
    在不同设备上控制元素
  • 原文地址:https://www.cnblogs.com/zincredible/p/14646254.html
Copyright © 2020-2023  润新知