zoukankan      html  css  js  c++  java
  • java发送post请求,使用multipart/form-data的方式传递参数--《优化》

    /**
         * 测试上传图片
         * 
         */
        public static void testUploadImage(){
            String url = "http://xxxtest/Api/testUploadModelBaking";
            String fileName = "e:/username/textures/antimap_0017.png";
            Map<String, String> textMap = new HashMap<String, String>();
            //可以设置多个input的name,value
            textMap.put("name", "testname");
            textMap.put("type", "2");
            //设置file的name,路径
            Map<String, String> fileMap = new HashMap<String, String>();
            fileMap.put("upfile", fileName);
            String contentType = "";//image/png
            String ret = formUpload(url, textMap, fileMap,contentType);
            System.out.println(ret);
            //{"status":"0","message":"add succeed","baking_url":"group1/M00/00/A8/CgACJ1Zo-LuAN207AAQA3nlGY5k151.png"}
        }
    
        /**
         * 上传图片
         * @param urlStr
         * @param textMap
         * @param fileMap
         * @param contentType 没有传入文件类型默认采用application/octet-stream
         * contentType非空采用filename匹配默认的图片类型
         * @return 返回response数据
         */
        @SuppressWarnings("rawtypes")
        public static String formUpload(String urlStr, Map<String, String> textMap,
                Map<String, String> fileMap,String contentType) {
            String res = "";
            HttpURLConnection conn = null;
            // boundary就是request头和上传文件内容的分隔符
            String BOUNDARY = "---------------------------123821742118716"; 
            try {
                URL url = new URL(urlStr);
                conn = (HttpURLConnection) url.openConnection();
                conn.setConnectTimeout(5000);
                conn.setReadTimeout(30000);
                conn.setDoOutput(true);
                conn.setDoInput(true);
                conn.setUseCaches(false);
                conn.setRequestMethod("POST");
                conn.setRequestProperty("Connection", "Keep-Alive");
                // conn.setRequestProperty("User-Agent","Mozilla/5.0 (Windows; U; Windows NT 6.1; zh-CN; rv:1.9.2.6)");
                conn.setRequestProperty("Content-Type","multipart/form-data; boundary=" + BOUNDARY);
                OutputStream out = new DataOutputStream(conn.getOutputStream());
                // text
                if (textMap != null) {
                    StringBuffer strBuf = new StringBuffer();
                    Iterator iter = textMap.entrySet().iterator();
                    while (iter.hasNext()) {
                        Map.Entry entry = (Map.Entry) iter.next();
                        String inputName = (String) entry.getKey();
                        String inputValue = (String) entry.getValue();
                        if (inputValue == null) {
                            continue;
                        }
                        strBuf.append("
    ").append("--").append(BOUNDARY).append("
    ");
                        strBuf.append("Content-Disposition: form-data; name="" + inputName + ""
    
    ");
                        strBuf.append(inputValue);
                    }
                    out.write(strBuf.toString().getBytes());
                }
                // file
                if (fileMap != null) {
                    Iterator iter = fileMap.entrySet().iterator();
                    while (iter.hasNext()) {
                        Map.Entry entry = (Map.Entry) iter.next();
                        String inputName = (String) entry.getKey();
                        String inputValue = (String) entry.getValue();
                        if (inputValue == null) {
                            continue;
                        }
                        File file = new File(inputValue);
                        String filename = file.getName();
                        
                        //没有传入文件类型,同时根据文件获取不到类型,默认采用application/octet-stream
                        contentType = new MimetypesFileTypeMap().getContentType(file);
                        //contentType非空采用filename匹配默认的图片类型
                        if(!"".equals(contentType)){
                            if (filename.endsWith(".png")) {
                                contentType = "image/png"; 
                            }else if (filename.endsWith(".jpg") || filename.endsWith(".jpeg") || filename.endsWith(".jpe")) {
                                contentType = "image/jpeg";
                            }else if (filename.endsWith(".gif")) {
                                contentType = "image/gif";
                            }else if (filename.endsWith(".ico")) {
                                contentType = "image/image/x-icon";
                            }
                        }
                        if (contentType == null || "".equals(contentType)) {
                            contentType = "application/octet-stream";
                        }
                        StringBuffer strBuf = new StringBuffer();
                        strBuf.append("
    ").append("--").append(BOUNDARY).append("
    ");
                        strBuf.append("Content-Disposition: form-data; name="" + inputName + ""; filename="" + filename + ""
    ");
                        strBuf.append("Content-Type:" + contentType + "
    
    ");
                        out.write(strBuf.toString().getBytes());
                        DataInputStream in = new DataInputStream(new FileInputStream(file));
                        int bytes = 0;
                        byte[] bufferOut = new byte[1024];
                        while ((bytes = in.read(bufferOut)) != -1) {
                            out.write(bufferOut, 0, bytes);
                        }
                        in.close();
                    }
                }
                byte[] endData = ("
    --" + BOUNDARY + "--
    ").getBytes();
                out.write(endData);
                out.flush();
                out.close();
                // 读取返回数据
                StringBuffer strBuf = new StringBuffer();
                BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream()));
                String line = null;
                while ((line = reader.readLine()) != null) {
                    strBuf.append(line).append("
    ");
                }
                res = strBuf.toString();
                reader.close();
                reader = null;
            } catch (Exception e) {
                System.out.println("发送POST请求出错。" + urlStr);
                e.printStackTrace();
            } finally {
                if (conn != null) {
                    conn.disconnect();
                    conn = null;
                }
            }
            return res;
        }

    以上是网上可以搜到显示最多的代码:

    实际使用中发现有部分接口无法调通,后来发现是在

     strBuf.append("
    ").append("--").append(BOUNDARY).append("
    ");

    多了换行符,应改为:

     strBuf.append("--").append(BOUNDARY).append("
    ");

    完整代码如下:

     OutputStream out = new DataOutputStream(conn.getOutputStream());
                if (fileMap != null) {
                    String filename = fileMap.get("filename");
                    String upload = fileMap.get("upload");
                    StringBuffer strBuf = new StringBuffer();
                    strBuf.append("--").append(BOUNDARY).append("
    ");
                    strBuf.append("Content-Disposition: form-data;name="filename"
    
    " + filename + "
    "); 
                    strBuf.append("--").append(BOUNDARY).append("
    ");
                    strBuf.append("Content-Disposition: form-data;name="upload";filename="" + upload + ""
    "); 
                    strBuf.append("
    ");
                   // strBuf.append("test:ai
    ");
                    out.write(strBuf.toString().getBytes());
                    logger.debug(strBuf.toString());
                    DataInputStream in = new DataInputStream(new FileInputStream(file));
                    int bytes = 0;
                    byte[] bufferOut = new byte[1024];
                    while ((bytes = in.read(bufferOut)) != -1) {
                        out.write(bufferOut, 0, bytes);
                    }
                    in.close();
                    
                    byte[] endData = ("
    --" + BOUNDARY + "--
    ").getBytes();
                    out.write(endData);
                    out.flush();
                    out.close();
                }
                
                // 读取返回数据
                StringBuffer strBuf = new StringBuffer();
                BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream()));
                String line = null;
                while ((line = reader.readLine()) != null) {
                    strBuf.append(line).append("
    ");
                }
                res = strBuf.toString();
                reader.close();
                reader = null;
                logger.info("上传完成:"+res);

    这个要根据接收者的接收协议来确定使用哪一种方式。

  • 相关阅读:
    Miox带你走进动态路由的世界——51信用卡前端团队
    从零开始搭建Vue组件库 VV-UI
    你不知的DOM编程
    浅谈前后端分离与实践(一)
    处理 Vue 单页面应用 SEO 的另一种思路
    Vue服务端渲染和Vue浏览器端渲染的性能对比
    实例PK(Vue服务端渲染 VS Vue浏览器端渲染)
    使用ES6+Vue+webpack+gulp构建新一代Web应用
    耐克的定制页用canvas如何实现....跪求前端大神指点。
    Unity热更新学习(二) —— ToLua c#与lua的相互调用
  • 原文地址:https://www.cnblogs.com/liangblog/p/15223253.html
Copyright © 2011-2022 走看看