摘要:直接用的上傳文件,通過模擬提交方法具體代碼如下網絡訪問工具默認默認或執行調用地址方法地址請求的與實體對應的信息如執行調用地址方法地址秒連接分鐘讀數據上傳文件表單參數文件參數上傳文件允許同一個屬性上傳多個文件表單參數文件參數調
直接用jdk的HttpURLConnection上傳文件,通過模擬post提交方法
具體代碼如下:
import java.io.BufferedReader; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStream; import java.net.HttpURLConnection; import java.net.URL; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.util.HashMap; import java.util.Iterator; import java.util.LinkedHashSet; import java.util.Map; import java.util.Map.Entry; import java.util.Objects; import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; /** * http 網絡訪問工具 * * @author wonderful. * @version 3.0.0 */ public class HttpClient { private final static Logger LOGGER = Logger.getLogger(HttpClient.class); private String method = null; private String CONTENT_TYPE = null; //默認 /** * 默認POST * * @return String */ public String getMethod() { if (method == null) { return "POST"; } return method; } /** * POST 或 GET * * @param method . */ public void setMethod(String method) { this.method = method; } /** * 執行調用 serviceURL地址 方法 * @param serviceURL webService地址. * @param param String. * @param ContentType 請求的與實體對應的MIME信息 如:Content-Type: application/x-www-form-urlencoded,application/json,application/xml * @return String. */ public String pub(String serviceURL, String param,String contentType) { CONTENT_TYPE = contentType; return pub(serviceURL,param); } /** * 執行調用 serviceURL地址 方法 * @param serviceURL webService地址. * @param param String. * @return String. */ public String pub(String serviceURL, String param) { URL url = null; HttpURLConnection connection = null; StringBuffer buffer = new StringBuffer(); LOGGER.info("request:" + serviceURL + "?" + param); try { url = new URL(serviceURL); connection = (HttpURLConnection) url.openConnection(); connection.setDoOutput(true); connection.setDoInput(true); connection.setUseCaches(false); connection.setRequestMethod(getMethod()); connection.setConnectTimeout(5000);//30秒連接 connection.setReadTimeout(5*60*1000);//5分鐘讀數據 connection.setRequestProperty("Content-Length", param.length() + ""); if(CONTENT_TYPE != null){ connection.setRequestProperty("Content-Type", CONTENT_TYPE); } OutputStream outputStream = connection.getOutputStream(); outputStream.write(param.getBytes("UTF-8")); BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream(), "UTF-8")); String line = ""; while ((line = reader.readLine()) != null) { buffer.append(line); } reader.close(); } catch (IOException e) { LOGGER.error(e); } finally { if (connection != null) { connection.disconnect(); } } LOGGER.info("response:" + buffer.toString()); return buffer.toString(); } /** * 上傳文件 * * @param serviceURL * @param textMap * 表單參數 * @param fileMap * 文件參數 * @return * @throws IOException */ public static String formUpload(String serviceURL, MaptextMap, Map fileMap) throws IOException { Map > tempMap = new HashMap<>(); if (!Objects.isNull(fileMap) && !fileMap.isEmpty()) { Iterator > iter = fileMap.entrySet().iterator(); while (iter.hasNext()) { Map.Entry entry = iter.next(); String inputName = entry.getKey(); String inputValue = entry.getValue(); if (StringUtils.isAnyBlank(inputName, inputValue)) { continue; } LinkedHashSet values = new LinkedHashSet<>(); values.add(inputValue); tempMap.put(inputName, values); } } return formUploadMulti(serviceURL, textMap, tempMap); } /** * 上傳文件,允許同一個屬性上傳多個文件 * * @param serviceURL * @param textMap * 表單參數 * @param fileMap * 文件參數 * @return * @throws IOException */ public static String formUploadMulti(String serviceURL, Map textMap, Map > fileMap) throws IOException { LOGGER.trace(String.format("調用文件上傳,傳入參數:serviceURL=%s,textMap=%s,fileMap=%s", serviceURL, textMap, fileMap)); String res = ""; HttpURLConnection conn = null; OutputStream out = null; BufferedReader reader = null; String BOUNDARY = "---------------------------" + System.currentTimeMillis(); // boundary就是request頭和上傳文件內容的分隔符 try { URL url = new URL(serviceURL); conn = (HttpURLConnection) url.openConnection(); conn.setConnectTimeout(5000);// 30秒連接 conn.setReadTimeout(5 * 60 * 1000);// 5分鐘讀數據 conn.setDoOutput(true); conn.setDoInput(true); conn.setUseCaches(false); conn.setRequestMethod("POST"); conn.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + BOUNDARY); out = new DataOutputStream(conn.getOutputStream()); // text if (!Objects.isNull(textMap) && !textMap.isEmpty()) { StringBuffer strBuf = new StringBuffer(); Iterator > iter = textMap.entrySet().iterator(); while (iter.hasNext()) { Map.Entry entry = iter.next(); String inputName = entry.getKey(); String inputValue = entry.getValue(); if (StringUtils.isAnyBlank(inputName, inputValue)) { 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 (!Objects.isNull(fileMap) && !fileMap.isEmpty()) { Iterator >> iter = fileMap.entrySet().iterator(); while (iter.hasNext()) { Entry > entry = iter.next(); String inputName = entry.getKey(); LinkedHashSet inputValue = entry.getValue(); if (StringUtils.isAnyBlank(inputName) || inputValue.isEmpty()) { continue; } for (String filePath : inputValue) { File file = new File(filePath); String filename = file.getName(); Path path = Paths.get(filePath); String contentType = Files.probeContentType(path); 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 + " "); LOGGER.trace(String.format("filename:%s,contentType:%s", filename, 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(); // 讀取返回數據 LOGGER.trace(String.format("http 返回狀態:ResponseCode=%s,ResponseMessage=%s", conn.getResponseCode(), conn.getResponseMessage())); StringBuffer strBuf = new StringBuffer(); reader = new BufferedReader(new InputStreamReader(conn.getInputStream())); String line = null; while ((line = reader.readLine()) != null) { strBuf.append(line).append(" "); } res = strBuf.toString(); LOGGER.trace(String.format("http 返回數據:%s", res)); reader.close(); reader = null; } catch (IOException e) { throw e; } finally { if (!Objects.isNull(out)) { out.close(); out = null; } if (!Objects.isNull(reader)) { reader.close(); reader = null; } if (conn != null) { conn.disconnect(); conn = null; } } return res; } }
上面的兩個方法有待優化,未處理
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/75753.html
摘要:請求用于注冊登錄等安全性較高且向數據庫中寫入數據的操作。該類中定義了一系列的狀態碼設置該連接是可以輸出的設置請求方式向連接中輸出數據相當于發送數據給服務器讀取數據使用進行通信大大簡化了中通信的實現。 Http通信概述 Http通信主要有兩種方式POST方式和GET方式。前者通過Http消息實體發送數據給服務器,安全性高,數據傳輸大小沒有限制,后者通過URL的查詢字符串傳遞給服務器參數...
摘要:用的流從網上下載一個視頻原理就是用對象與目標地址建立一個鏈接,用流的方式從這個鏈接上把視頻的二進制數據讀取下載然后再寫入本地文件。然后循環依次寫入緩存的大小,直至結束。 用Java的IO流從網上下載一個視頻 原理:就是用URL對象與目標地址建立一個鏈接,用IO流的方式從這個鏈接上把視頻的二進制數據讀取下載然后再寫入本地文件。 因為小弟比較菜的緣故,不會下載那些加了密的視頻鏈接,這里我就...
摘要:時間年月日星期三說明本文部分內容均來自慕課網。慕課網教學示例源碼無個人學習源碼第一章概述課程介紹及介紹課程目標認識并理解及其應用,并能根據其實現原理自行實現。 時間:2017年3月22日星期三說明:本文部分內容均來自慕課網。@慕課網:http://www.imooc.com教學示例源碼:無個人學習源碼:https://github.com/zccodere/s... 第一章:概述 1-...
閱讀 1482·2019-08-30 15:44
閱讀 1946·2019-08-30 14:07
閱讀 2871·2019-08-30 13:56
閱讀 2337·2019-08-29 17:06
閱讀 1325·2019-08-29 14:13
閱讀 2079·2019-08-29 11:28
閱讀 3224·2019-08-26 13:56
閱讀 1941·2019-08-26 12:11