2010-01-07 17 views
11

Sí, nuestro cliente desea cargar más de un archivo. utilizamos resorte 3 mvc. el ejemplo funcionario de la siguiente manera:primavera 3 cargar muchos archivos

marcado:

<form method="post" action="/form" enctype="multipart/form-data"> 
    <input type="text" name="name"/> 
    <input type="file" name="file"/> 
    <input type="submit"/> 
</form> 

código:

@RequestMapping(value = "/form", method = RequestMethod.POST) 
public String handleFormUpload(@RequestParam("name") String name, 
           @RequestParam("file") MultipartFile file) { 

    if (!file.isEmpty()) { 
    byte[] bytes = file.getBytes(); 
    // store the bytes somewhere 
    return "redirect:uploadSuccess"; 
    } else { 
    return "redirect:uploadFailure"; 
    } 
} 

sólo hay un archivo, por lo que puede escribir el nombre de archivo de entrada en el método. , pero ¿qué debo hacer si deseo subir muchos archivos? no pude escribir todos los nombres de entrada de archivos porque si es generado por el código js. solo sé que su nombre es 'attach_' , entonces, ¿qué debo escribir en el método? Si escribo como esto

@RequestParam() MultipartFile file 

o

@RequestParam("attach_") MultipartFile file 

Voy a buscar un error.

Respuesta

10

lo tengo trabajando con Spring 3.0.4 (que había un problema en las versiones anteriores de la primavera, así que asegúrese de usar> = 3.0.4) .

Para probarlo, puede utilizar los siguientes pasos:

public class MultiPartFileUploadBean { 

    private List<MultipartFile> files; 

    public void setFiles(List<MultipartFile> files) { 
     this.files = files; 
    } 

    public List<MultipartFile> getFiles() { 
     return files; 
    } 
} 

El controlador:

@RequestMapping(value = "/uploadtest", method = RequestMethod.POST) 
public String uploadtestProcess(MultiPartFileUploadBean file, BindingResult bindingResult, 
     Model model) throws IOException { 
    ... // binding check 
    StringBuilder sb = new StringBuilder(); 
    List<MultipartFile> files = file.getFiles(); 
    for(MultipartFile f:files) 
     sb.append(String.format("File: %s, contains: %s<br/>\n",f.getOriginalFilename(),new String(f.getBytes()))); 
    String content = sb.toString(); 
    model.addAttribute("content", content); 
    return "uploadtest"; 
} 

jsp:

<form method="post" action="/uploadtest" enctype="multipart/form-data"> 
<p>Type: <input type="text" name="type" value="multiPartFileSingle" size="60" /></p> 
<p>File 1: <input type="file" name="files[0]" size="60" /></p> 
<p>File 2: <input type="file" name="files[1]" size="60" /></p> 
<p><input type="submit" value="Upload" /></p> 
</form> 
<c:if test="${not empty content}"> 
<p>The content uploaded: <br/>${content}</p> 
+0

Estoy recibiendo Http 400, una mala solicitud usando su código, ¿alguna idea? – Wint

+0

voto abajo, porque es innecesariamente complicada y la respuesta de Spider debería tener la mayor cantidad de votos – Johannes

8

Una manera mucho más simple - trabaja para yo

/*** Upload Images ***/ 
@RequestMapping(value = "/images/upload", method = RequestMethod.POST) 
public void upload(@RequestParam("file") List<MultipartFile> files, @RequestParam("user") String user) { 

    files.forEach((file -> System.out.println(file.getOriginalFilename()))); 

} 
1

I conocer más clara para utilizar el objeto MultipartHttpServletRequest como un parámetro para el método controlador:

@RequestMapping(value = "/save", method=RequestMethod.POST) 
protected String save(Model model, MultipartHttpServletRequest multipartRequest) { 
    MultipartFile file = multipartRequest.getFile("field-name"); 
    // Also multiple files with same name 
    List<MultipartFile> files = multipartRequest.getFiles("multifield-name"); 
    // ... 
} 

Enlace a los docs: http://docs.spring.io/spring/docs/current/spring-framework-reference/html/mvc.html#mvc-multipart-resolver-commons

+0

También puede usar multipartRequest.getFileMap() :) –

0

Se utiliza el modelo y la forma.

(HTML/JSP)

<form id="uploadForm" method="POST"enctype="multipart/form-data/charset=UTF-8"> 
    //...multi file, add dynamic input 
    <input type="file" name="file"/> 
    <input type="file" name="file"/> 
    <input type="file" name="file"/> 
    <input type="file" name="file"/> 
</form> 
<input type="button" id="save_button" value="save" /> 

(Js)

var form = new FormData(document 
     .getElementById('uploadForm')); 

$.ajax({ 
    url : "/test/upload/file, 
    type : 'POST', 
    dataType : 'text', 
    data : form, 

    processData : false, 
    contentType : false, 

    success : function(response) { 
     if (response == "success") { 
      document.location.reload(true); 

     } else { 
      $("#editMsg").text("fail"); 
     } 
    }, 
    error : function(request, status, error) { 

    } 
}); 

(Modelo)

public class fileModel { 
    private List<MultipartFile> file; // this name = input name 

    ... setter, getter 
} 

(Controller)

@RequestMapping(value = "/upload/file", method = RequestMethod.POST) 
public @ResponseBody String uploadFiles(fileModel model, HttpServletRequest req) { 

    return "success" // <-- debug. break point !! Your watch model. 
} 
Cuestiones relacionadas