• 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;
        }

    本文代码学习自:https://blog.csdn.net/Icywind1/article/details/85628099 ,csdn的代码格式让人抓狂,特复制一份。

  • 相关阅读:
    C#的集合类(二)Hashtable、SortedList、Dictionary
    下载文件-JavaScript
    ASP.NET(C#)图片加文字、图片水印
    C# DataTable 互转 List<T>
    C# 将 DataTable 转 List<T>、首行转 T
    C# 金额转中文大写
    监听端口守护进程
    数据库操作的九大步骤
    日志方法
    sqlserver 查找所有子级
  • 原文地址:https://www.cnblogs.com/jying/p/10310865.html
Copyright © 2020-2023  润新知