簡體   English   中英

Spring boot 上傳表單數據和文件

[英]Spring boot upload form data and file

我正在制作一個 Spring Boot REST 應用程序。 我正在嘗試制作一個多部分表單上傳控制器,它將一起處理表單數據和文件上傳。 這是我目前的控制器代碼:

    @RequestMapping(value = "", method = RequestMethod.POST, headers="Content-Type=multipart/form-data")
    @PreAuthorize("hasRole('ROLE_MODERATOR')")
    @ResponseStatus(HttpStatus.CREATED)
    public void createNewObjectWithImage(
            /*@RequestParam(value="file", required=true) MultipartFile file,
            @RequestParam(value="param_name_1", required=true) final String param_name_1,
            @RequestParam(value="param_name_2", required=true) final String param_name_2,
            @RequestParam(value="param_name_3", required=true) final String param_name_3,
            @RequestParam(value="param_name_4", required=true) final String param_name_4,
            @RequestParam(value="param_name_5", required=true) final String param_name_5*/
            @ModelAttribute ModelDTO model,
            BindingResult result) throws MyRestPreconditionsException {

        //ModelDTO model = new ModelDTO(param_name_1, param_name_2, param_name_3, param_name_4, param_name_5);

        modelValidator.validate(model, result);
        if(result.hasErrors()){
            MyRestPreconditionsException ex = new MyRestPreconditionsException(
                    "Model creation error",
                    "Some of the elements in the request are missing or invalid");
            ex.getErrors().addAll(
                    result.getFieldErrors().stream().map(f -> f.getField()+" - "+f.getDefaultMessage()).collect(Collectors.toList()));
            throw ex;
        }
// at the moment, model has a MultipartFile property
        //model.setImage(file);
        modelServiceImpl.addNew(model);
    }

我已經嘗試過 @ModelAttribute 注釋和發送請求參數,但這兩種方法都失敗了。

這是我發送的請求:

---------------------------acebdf13572468
Content-Disposition: form-data; name="file"; filename="mint.jpg"
Content-Type: image/jpeg

<@INCLUDE *C:\Users\Lazaruss\Desktop\mint.jpg*@>
---------------------------acebdf13572468
Content-Disposition: form-data; name=”param_name_1”

string_value_1
---------------------------acebdf13572468
Content-Disposition: form-data; name=”param_name_2”

string_value_2
---------------------------acebdf13572468
Content-Disposition: form-data; name=”param_name_3”

string_value_3
---------------------------acebdf13572468
Content-Disposition: form-data; name=”param_name_4”

string_value_4
---------------------------acebdf13572468
Content-Disposition: form-data; name=”param_name_5”

string_value_5
---------------------------acebdf13572468--

我的應用程序是無狀態的,並與權威一起使用 spring 安全性。 在我的安全包中,我包含了 AbstractSecurityWebApplicationInitializer 類

public class SecurityApplicationInitializer extends AbstractSecurityWebApplicationInitializer {

    @Override
    protected void beforeSpringSecurityFilterChain(ServletContext servletContext) {
            insertFilters(servletContext, new MultipartFilter());
        }
    }

我還在 @Configuration 類中使用了 StandardServletMultipartResolver

在我的 WebInitializer 中,我添加了以下代碼:

MultipartConfigElement multipartConfigElement = new MultipartConfigElement("/tmp", 
                3 * 1024 * 1024, 6 * 1024 * 1024, 1 * 512 * 1024);        
apiSR.setMultipartConfig(multipartConfigElement);

當我嘗試使用帶有注釋代碼(@RequestParams 注釋)的控制器時,出現 404 not found 錯誤。 當我嘗試使用帶有 @ModuleAttribute 注釋的控制器時,模型對象為空。

我有一個類似的問題。 當您想發送Object + Multipart 你必須(或者至少我不知道其他解決方案)讓你的控制器像這樣:

public void createNewObjectWithImage(@RequestParam("model") String model, @RequestParam(value = "file", required = false) MultipartFile file)

然后:使用以下方法將字符串轉換為您的對象:

ObjectMapper mapper = new ObjectMapper();
ModelDTO modelDTO = mapper.readValue(model, ModelDTO.class);

在 Postman 中,您可以這樣發送: 在此處輸入圖片說明

可以接收對象和文件

@PostMapping(value = "/v1/catalog/create", consumes = MediaType.MULTIPART_FORM_DATA_VALUE )
public void createNewObjectWithImage(
         @RequestPart ModelTO modelTO,
         @RequestPart MultipartFile image)

模型TO

public class ModelTO {

    private String name;


    public ModelTO() {
        super();
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

}

和卷曲示例:

curl -X POST "https://your-url.com/v1/catalog/create" -H  "accept: application/json;charset=UTF-8" -H  "Content-Type: multipart/form-data" -F "image=@/pathtoimage/powerRager.jpg;type=image/jpeg" -F "modelTO={\"name\":\"White\"};type=application/json;charset=utf-8"

郵遞員和其他軟件不支持表單數據參數的發送應用程序/json 類型。

暫無
暫無

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

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