Postmanを介してRest APIに画像をアップロードしたかった。 Spring Boot Frameworkを使用しています。これがスクリーンショットです:
また、他のスタックオーバーフローの回答でマルチパート境界エラーが発生することがわかったので、ヘッダーを設定していません。
さて、以下は私のコントローラーコードです:
package com.practice.rest.assignment1.controller;
import Java.io.IOException;
import Java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import com.practice.rest.assignment1.model.Product;
import com.practice.rest.assignment1.service.CatalogueService;
import org.codehaus.jackson.JsonParseException;
import org.codehaus.jackson.map.JsonMappingException;
import org.codehaus.jackson.map.ObjectMapper;
@RestController
@RequestMapping("/CatalogueController/")
public class CatalogueController{
@Autowired
private CatalogueService catalogueService;
@RequestMapping(value = "addProduct", method = RequestMethod.POST , consumes = "multipart/form-data")
public Product addProduct(@RequestParam String productJson, @RequestParam MultipartFile file) throws JsonParseException, JsonMappingException, IOException {
Product product = new ObjectMapper().readValue(productJson, Product.class);
byte[] mediaBytes = file.getBytes();
product.setImage(mediaBytes);
return catalogueService.saveInDb(product);
}
}
現在、byte []配列として定義された画像を内部的に構成するProductオブジェクトを取得しています。これを文字列として、画像をマルチパートファイルとして個別に受け取ります。
以下は、定義されている私の製品クラス属性です。
private Long pId;
private String model;
private String brand;
private byte[] image; // This is where I want the image to save
private Long price;
private String currency;
private String transmissionType;
private String fuelType;
私は春のブーツを使っているので、ここに私のメインクラスがあります:
package com.practice.rest.assignment1;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class App {
public static void main(String[] args) {
SpringApplication.run(App.class, args);
}
}
私が得る郵便配達のエラーは:
{
"timestamp": 1478611635977,
"status": 400,
"error": "Bad Request",
"exception": "org.springframework.web.multipart.support.MissingServletRequestPartException",
"message": "Required request part 'file' is not present",
"path": "/CatalogueController/addProduct"
}
どこが間違っているのですか?
問題は送信しているJSONパラメータにあると思います。郵便配達員では、パラメータを文字列として表すために開始と末尾に「を置く必要はありません。また、開始と終了を使用する場合は、JSON(JSONオブジェクトのプロパティのキーと値を意味します)内で '(単一引用符)。
削除してみてください'Content-Type: multipart/form-data...'
、ヘッダーのセクション。これで解決しました。
私にとっては、これらの変数をapplication.propertiesに設定するのに役立ちました:
spring.http.multipart.enabled=true
spring.http.multipart.location= /upload
こんにちは@Breaking Benjamin私は同じデモを行いました、そして私の投稿リクエストのコピーがあります:
curl 'http://localhost:9999/api/v1/upload' -H 'Pragma: no-cache' -H 'Origin: chrome-extension://fdmmgilgnpjigdojojpjoooidkmcomcm' -H 'Accept-Encoding: gzip, deflate, br' -H 'Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.6,en;q=0.4' -H 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.71 Safari/537.36' -H 'Content-Type: multipart/form-data; boundary=----WebKitFormBoundary0ae4CymwYLjdqdI1' -H 'Accept: */*' -H 'Cache-Control: no-cache' -H 'Cookie: _ga=GA1.1.433565887.1474948752' -H 'Connection: keep-alive' -H 'DNT: 1' --data-binary $'------WebKitFormBoundary0ae4CymwYLjdqdI1\r\nContent-Disposition: form-data; name="file"; filename="228cb73.jpg"\r\nContent-Type: image/jpeg\r\n\r\n\r\n------WebKitFormBoundary0ae4CymwYLjdqdI1\r\nContent-Disposition: form-data; name="a"\r\n\r\n123\r\n------WebKitFormBoundary0ae4CymwYLjdqdI1--\r\n' --compressed
そして、私のアップロードコントローラーは次のように書かれています:
@RequestMapping(method = RequestMethod.POST)
public ResponseEntity handleUpload(
@RequestParam("a")String a,
@RequestParam("file") MultipartFile multipartFile) throws IOException {
System.out.println(a);
...
私のコンソールでは、param a
が正常に出力されます:
Json文字列を使用してリクエストを再度送信しても、次のようになります。
curl 'http://localhost:9999/api/v1/upload' -H 'Pragma: no-cache' -H 'Origin: chrome-extension://fdmmgilgnpjigdojojpjoooidkmcomcm' -H 'Accept-Encoding: gzip, deflate, br' -H 'Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.6,en;q=0.4' -H 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.71 Safari/537.36' -H 'Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryBTudL55M6S8ENLVt' -H 'Accept: */*' -H 'Cache-Control: no-cache' -H 'Cookie: _ga=GA1.1.433565887.1474948752' -H 'Connection: keep-alive' -H 'DNT: 1' --data-binary $'------WebKitFormBoundaryBTudL55M6S8ENLVt\r\nContent-Disposition: form-data; name="file"; filename="228cb73.jpg"\r\nContent-Type: image/jpeg\r\n\r\n\r\n------WebKitFormBoundaryBTudL55M6S8ENLVt\r\nContent-Disposition: form-data; name="a"\r\n\r\n"{"key":"value"}"\r\n------WebKitFormBoundaryBTudL55M6S8ENLVt--\r\n' --compressed
コードには問題がないようですが、curl
を使用してもう一度リクエストを送信してみてください。これは、postmanの使い方が悪いためかもしれません。
また、以下のプロパティが有効になっているかどうかを確認します。テキストファイルをアップロードする場合は、適切なパラメータとは見なされません。
upload.file.extensions=jpg, jpeg, gif, png