2011-08-30 3 views
2

J'ai un problème avec Ajax upload avec Spring 3 MVC. Je comprends que je dois configurer le bean multipartResolver dans Spring Config, ce que j'ai fait. Que je peux avoir le contrôleur comme ceSpring MVC avec téléchargement de fichiers ajax et MultipartFile

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

Le problème est que lorsque j'envoie en fait la demande au serveur (valums effectivement le téléchargement de fichiers Ajax fait pour moi), je reçois une réponse d'erreur interne du serveur et rien ne montre dans les journaux. Je me gratte vraiment la tête maintenant, car je n'arrive pas à comprendre le problème.

+0

Stack serait utile pour diagnostiquer – atrain

+0

Oui ce serait, et est la principale raison pour laquelle je vous demande ici, parce qu'il n'y a aucune trace de pile du conteneur que ce soit –

Répondre

1

Lorsque vous utilisez valums plug-in, je résolu ce problème en utilisant @RequestBody annotation de printemps . Vous pouvez réécrire votre code comme suit:

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

Notez que la body variable contiendra le contenu du fichier téléchargé. Il n'y a pas non plus de déclaration de méthode dans votre exemple, ce qui signifie que votre méthode sera mappée à la requête GET.

P.S. J'ai également eu ce problème "pas de limite multipart" lors de l'analyse de la requête avec Apache Commons. HttpServletRequest#getParts() renvoie juste une collection vide.

1

@Tomas J'ai rencontré le même problème en utilisant le même plugin jquery. Veuillez changer le type de contenu dans le code du plugin en xhr.setRequestHeader ("Content-Type", "multipart/form-data"); sur mon plugin sa ligne 1203, après ceci il montre maintenant une trace de pile, cependant je rencontre un autre problème où les logs sont en train d'imprimer: 8 septembre 2011 09:43:39 AM org.apache.catalina.core.StandardWrapperValve invoke GRAVES: Servlet.service() pour répartiteur de servlet a jeté exception org.apache.commons.fileupload.FileUploadException: la demande a été rejetée parce qu'aucune limite n'a été trouvée multipart

3

ma solution:

@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

Selon mon observation, le plug-in de téléchargement de fichier ne pas envoyer un fichier multipart mais envoie un flux. Je pourrais le faire fonctionner en déclarant que la méthode du contrôleur acceptait le nom de fichier en tant que paramètre de requête qqfile et le second paramètre en tant que httprequest. J'ai ensuite effectué un traitement supplémentaire en utilisant request.getinputstream. J'espère que cela pourra aider!

Cordialement,

Pradyumna

2

J'ai eu le même problème avec le fineuploader (valums), et j'essayé d'utiliser request.getInputStream() mais n'a pas eu à travailler. L'annotation @ResponseBody a fonctionné mais j'ai récupéré tout le corps avec des en-têtes. Je pensais que le traitement et l'élimination des morceaux indésirables n'étaient pas très élégants. Je regardais plus loin et trouvé la solution est ce post:

problem with spring ajax file upload

Comme il est dit, j'ai ajouté la configuration de haricot pour le résolveur multipart à ma configuration de printemps

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

Après cela, je pourrait facilement récupérer mon fichier en utilisant

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

ne pas oublier d'ajouter l'Apache communes-io.jar et communes-fileupload.jar bibliothèques dans votre projet pour faire fonctionner trace

Questions connexes