深入讲解微信小程序上传图片与JAVA后台的结合
背景
微信小程序上傳文件是微信小程序提供的API之一,如果用JAVA后臺如何來處理上傳的文件呢?
官方文檔
UploadTask?wx.uploadFile(Object object)
將本地資源上傳到服務器。客戶端發起一個 HTTPS POST 請求,其中?content-type?為?multipart/form-data。
參數
Object object
| url | string | ? | 是 | 開發者服務器地址 | ? |
| filePath | string | ? | 是 | 要上傳文件資源的路徑 (本地路徑) | ? |
| name | string | ? | 是 | 文件對應的 key,開發者在服務端可以通過這個 key 獲取文件的二進制內容 | ? |
| header | Object | ? | 否 | HTTP 請求 Header,Header 中不能設置 Referer | ? |
| formData | Object | ? | 否 | HTTP 請求中其他額外的 form data | ? |
| timeout | number | ? | 否 | 超時時間,單位為毫秒 | 2.10.0 |
| success | function | ? | 否 | 接口調用成功的回調函數 | ? |
| fail | function | ? | 否 | 接口調用失敗的回調函數 | ? |
| complete | function | ? | 否 | 接口調用結束的回調函數(調用成功、失敗都會執行) | ? |
object.success 回調函數
參數
Object res
| data | string | 開發者服務器返回的數據 |
| statusCode | number | 開發者服務器返回的 HTTP 狀態碼 |
創建小程序與編寫代碼?
創建小程序就不說了,如果不是開發小程序,也不會來搞上傳文件。上傳的關鍵代碼如下
wx.uploadFile({url: getApp().globalData.host + '/uploadImage',filePath: "/images/full_cart.png",name: 'img',success: (res) => {console.log("upload succeed")var data = res.data;console.log(data);}, fail: () => {console.log("upload failed")}})對于以上代碼上傳文件的關鍵參數有三個。
第一個參數:url。這個參數是服務器的地址。本文中,我們的服務器是在本地的Tomcat,那就自然而然的是 localhost:8080,也可以直接寫成? url: 'http://localhost:8080/uploadImage' 。 uploadImage 表示的是Controller的地址,下面會講到。
按照上文的寫法是因為我在App.js里面做了全局配置,
globalData: {host: 'http://localhost:8080',}第二個參數:filePath。這個參數是我要上傳的文件?
第三個參數 name,是為這個圖片對象設定的key。在Controller中用到。
JAVA后臺工程創建與編碼
JAVA后臺,也叫JAVA后端吧,總之就是服務器的意思。
這里面選擇的是Spring Boot 創建的Maven工程,在工程比中創建一個Controller,并編碼。代碼如下。
import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.multipart.MultipartFile;import java.io.File; import java.io.IOException;/*** @author kangyucheng*/ @Controller public class UploadController {private final static Logger logger = LoggerFactory.getLogger(UploadController.class);@PostMapping("/uploadImage")@ResponseBodypublic String uploadImageFile(@RequestParam("img") MultipartFile uploadImage) throws IOException {String fileName = uploadImage.getOriginalFilename();String imgFilePath = "/Users/yuchk/Desktop/";File targetFile = new File(imgFilePath, fileName);//保存uploadImage.transferTo(targetFile);logger.info("圖片存儲成功");return "success";} }需要注意的是
@PostMapping("/uploadImage") 要和微信小程序中的url參數中地址保持一致,
@RequestParam("img") 要和微信小程序中的name保持一致。
本地調試
本地調試的過程中首先要啟動Spring boot的工程。
然后編譯小程序,去觸發上傳的事件。
記得開啟不校驗合法域名。
本地調試結果?
真機調試?
?由于服務器是在本地開啟的,那么在真機無法訪問本地服務器的情況下,必然是會失敗的。
后臺錯誤的陷阱
假設我們的后臺發生了異常,那么微信小程序是沒法處理的。依然會當成上傳成功處理。
修改代碼
import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.multipart.MultipartFile;import java.io.File; import java.io.IOException;/*** @author kangyucheng*/ @Controller public class UploadController {private final static Logger logger = LoggerFactory.getLogger(UploadController.class);@PostMapping("/uploadImage")@ResponseBodypublic String uploadImageFile(@RequestParam("img") MultipartFile uploadImage) throws Exception {String fileName = uploadImage.getOriginalFilename();String imgFilePath = "/Users/yuchk/Desktop/";File targetFile = new File(imgFilePath, fileName);//保存uploadImage.transferTo(targetFile);logger.info("圖片存儲成功");throw new Exception("故意的,哈哈");} }?再次本地觸發文件上傳事件。
結論: 要根據不同的返回結果,來判定文件是否到底上傳成功。
其他需要注意的地方
如果忘記寫? @ResponseBody? 注解,那可能是這種情況,雖然圖片上傳成功,但是返回給微信小程序的就不是我們預設的內容了。
?
如果返回的是一個自定義的類,那么也會發生錯誤。
/*** @author kangyucheng*/ @Controller public class UploadController {private final static Logger logger = LoggerFactory.getLogger(UploadController.class);@PostMapping("/uploadImage")@ResponseBodypublic M uploadImageFile(@RequestParam("img") MultipartFile uploadImage) throws Exception {String fileName = uploadImage.getOriginalFilename();String imgFilePath = "/Users/yuchk/Desktop/";File targetFile = new File(imgFilePath, fileName);//保存uploadImage.transferTo(targetFile);logger.info("圖片存儲成功");return new M("a","b");} } class M{String a;String b;public M(String a,String b){this.a = a;this.b = b;} }總結
以上是生活随笔為你收集整理的深入讲解微信小程序上传图片与JAVA后台的结合的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 百度人脸搜索的一次尝试(JAVA)
- 下一篇: AWS的EC2上构建一个爬虫