2011-08-30 50 views
2

我有一個使用Spring 3 MVC進行Ajax上傳的問題。我明白我必須在spring配置中配置multipartResolver bean,我已經完成了。比我能有控制器這樣使用ajax文件上傳和MultipartFile的Spring MVC

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

的問題是,當我真正發送請求到服務器(實際上valums阿賈克斯文件上載做到這一點對我來說),我得到一個內部服務器錯誤響應,並沒有什麼出在日誌中。我現在真的很撓頭,因爲我無法弄清楚問題所在。

+0

堆棧跟蹤將有助於診斷 – atrain

+0

是它會,這是我問這裏的主要原因,因爲沒有任何來自容器的堆棧跟蹤 –

回答

1

當使用valums插件,我用@RequestBody春天註解解決了這個問題。 可以按如下步驟重寫代碼:

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

注意變量body將包含上傳文件的內容。您的示例中也沒有方法聲明,這意味着您的方法將映射到GET請求。

P.S.在使用Apache Commons解析請求時,我也有這個「沒有多部分邊界」的問題。 HttpServletRequest#getParts()只返回一個空集合。

1

@Tomas我在使用相同的jquery插件時遇到同樣的問題。請將插件代碼中的Content-Type更改爲xhr.setRequestHeader(「Content-Type」,「multipart/form-data」);在我的插件的行1203,此後它現在顯示堆棧跟蹤,但是我遇到另一個問題,日誌正在打印: 2011年9月8日上午9時43分39秒org.apache.catalina.core.StandardWrapperValve調用 重度:Servlet.service()進行servlet調度拋出異常 org.apache.commons.fileupload.FileUploadException:請求被拒絕,因爲沒有多邊界發現

3

我的解決方案:

@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); 
} 
1

按我的觀察,文件上傳插件不發送多文件,但發送流。我可以通過聲明控制器方法來接受文件名作爲請求參數qqfile和第二個參數作爲httprequest。然後我使用request.getinputstream進行了進一步的處理。希望有所幫助!

問候,

Pradyumna

2

我有同樣的問題與fineuploader(valums),我嘗試使用request.getInputStream(),但沒有得到它的工作。

@ResponseBody註釋工作,但我得到了與標題整個身體。我認爲處理和剝離不需要的塊不是很優雅。 我還看了一下,發現該解決方案是這一職位:

problem with spring ajax file upload

就像是說,我添加了多解析器的bean的配置,我的春天配置

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

在那之後,我可以很容易地檢索我的文件使用

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

不要忘了添加Apache 個公地io.jar公地fileupload.jar庫在項目中得到它的工作

相關問題