web-dev-qa-db-ja.com

スプリングブートでマルチパート境界が見つからなかったため、要求は拒否されました

ポストマンchromeアドオンを使用したスプリングブートとWebサービスでこれを試しています。

郵便配達員content-type="multipart/form-data"では、以下の例外が発生しています。

HTTP Status 500 - Request processing failed; 
nested exception is org.springframework.web.multipart.MultipartException: Could not parse multipart servlet request; 
nested exception is Java.io.IOException: 
org.Apache.Tomcat.util.http.fileupload.FileUploadException: the request was rejected because no multipart boundary was found

コントローラーで以下のコードを指定しました

@ResponseBody
@RequestMapping(value = "/file", headers = "Content-Type= multipart/form-data", method = RequestMethod.POST)

public String upload(@RequestParam("name") String name,
        @RequestParam(value = "file", required = true) MultipartFile file)
//@RequestParam ()CommonsMultipartFile[] fileUpload
{
    // @RequestMapping(value="/newDocument", , method = RequestMethod.POST)
    if (!file.isEmpty()) {
        try {
            byte[] fileContent = file.getBytes();
            fileSystemHandler.create(123, fileContent, name);
            return "You successfully uploaded " + name + "!";
        } catch (Exception e) {
            return "You failed to upload " + name + " => " + e.getMessage();
        }
    } else {
        return "You failed to upload " + name + " because the file was empty.";
    }
}

ここで、ファイルハンドラーコードを指定します

public String create(int jonId, byte[] fileContent, String name) {
    String status = "Created file...";
    try {
        String path = env.getProperty("file.uploadPath") + name;
        File newFile = new File(path);
        newFile.createNewFile();
        BufferedOutputStream stream = new BufferedOutputStream(new FileOutputStream(newFile));
        stream.write(fileContent);
        stream.close();
    } catch (IOException ex) {
        status = "Failed to create file...";
        Logger.getLogger(FileSystemHandler.class.getName()).log(Level.SEVERE, null, ex);
    }
    return status;
}
40
Mohammed Javed

問題は、自分でContent-Typeを設定していることです。空白にしておいてください。 Google Chromeが自動的に行います。マルチパートのContent-Typeはファイルの境界を知る必要があり、Content-Typeを削除すると、Postmanが自動的にそれを行います。

75
de.la.ru

Postmanでコンテンツタイプのチェックを外すと、postmanは実行時の入力に基づいてコンテンツタイプを自動的に検出します。

Sample

14
Bala

これは私のために働いた:Postmanを介してSpringMVCバックエンドwebappにファイルをアップロードする:

バックエンド: Endpoint controller definition

郵便配達員: Headers setupPOST Body setup

10
gorjanz

「Postman-REST Client」は、content-typeを設定してpostアクションを実行するのに適していません。「Advanced REST client」などを使用してみてください。

さらに、Spring 3.1 M2以降、ヘッダーは消費と生産に置き換えられました https://spring.io/blog/2011/06/13/spring-3-1-m2-spring-mvc-enhancements =。また、produces = MediaType.MULTIPART_FORM_DATA_VALUEを直接使用できます。

2
tomeokin

postmanを使用して5.6Mのファイルを外部ネットワークに送信すると、同じ問題が発生しました。 (同じアクションが自分のコンピューターとローカルのテスト環境で成功します。)すべてのサーバー構成とhttpヘッダーを確認した後、Postmanが外部http要求への要求をシミュレートするのに問題がある可能性があることがわかりました。最後に、chrome htmlページでsendfileリクエストを正常に実行しました。参考として:)

0
hao huang

この問題に遭遇したのは、axiosをベースにしたrequest.jsを使用しているためです
そして、request.jsでdefaults.headersをすでに設定しています

import axios from 'axios'
const request = axios.create({
  baseURL: '', 
  timeout: 15000 
})
service.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded'

これが私がこれを解決する方法です
の代わりに

request.post('/manage/product/upload.do',
      param,config
    )

Axiosを使用してリクエストを直接送信し、設定を追加しませんでした

axios.post('/manage/product/upload.do',
      param
    )

これがあなたの問題を解決できることを願っています

0
Hanz

PostmanからPOSTリクエストを行うときに同じ問題が発生していましたが、後でこのように境界値を設定したカスタムContent-Typeを設定することで問題を解決できました。

私は人々が同様の問題に遭遇する可能性があると思ったので、ソリューションを共有しています。

postman

0
Reaz Murshed