2016-11-08 16 views
4

私は郵便配達員を通じて画像を自分のレストAPIにアップロードしたかったのです。私は春のブートフレームワークを使用しています。私はそれがマルチパートの境界エラーを出したので、他のスタックオーバーフローの答えに見られるよう郵便番号:必須のリクエストパート 'ファイル'がありません

enter image description here

私も任意の任意のヘッダを設定していない:ここではスクリーンショットです。

は今、以下の私のコントローラのコードです:

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); 

    } 

} 

今、私は内部的にバイト[]配列として定義された画像を構成されてProductオブジェクトを取っています。私は文字列とこれをMultipartファイルとして別々に取ります。以下は

私の製品クラスの属性が定義されています

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" 
} 

どこが間違っていますか?

答えて

1

問題は送信しているJSONパラメータにあると思います。郵便配達では、始まりと終わりを "文字列としてパラメータを表すために配置する必要はありません。 また、開始と終了を使用する場合はJSONオブジェクト(プロパティキーと値) (一重引用符)。

+0

開始と終了の二重引用符を削除するだけで済みました。ファイルリクエスト部にエラーがスローされてしまったのはとても奇妙です。ありがとう!! –

0

こんにちは@Breakingベンジャミン私は同じデモをした、と私のポスト要求コピーがあります:

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が正常に出力されます。

param a output

私は要求を再送信するために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 

をそれはだが、あなたのコードはokですに見えますが、あなたは要求を再送信するためにcurlを使用しようとするだろう、多分これは郵便配達のためにあなたの悪い使い方です。

1

'Content-Type: multipart/form-data...'、ヘッダーのセクションを削除してみてください。それは私のためにこれを解決しました。