2012-06-01 4 views
21

quiero guardar las imágenes subidas a una carpeta específica en una aplicación Spring 3 MVC desplegados en TomcatSpring MVC save subido MultipartFile a carpeta específica

Mi problema es que no puedo guardar las imágenes subidas archivos al host donde el aplicación está en ejecución.

Aquí es lo que he intentado:

private void saveFile(MultipartFile multipartFile, int id) throws Exception { 
    String destination = "/images/" + id + "/" + multipartFile.getOriginalFilename(); 
    File file = new File(destination); 
    multipartFile.transferTo(file); 
} 

Resultado: FileNotFoundException - Sí claro, yo quiero crear este archivo!?!

Lo intenté usando context.getRealPath o getResources("destination"), pero sin éxito.

¿Cómo puedo crear un nuevo archivo en una carpeta específica de mi aplicación con el contenido de mi archivo multiparte?

+0

Qué errores llegaste cuando intentó context.getRealPath o getResources (" destino ") vea http://stackoverflow.com/questions/2970643/create-a-file-and-store-in-java-web-application-folder –

+0

Ah bien, gracias, getRealPath no funcionó, porque devuelve null si la aplicación se implementó en un archivo war y no se extrajo ¡Está trabajando fuera del contenedor de guerra! Pero, ¿hay alguna opción para obtener el camino a un archivo dentro de una guerra? – Alexander

+0

No diría eso. Realmente no tiene sentido agregar archivos a una guerra desplegada. ¿Es eso lo que quieres hacer? –

Respuesta

20

Este código seguramente le ayudará.

String filePath = request.getServletContext().getRealPath("/"); 
multipartFile.transferTo(new File(filePath)); 
+0

pero sin usar la solicitud http servlet ¿cómo podemos obtener la ruta ...? –

+0

Hay muchas formas: puede usar solicitud o sesión para obtener la ruta real. Gracias Ravi. M – Phuong

6

Vamos a crear las subidas directorio en el módulo web y guardar archivos en webapp/uploads:

@RestController 
public class GreetingController { 

    private final static Logger log = LoggerFactory.getLogger(GreetingController.class); 

    @Autowired 
    private HttpServletRequest request; 


    @RequestMapping(value = "/uploadfile", method = RequestMethod.POST) 
     public 
     @ResponseBody 
     ResponseEntity handleFileUpload(@RequestParam("file") MultipartFile file) { 
      if (!file.isEmpty()) { 
       try { 
        String uploadsDir = "/uploads/"; 
        String realPathtoUploads = request.getServletContext().getRealPath(uploadsDir); 
        if(! new File(realPathtoUploads).exists()) 
        { 
         new File(realPathtoUploads).mkdir(); 
        } 

        log.info("realPathtoUploads = {}", realPathtoUploads); 


        String orgName = file.getOriginalFilename(); 
        String filePath = realPathtoUploads + orgName; 
        File dest = new File(filePath); 
        file.transferTo(dest); 

el código
String realPathtoUploads = request.getServletContext().getRealPath(uploadsDir);

me devuelve la próxima ruta si corro el aplicación de Idea IDE
C:\Users\Iuliia\IdeaProjects\ENumbersBackend\src\main\webapp\uploads\

y la próxima ruta si hago .war y ejecutar el programa bajo Tomcat:
D:\Programs_Files\apache-tomcat-8.0.27\webapps\enumbservice-0.2.0\uploads\

Mi estructura del proyecto:
enter image description here

+0

La última línea del código 'file.transferTo (dest);' me da una excepción IO y el mensaje de error es "El sistema no puede encontrar la ruta especificada". ¿Alguna idea de por qué está pasando esto? –

+1

@AND, ¿está seguro de que la ruta existe en su sistema de archivos? Primero necesita crear directorios (manual o programáticamente). –

1

vi un muelle 3 ejemplo usando la configuración de XML (tenga en cuenta que esto hace no wok para la primavera 4,2 *):. http://www.devmanuals.com/tutorials/java/spring/spring3/mvc/spring3-mvc-upload-file.html `

<bean id="multipartResolver" 
 
class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> 
 
<property name="maxUploadSize" value="100000" /> 
 
<property name="uploadTempDir" ref="uploadDirResource" /> 
 
</bean> 
 

 
<bean id="uploadDirResource" class="org.springframework.core.io.FileSystemResource"> 
 
<constructor-arg> 
 
<value>C:/test111</value> 
 
</constructor-arg> 
 
</bean>

0
String ApplicationPath = 
     ContextLoader.getCurrentWebApplicationContext().getServletContext().getRealPath(""); 

Esta es la forma de conseguir el camino real de la aplicación en la primavera (sin utilizar la respuesta, sesión ...)

+1

no debe usar 'getRealPath()' para guardar archivos .. vea [esta respuesta] (https://stackoverflow.com/a/12160863/3891638) – cozyconemotel