Spring MVC 處理客戶端發(fā)起的文件上傳請求

2018-07-26 14:30 更新

在使用了RESTful服務(wù)的場景下,非瀏覽器的客戶端也可以直接提交多路文件請求。上一節(jié)講述的所有例子與配置在這里也都同樣適用。但與瀏覽器不同的是,提交的文件和簡單的表單字段,客戶端發(fā)送的數(shù)據(jù)可以更加復(fù)雜,數(shù)據(jù)可以指定為某種特定的內(nèi)容類型(content type)——比如,一個多路上傳請求可能第一部分是個文件,而第二部分是個JSON格式的數(shù)據(jù):

    POST /someUrl
    Content-Type: multipart/mixed

    --edt7Tfrdusa7r3lNQc79vXuhIIMlatb7PQg7Vp
    Content-Disposition: form-data; name="meta-data"
    Content-Type: application/json; charset=UTF-8
    Content-Transfer-Encoding: 8bit

    {
        "name": "value"
    }
    --edt7Tfrdusa7r3lNQc79vXuhIIMlatb7PQg7Vp
    Content-Disposition: form-data; name="file-data"; filename="file.properties"
    Content-Type: text/xml
    Content-Transfer-Encoding: 8bit
    ... File Data ...

對于名稱為meta-data的部分,你可以通過控制器方法上的@RequestParam("meta-data") String metadata參數(shù)來獲得。但對于那部分請求體中為JSON格式數(shù)據(jù)的請求,你可能更想通過接受一個對應(yīng)的強(qiáng)類型對象,就像@RequestBody通過HttpMessageConverter將一般請求的請求體轉(zhuǎn)換成一個對象一樣。

這是可能的,你可以使用@RequestPart注解來實(shí)現(xiàn),而非@RequestParam。該注解將使得特定多路請求的請求體被傳給HttpMessageConverter,并且在轉(zhuǎn)換時考慮多路請求中不同的內(nèi)容類型參數(shù)'Content-Type'

@RequestMapping(path = "/someUrl", method = RequestMethod.POST)
public String onSubmit(@RequestPart("meta-data") MetaData metadata, @RequestPart("file-data") MultipartFile file) {

    // ...

}

請注意MultipartFile方法參數(shù)是如何能夠在@RequestParam@RequestPart注解下互用的,兩種方法都能拿到數(shù)據(jù)。但,這里的方法參數(shù)@RequestPart("meta-data") MetaData則會因?yàn)檎埱笾械膬?nèi)容類型請求頭'Content-Type'被讀入成為JSON數(shù)據(jù),然后再通過MappingJackson2HttpMessageConverter被轉(zhuǎn)換成特定的對象。


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號