valid subir puede para método mvc imagen formulario escritura encontrar ejemplo con commandname atributo archivos spring-mvc file-upload chunked-encoding multipartform-data

spring-mvc - puede - subir imagen con spring mvc



¿Cómo recibo una carga de archivo en mvc de primavera usando tanto multipart/form como la codificación fragmentada? (2)

Aquí está el controlador para eso

package com.faisalbhagat.web.controller; @Controller @RequestMapping(value = { "" }) public class UploadController { @RequestMapping(value = "/uploadMyFile", method = RequestMethod.POST) @ResponseBody public String handleFileUpload(MultipartHttpServletRequest request) throws Exception { Iterator<String> itrator = request.getFileNames(); MultipartFile multiFile = request.getFile(itrator.next()); try { // just to show that we have actually received the file System.out.println("File Length:" + multiFile.getBytes().length); System.out.println("File Type:" + multiFile.getContentType()); String fileName=multiFile.getOriginalFilename(); System.out.println("File Name:" +fileName); String path=request.getServletContext().getRealPath("/"); //making directories for our required path. byte[] bytes = multiFile.getBytes(); File directory= new File(path+ "/uploads"); directory.mkdirs(); // saving the file File file=new File(directory.getAbsolutePath()+System.getProperty("file.separator")+picture.getName()); BufferedOutputStream stream = new BufferedOutputStream( new FileOutputStream(file)); stream.write(bytes); stream.close(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); throw new Exception("Error while loading the file"); } return toJson("File Uploaded successfully.") } public String toJson(Object data) { ObjectMapper mapper=new ObjectMapper(); StringBuilder builder=new StringBuilder(); try { builder.append(mapper.writeValueAsString(data)); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } return builder.toString(); } }

puede encontrar una solución completa en el código del lado del cliente en http://faisalbhagat.blogspot.com/2014/09/springmvc-fileupload-with-ajax-and.html

Intento escribir un método mvc de primavera que pueda recibir una carga de archivos fragmentados multiparte / formulario o codificación de transferencia. Puedo escribir un método diferente para manejar cada tipo, pero me gustaría hacerlo con el mismo método, así que puedo usar el mismo URL REST POST, como:

http://host:8084/attachments/testupload

Este es mi mejor intento hasta ahora:

@RequestMapping(value = { "/testupload" }, method = RequestMethod.POST, produces = "application/json") public @ResponseBody ResponseEntity<MessageResponseModel> testUpload( @RequestParam(value = "filedata", required = false) MultipartFile filedata, final HttpServletRequest request) throws IOException { InputStream is = null; if (filedata == null) { is = request.getInputStream(); } else { is = filedata.getInputStream(); } byte[] bytes = IOUtils.toByteArray(is); System.out.println("read " + bytes.length + " bytes."); return new ResponseEntity<MessageResponseModel>(null, null, HttpStatus.OK); }

Usando el método anterior, puedo cargar un archivo de varias partes, pero si cargo un archivo fragmentado, recibo una excepción de la primavera que dice:

org.springframework.web.multipart.MultipartException: / The current request is not a multipart request

Si elimino el parámetro de solicitud MultipartFile, funciona muy bien para la codificación de transferencia fragmentada. Si lo dejo funciona muy bien para las cargas de MultipartFile. ¿Cómo puedo hacerlo con el mismo método para manejar ambos tipos de carga?

Esto funciona bien para fragmentado:

@RequestMapping(value = { "/testupload" }, method = RequestMethod.POST, produces = "application/json") public @ResponseBody ResponseEntity<MessageResponseModel> testUpload( final HttpServletRequest request) throws IOException { InputStream is = null; is = request.getInputStream(); byte[] bytes = IOUtils.toByteArray(is); System.out.println("read " + bytes.length + " bytes."); return new ResponseEntity<MessageResponseModel>(null, null, HttpStatus.OK); }

y esto funciona muy bien para MultipartFile:

@RequestMapping(value = { "/testupload" }, method = RequestMethod.POST, produces = "application/json") public @ResponseBody ResponseEntity<MessageResponseModel> testUpload( @RequestParam MultipartFile filedata) throws IOException { InputStream is = null; is = filedata.getInputStream(); byte[] bytes = IOUtils.toByteArray(is); System.out.println("read " + bytes.length + " bytes."); return new ResponseEntity<MessageResponseModel>(null, null, HttpStatus.OK); }

Debería ser posible, ¿alguien sabe cómo hacer esto?

Gracias, Steve


Extracto de mi código (Spring 3.2, carga de archivo blueimp con AngularJS):

/** * Handles chunked file upload, when file exceeds defined chunked size. * * This method is also called by modern browsers and IE >= 10 */ @RequestMapping(value = "/content-files/upload/", method = RequestMethod.POST, headers = "content-type!=multipart/form-data") @ResponseBody public UploadedFile uploadChunked( final HttpServletRequest request, final HttpServletResponse response) { request.getHeader("content-range");//Content-Range:bytes 737280-819199/845769 request.getHeader("content-length"); //845769 request.getHeader("content-disposition"); // Content-Disposition:attachment; filename="Screenshot%20from%202012-12-19%2017:28:01.png" request.getInputStream(); //actual content. //Regex for content range: Pattern.compile("bytes ([0-9]+)-([0-9]+)/([0-9]+)"); //Regex for filename: Pattern.compile("(?<=filename=/").*?(?=/")"); //return whatever you want to json return new UploadedFile(); } /** * Default Multipart file upload. This method should be invoked only by those that do not * support chunked upload. * * If browser supports chunked upload, and file is smaller than chunk, it will invoke * uploadChunked() method instead. * * This is instead a fallback method for IE <=9 */ @RequestMapping(value = "/content-files/upload/", method = RequestMethod.POST, headers = "content-type=multipart/form-data") @ResponseBody public HttpEntity<UploadedFile> uploadMultipart( final HttpServletRequest request, final HttpServletResponse response, @RequestParam("file") final MultipartFile multiPart) { //handle regular MultipartFile // IE <=9 offers to save file, if it is returned as json, so set content type to plain. HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.TEXT_PLAIN); return new HttpEntity<>(new UploadedFile(), headers); }

Esto debería ayudarte a comenzar. Pruebas mínimas hechas en IE8, IE9, IE10, Chrome, FF. Por supuesto, puede haber problemas, y probablemente haya una manera más fácil de extraer rangos de contenido, pero ... funciona para mí.