복붙노트

[SPRING] 아약스 파일 업로드 및 MultipartFile이있는 Spring MVC

SPRING

아약스 파일 업로드 및 MultipartFile이있는 Spring MVC

스프링 3 MVC로 Ajax 업로드를 사용하는 데 문제가 있습니다. Spring config에서 multipartResolver 빈을 구성해야한다는 것을 이해합니다. 내가 컨트롤러를 가질 수있는 것보다

@RequestMapping(value ="/settingsSim")
@ResponseBody
public Map uploadSimSettings(@RequestParam(value="qqfile", required=true) MultipartFile settings) {
 Map<String, Object> ret = new HashMap<String, Object>();
 return ret;
}

문제는 내가 실제로 서버에 요청을 보낼 때 (실제로 valum Ajax 파일 업로드가 나를 위해이 작업을 수행함) 내부 서버 오류 응답이 나타나고 로그에 아무것도 표시되지 않는다는 것입니다. 문제를 파악할 수 없기 때문에 지금 당장 머리를 긁적입니다.

해결법

  1. ==============================

    1.valums 플러그인을 사용할 때 @RequestBody Spring annotation을 사용하여이 문제를 해결했습니다. 다음과 같이 코드를 다시 작성할 수 있습니다.

    valums 플러그인을 사용할 때 @RequestBody Spring annotation을 사용하여이 문제를 해결했습니다. 다음과 같이 코드를 다시 작성할 수 있습니다.

    @RequestMapping(value ="/settingsSim",method=RequestMethod.POST)
    @ResponseBody
    public Map uploadSimSettings(@RequestBody String body) {
     /*
     some controller logic 
     */
    }
    

    변수 본문에는 업로드 된 파일의 내용이 포함됩니다. 또한 메서드에 메서드 선언이 없으므로 메서드가 GET 요청에 매핑됩니다.

    추신 Apache Commons와의 요청을 파싱 할 때도 "다중 부분 경계 없음"문제가 발생했습니다. HttpServletRequest # getParts ()는 빈 콜렉션을 반환합니다.

  2. ==============================

    2.내 솔루션 :

    내 솔루션 :

    @RequestMapping(value = "/create/upload", method = RequestMethod.POST, consumes="multipart/form-data", produces="application/json")
    @ResponseBody()
    public String handleImageUpload(@RequestParam(value="qqfile", required=true) MultipartFile[] files, 
            @ModelAttribute(value="files") List<MultipartFile> filesSession) throws IOException, FileUploadException {
    
        if (files.length > 0) {
            filesSession.addAll(Arrays.asList(files));
            // store the bytes somewhere
            return  "{\"success\": true}";
        }
        else {
            return "{\"success\": false}";
        }
    }
    
    @RequestMapping(value = "/create/upload", method = RequestMethod.POST, consumes="application/octet-stream", produces="application/json")
    @ResponseBody()
    public String handleImageUploadApplication(HttpServletRequest request, 
            @ModelAttribute(value="files") List<MultipartFile> filesSession) throws IOException, FileUploadException {
    
        if (request.getInputStream() != null) {
            // creamos el fichero temporal
            File file = File.createTempFile("file", "valumns",
                    RepositoryData.getRepositoryData());
            FileOutputStream fos = new FileOutputStream(file);
            // copiamos contenido
            Streams.copy(request.getInputStream(), fos, true);
            //TODO: 
            //filesSession.addAll(Arrays.asList(files));
            // store the bytes somewhere
            return  "{\"success\": true}";
        }
        else {
            return  "{\"success\": true}";
        }
    }
    
    @ExceptionHandler(Exception.class)
    @ResponseStatus(value = HttpStatus.SERVICE_UNAVAILABLE)
    public void handleException(Exception ex) {
        log.error("Ocurrio un error en el album", ex);
    }
    
  3. ==============================

    3.나는 fineuploader (valums)와 같은 문제가 있었고, request.getInputStream ()을 사용해 보았지만 작동시키지 못했습니다.

    나는 fineuploader (valums)와 같은 문제가 있었고, request.getInputStream ()을 사용해 보았지만 작동시키지 못했습니다.

    @ResponseBody 주석은 작동했지만 헤더가있는 전신이 있습니다. 나는 그것을 처리하고 원치 않는 덩어리를 제거하는 것이 매우 우아하지 않다고 생각했습니다. 나는 더 멀리 보았고 그 해결책이이 포스트라는 것을 알았다 :

    봄 아약스 파일 업로드 문제

    그것이 말했듯이, 다중 구성 분석기에 대한 빈 구성을 스프링 구성에 추가했습니다.

    <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
    </bean>
    

    그 후, 나는 쉽게 내 파일을 검색 할 수 있었다.

     public @ResponseBody Map ajaxUploadFile(@RequestParam MultipartFile qqfile) { ... }
    

    프로젝트에 아파치 commons-io.jar 및 commons-fileupload.jar 라이브러리를 추가하여 작동하게하십시오.

  4. ==============================

    4.@ 토마스 동일한 jquery 플러그인을 사용하는 동안 동일한 문제가 발생했습니다. 플러그인 코드의 Content-Type을 xhr.setRequestHeader ( "Content-Type", "multipart / form-data")로 변경하십시오. 내 플러그인 1203,이 후 지금은 스택 추적을 보여 주지만 로그가 인쇄되고있는 또 다른 문제가 발생했습니다. 2011 년 9 월 8 일 9:43:39 org.apache.catalina.core.StandardWrapperValve invoke 심각 : 서블릿 디스패처 용 Servlet.service ()가 예외를 던졌습니다. org.apache.commons.fileupload.FileUploadException : 다중 부분 경계가 발견되지 않아 요청이 거부되었습니다.

    @ 토마스 동일한 jquery 플러그인을 사용하는 동안 동일한 문제가 발생했습니다. 플러그인 코드의 Content-Type을 xhr.setRequestHeader ( "Content-Type", "multipart / form-data")로 변경하십시오. 내 플러그인 1203,이 후 지금은 스택 추적을 보여 주지만 로그가 인쇄되고있는 또 다른 문제가 발생했습니다. 2011 년 9 월 8 일 9:43:39 org.apache.catalina.core.StandardWrapperValve invoke 심각 : 서블릿 디스패처 용 Servlet.service ()가 예외를 던졌습니다. org.apache.commons.fileupload.FileUploadException : 다중 부분 경계가 발견되지 않아 요청이 거부되었습니다.

  5. ==============================

    5.내 관찰에 따르면 파일 업로드 플러그인은 멀티 파트 파일을 보내지 않고 스트림을 보냅니다. 제어기 메소드가 filename을 요청 param qqfile로, 두 번째 매개 변수를 httprequest로 받아들임으로써 작동하도록 할 수 있습니다. 그런 다음 request.getinputstream을 사용하여 추가 처리를 수행했습니다. 희망이 도움이됩니다!

    내 관찰에 따르면 파일 업로드 플러그인은 멀티 파트 파일을 보내지 않고 스트림을 보냅니다. 제어기 메소드가 filename을 요청 param qqfile로, 두 번째 매개 변수를 httprequest로 받아들임으로써 작동하도록 할 수 있습니다. 그런 다음 request.getinputstream을 사용하여 추가 처리를 수행했습니다. 희망이 도움이됩니다!

    문안 인사,

    프라 디마

  6. from https://stackoverflow.com/questions/7246041/spring-mvc-with-ajax-file-upload-and-multipartfile by cc-by-sa and MIT license