source

스프링 부팅에서 다중 파트 경계를 찾을 수 없으므로 요청이 거부되었습니다.

ittop 2023. 2. 26. 10:31
반응형

스프링 부팅에서 다중 파트 경계를 찾을 수 없으므로 요청이 거부되었습니다.

스프링 부츠나 우편배달부 크롬 애드온과 함께 웹 서비스로 시도하고 있습니다.

집배원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;
}

문제는 이 설정을 하고 있는 것입니다.Content-Type그냥 비워두세요.구글 크롬이 대신 해줄 것이다.멀티파트Content-Type파일 경계를 알아야 합니다.또, 파일 경계를 삭제했을 경우,Content-Type우체부가 자동으로 처리해 드릴 겁니다.

우편 배달원의 내용 유형을 선택 해제하면 우편 배달원이 런타임에 입력한 내용에 따라 내용 유형을 자동으로 탐지합니다.

샘플

Postman을 통해 SpringMVC 백엔드 웹 앱에 파일 업로드:

백엔드:

집배원:

Postman에서 POST 요청을 할 때도 같은 문제가 발생했는데, 나중에 Custom Content-Type을 경계값과 함께 설정함으로써 문제를 해결할 수 있었습니다.

저는 사람들이 비슷한 문제에 직면할 수 있다고 생각했기 때문에 제 해결책을 공유합니다.

집배원

집배원한테 할 수 있다면서요?

플레이스 홀더

"Postman - REST Client"는 content-type 설정으로 사후 작업을 수행하는 데 적합하지 않습니다.Advanced REST 클라이언트 등을 사용해 볼 수 있습니다.

또한 Spring 3.1 M2 이후 헤더는 소비 및 생산으로 대체되었습니다.https://spring.io/blog/2011/06/13/spring-3-1-m2-spring-mvc-enhancements 를 참조해 주세요.그리고 직접 사용할 수 있습니다.produces = MediaType.MULTIPART_FORM_DATA_VALUE.

이 문제는 제가 axios를 기반으로 쓰는 request.js를 사용하기 때문에 발생하였습니다.
디폴트 설정은 이미 완료했습니다.headers in request.request.syslog

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.post('/manage/product/upload.do',
      param
    )

이것이 당신의 문제를 해결할 수 있기를 바랍니다.

우체부를 이용하여 5.6M의 파일을 외부 네트워크로 보낼 때도 같은 문제에 직면했습니다.내 컴퓨터 및 로컬 테스트 환경에서도 동일한 작업이 성공합니다.

모든 서버 설정과 HTTP 헤더를 확인한 결과, Postman이 외부 HTTP 요구에 대한 요구를 시뮬레이션하는 데 문제가 있을 수 있다는 것을 알게 되었습니다.마지막으로 크롬 HTML 페이지에서 sendfile 요청을 성공적으로 완료하였습니다.참고용으로만:)

아래의 간단한 코드로 시도하실 수 있습니다. 작동하실 겁니다.Advanced REST Client에서 테스트했습니다.아래의 스크린샷은 설정에 도움이 됩니다.

package com.example.demo;

import java.io.FileOutputStream;
import java.io.IOException;

import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

@RestController
public class ImageUploadController {

    @PostMapping("image-upload")
    public String uploadImage(@RequestParam MultipartFile myFile) throws IOException {
        
        byte[] bytes = myFile.getBytes();

        FileOutputStream fileOutputStream = new FileOutputStream("image.jpg");

        fileOutputStream.write(bytes);
        fileOutputStream.close();
        
        return "Image uploaded successfully..!";

    }
}

여기에 이미지 설명 입력

업로드된 이미지는 프로젝트의 아래 위치에서 찾을 수 있습니다.

여기에 이미지 설명 입력

또한 컨트롤러가 @SpringBootApplication 패키지의 패키지에 포함되어 있어야 하는지 확인하십시오.아래 이미지를 참조할 수 있습니다.

여기에 이미지 설명 입력

ARC(Advanced Rest 클라이언트)의 새로운 버전에서는 파일 업로드 옵션도 제공됩니다.

여기에 이미지 설명 입력

언급URL : https://stackoverflow.com/questions/36005436/the-request-was-rejected-because-no-multipart-boundary-was-found-in-springboot

반응형