摘要:由后端來發送請求來調用這些接口。是中用來傳遞文件對象而定義的。中設置如下中設置上傳文件的大小單個文件可上傳的最大整個請求的最大還包括等內容
本文概述:
可能會存在一些需求,一些部署在內部的或者多帶帶一個環境的服務,提供rest服務。由后端來發送http請求來調用這些接口。那在后端就需要構造http請求。本文要解決的場景如下:
前端multipartfile 上傳文件,后端接收后構造post請求,調用外部接口,傳送文件流及其他參數
內容包括:
1.前端postman調用上傳接口
2.后端接收multipartfile文件
3.后端用httpclient構造post請求
4.調用外部接口后返回結果的處理
先上代碼:
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.HttpStatus;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.ContentType;
import org.apache.http.entity.mime.HttpMultipartMode;
import org.apache.http.entity.mime.MultipartEntityBuilder;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
/** *前端上傳文件,后端接收后構造post請求,調用外部文件上傳接口 */ @PostMapping(value = "uploadImage") public void uploadImage(Model model, @RequestParam(value = "image") MultipartFile image, String label) { log.info("=============uploadImage start================="); log.info("圖像處理的標簽"+label); Mapdata = new HashMap (); log.info("開始post請求構造======"); String url ="http://ip:port/mytest/fileup";//服務端要調用的外部接口 Map resultMap = new HashMap (); //httpclients構造post請求 CloseableHttpClient httpClient = HttpClients.createDefault(); try { log.info("post請求的url"+url); HttpPost httpPost = new HttpPost(url); //HttpMultipartMode.RFC6532參數的設定是為避免文件名為中文時亂碼 MultipartEntityBuilder builder = MultipartEntityBuilder.create().setMode(HttpMultipartMode.RFC6532); String originFileName = null; originFileName = image.getOriginalFilename(); // File file1 = new File("/home/temp/下載/1200-560.jpg"); //測試外部接口直接上傳本地圖片 builder.addBinaryBody("image", image.getBytes(), ContentType.MULTIPART_FORM_DATA, originFileName);// 設置上傳文件流(需要是輸出流),設置contentType的類型 builder.addTextBody("label",label);//post請求中的其他參數 // log.info("上傳圖的標簽label"+label); HttpEntity entity = builder.build(); httpPost.setEntity(entity); HttpResponse response = httpClient.execute(httpPost);// 執行提交 HttpEntity responseEntity = response.getEntity();//接收調用外部接口返回的內容 if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK){// String imageUrl = stringStringMap.get("data"); // data.put("path",imageUrl); // 返回的內容都在content中 InputStream content = responseEntity.getContent(); byte[] bytes = toByteArray(content); //將byte數組進行base64編碼,此例中調用外部接口返回的是圖片流 String encodeStr = Base64.getEncoder().encodeToString(bytes); model.addAttribute("data",encodeStr); } } catch (Exception e) { model.addAttribute("code", "錯誤碼"); model.addAttribute("message","錯誤的提示信息"); }finally {//處理結束后關閉httpclient的鏈接 try { httpClient.close(); } catch (IOException e) { e.printStackTrace(); } } } /** *將輸入流轉換為輸出流,無需創建臨時文件 * @param input * @return * @throws IOException */ public byte[] toByteArray(InputStream input) throws IOException { ByteArrayOutputStream output = new ByteArrayOutputStream(); copy(input, output); return output.toByteArray(); }
postman調用接口如下
可能存在的坑:
1.確保后端部署的網絡與所調用的外部接口網絡是通的
2.后端接收multipartfile文件后若不需處理就調用外部接口的話,可不用生成臨時文件。可直接使用multipartfile對象自帶的方法,獲取byte流
3.構造的post請求,若涉及到文件的上傳,要設置正確的contentType,如上文代碼中所示
4.構造的post請求中,addBinaryBody()中傳遞的可以是一個file對象,也可以是流。【若是流則需是輸出流】
5.byte數組轉換為base64字符串,詳情見上文代碼備注部分
6.將輸入流轉換為輸出流,不需要寫臨時文件,見上文代碼
multipartfile對象與file的區別:
multipartfile是個接口,通常所說的multipartfile是在springmvc中設置過的。是springmvc中用來傳遞文件對象而定義的。該接口包括如下方法
byte[] bytes = multipartFile.getBytes();//獲取multipartfile對象的byte數組,可轉換文件流等 String contentType = multipartFile.getContentType();//獲取multipartfile的頭類型 InputStream inputStream = multipartFile.getInputStream();//獲取輸入流 String name = multipartFile.getName();//獲取文件名 String originalFilename = multipartFile.getOriginalFilename();//獲取初始文件名 long size = multipartFile.getSize();//獲取文件大小 boolean empty = multipartFile.isEmpty();//判斷對象內容是否是空 multipartFile.transferTo(new File("文件路徑"));//指定一個文件路徑,可將multipartfile對象中的內容寫入文件。若需要轉換為file對象,需要創建一個臨時文件
MultipartFile是個接口,file可以通過設置CommonsMultipartFile對象的屬性來進行轉換。
springmvc中設置如下:
springboot中設置上傳文件的大小:
spring.http.multipart.maxFileSize=50Mb //單個文件可上傳的最大size
spring.http.multipart.maxRequestSize=1000Mb //整個請求的最大size(還包括header等內容)
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/75779.html
摘要:第三種,使用格式,即在中請求參數處理跨域問題當然請求方式只能是。最后發現有網友說版本不穩定引起的,于是把百度地圖回退到了,結果還真是可以了。請問在移動端頁面中播放優酷里面的視頻,怎樣實現 1.web掃碼登錄怎么實現,思路 步驟 WEB平臺 手機 第1步 生成二維碼 第2步 (ajax監控后臺) 掃碼 第3步 ...
摘要:我們可以來看看數據庫這個字段就是判斷我們的這條數據是否是有效的,表示這條數據是有效的,表示這條數據是無效的。 ? 技術棧 后端 Java 8開發框架:SpringB...
摘要:場景如下前端使用向后臺發了一個為的請求,后臺接口如下發現接收不到的信息。改為也一樣接收不到。表單請求提交時,使用的是,而使用原生的請求如果不指定請求頭,默認使用的是。 場景如下:前端vue使用axios向后臺發了一個Content-type為application/json的post請求,后臺springmvc接口如下: @RequestMapping(xxx) public Resu...
摘要:請求錯誤請求代碼封裝與基本一致,只是將換成即可。關于的使用是個能把組件的共享狀態抽取出來,當做一個全局單例模式進行管理。首先確保你的已經安裝,運行來安裝。 項目地址:https://huangxizhou.com/project/iMap 技術棧 Vue.js Vuex Axios Webpack Leancloud(express) Echarts Electron(electr...
閱讀 1833·2021-09-22 15:23
閱讀 3255·2021-09-04 16:45
閱讀 1842·2021-07-29 14:49
閱讀 2767·2019-08-30 15:44
閱讀 1523·2019-08-29 16:36
閱讀 1038·2019-08-29 11:03
閱讀 1504·2019-08-26 13:53
閱讀 504·2019-08-26 11:57