簡體   English   中英

Spring 文件上傳 - “所需的請求部分不存在”

[英]Spring File Upload - 'Required request part is not present'

我正在嘗試向我的 controller 發送 POST 請求,但除非我決定使用 JSON,否則無法傳遞任何類型的任何參數。 我的目標是將字符串和文件傳遞給我的 controller 但我不斷收到Required request part 'xxx' is not present錯誤。

@RestController
public class ConfigurationController {
    @PostMapping(value = "/config")
    public ResponseEntity<?> saveEnvironmentConfig(@RequestParam("file") MultipartFile uploadfile){
        return ResponseEntity.ok().body(null);
    }
}

我這里不能有文件。 同樣,如果我嘗試:

@RestController
public class ConfigurationController {
    @PostMapping(value = "/config")
    public ResponseEntity<?> saveEnvironmentConfig(@RequestParam("name") String name){
        return ResponseEntity.ok().body(null);
    }
}

同樣的事情我在這里無法命名。

我通過 Postman 發送請求,如下面的截圖所示:

郵遞員請求

郵遞員請求 2

唯一的 header 標簽用於授權。 我沒有任何 Content-Type header,我嘗試添加multipart/form-data但沒有幫助。

我可以傳遞字符串參數的唯一方法是添加到 URL。 因此,遵循http://localhost:8080/SearchBox/admin/config?name=test有效,但這不是我想要的。 我想要正文部分中的字符串和文件參數。

我還通過 CURL 進行了測試:

curl -X POST -H "Authorization:Bearer myToken" -H "Content-Type:Multipart/form-data" http://localhost:8080/SearchBox/admin/config --data 'pwd=pwd'
curl -X POST -H "Authorization:Bearer myToken"http://localhost:8080/SearchBox/admin/config --data 'pwd=pwd'
curl -H "Authorization:Bearer myToken" -F file=@"/g123.conf" http://localhost:8080/SearchBox/admin/config

注意:我已經檢查過類似的帖子,但沒有幫助This , This , This

我終於解決了這個問題並分享了我的解決方案,以防其他人可能面臨同樣的問題。

@RestController
@RequestMapping("/")
public class ConfigurationController {

    @Bean
    public MultipartConfigElement multipartConfigElement() {
        return new MultipartConfigElement("");
    }

    @Bean
    public MultipartResolver multipartResolver() {
        org.springframework.web.multipart.commons.CommonsMultipartResolver multipartResolver = new org.springframework.web.multipart.commons.CommonsMultipartResolver();
        multipartResolver.setMaxUploadSize(1000000);
        return multipartResolver;
    }
    @PostMapping(value = "/config", consumes = "multipart/form-data")
    public ResponseEntity<?> saveEnvironmentConfig(@RequestParam("password") String password, @RequestParam("file") MultipartFile submissions)
            throws AdminAuthenticationException, ConfigurationException {
        return ResponseEntity.ok().body(null);
    }
}
@RequestMapping(value = "/upload", method = RequestMethod.POST)
public ResponseEntity<?> upload(@RequestParam(value = "name") String 
name,@RequestParam(value = "file") MultipartFile file){
    // TODO check file is not null and save 
    return new ResponseEntity<>(HttpStatus.valueOf(200));;
}

在此處輸入圖像描述

將 Bean 添加到配置文件。

@Bean(name = "multipartResolver")
public CommonsMultipartResolver multipartResolver() {
    CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver();
    multipartResolver.setMaxUploadSize(-1);
    return multipartResolver;

}

雖然這不是原始發布者的問題,但如果您發現此問題並且上述解決方案均不適合您,請檢查您的 Postman 標頭; 如果設置了“Content-Type”header,這可能會導致上述錯誤。

刪除“Content-Type”header 可能會解決上述問題。

有關更多信息,請參閱此問題:

Postman:所需的請求部分“文件”不存在

如果您仍然收到錯誤,請嘗試從 postman 中刪除所有標題並刪除文件類型

在我的情況下,問題是我的csv 沒有按照其中設置的字符串命名

@PostMapping("/upload")
    public ResponseEntity<ResponseMessage> uploadFile(@RequestParam("file") MultipartFile file) {

在此處輸入圖像描述

在此處輸入圖像描述

我懷疑主要原因是 @RequestParam("file") 應該是 @RequestBody 。

如果請求正文通過代理或任何其他可能不支持 multipart/form-data 甚至 octet-stream 內容類型的中介,請考慮您的請求正文可能無法到達您的服務器。 希望這可以通過額外的配置來解決這種請求。 我還可以建議您配置一個請求攔截器,以便您可以在 controller 之前和之后記錄您的請求,這可能有助於您了解請求參數、有效負載和標頭。 就我而言,我意識到我的請求正文的大小為 0,這有助於我檢測導致此錯誤的原因不是我的 spring 配置。 在這里,我留下一個有用的資源來幫助您使用 Spring 開箱即用的日志攔截器。 在此處輸入鏈接描述

真的不知道發生了什么,但我刪除了代碼

=======刪除下面========

@Bean
public MultipartConfigElement multipartConfigElement() {
    return new MultipartConfigElement("");
}

@Bean
public MultipartResolver multipartResolver() {

在下面添加:

spring.servlet.multipart.max-file-size=-1 
spring.servlet.multipart.max-request-size=-1

而且,它開始神奇地工作。 也許這就是我的 spring 版本的情況

在我的情況下,輸入類型文件的name 屬性未設置為"file"

<input type="file" class="file-input" id="fileUpload" name="file">

在我的情況下,解決方案在配置上缺少“@EnableWebMvc”注釋

@EnableWebMvc
@Configuration
internal class BulkOffersUploadConfig {

    @Bean
    fun multipartResolver(): MultipartResolver {
        val multipartResolver = CommonsMultipartResolver()
        multipartResolver.setMaxUploadSize(1000)
        multipartResolver.setMaxUploadSizePerFile(1000)
        return multipartResolver
    }
}

多部分/表單數據 JMeter POST 示例:HTTP Header 管理器:接受/內容類型多部分/表單數據; 邊界=------------jm888 期望 100 次繼續用戶代理 jmeter/3.3 HTTP 請求:取消選中以下:重定向自動跟隨重定向用戶 KeepAlive將 multipart/form-data 用於 POST 瀏覽器兼容的標頭 Select 主體數據的主體數據選項卡示例:------------jm888 內容處置:表格數據; name="microsvc" 內容類型:應用程序/json

{ “orgId”:1,“ResourceId”:“0032ade8-cd59-45b6-8fff-299a63442474”,“StatusId”:“00d8ff46-c688-47cb-85a2-8edfaa1db9a2”,“TypeId”:“a972697e-735e-11e7- 8cf7-a6006ad3dba0", "Id": "2a1773fe-dbb8-4510-b051-32b2ad823ea1" } ------------------------jm888 內容處置:表格數據; 名稱="有效載荷"; 文件名="1349.xml" 內容類型:應用程序/xml

${__FileToString(C:\jmeterData\sourceData\1349.xml,,)} ------------------------jm888--

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM