2010-01-14 30 views
12

Estoy intentando escribir un archivo multiparte cargado en el sistema de archivos. Tengo un directorio llamado audio que se encuentra en la raíz de mi aplicación web (no dentro de WEB-INF, pero a su lado, a su acceso público como css y javascript).Obtener la raíz de la aplicación web desde Spring Controller

Quiero escribir el archivo cargado en ese directorio pero parece que no puedo encontrar el camino que necesito. Pensé que podría funcionar un ServletContext() y luego usar realPath(), pero no tengo una referencia a ServletContext a través de un controlador de Spring. Gracias por cualquier hep

@RequestMapping(value="/uploadSample") 
public ModelAndView upload(HttpServletRequest request, HttpServletResponse response, @RequestParam("file") MultipartFile f) { 

    if (f == null) { 
     return new ModelAndView("upload", "msg", "The file is null."); 
    } 
    try { 
     // I need to set AUDIO_PATH to <webAppRoot>/audio 
     FileOutputStream file = new FileOutputStream(AUDIO_PATH + "/" + f.getOriginalFilename()); 
     file.write(f.getBytes()); 
     file.close(); 
    } 
    catch (FileNotFoundException ex) { 
     Logger.getLogger(SampleUploadController.class.getName()).log(Level.SEVERE, null, ex); 
    } 
    catch (IOException ex) { 
      Logger.getLogger(SampleUploadController.class.getName()).log(Level.SEVERE, null, ex); 
    } 



    return new ModelAndView("upload", "msg", "File (" + f.getOriginalFilename() + ") successfully uploaded."); 
} 

}

+0

Gracias por hacerme esta pregunta, fue bastante útil ya que también tuve este problema. – MetroidFan2002

Respuesta

11

pensé conseguir un ServletContext() a continuación, utilizando la ruta real() puede funcionar, pero no tener una referencia a ServletContext

Sí lo haces. Ver HttpServletRequest.getSession().getServletContext()

+0

perfecto, esto solucionó las cosas para mí. Gracias. –

+4

Esto no funcionará, sin embargo, si no tiene una sesión y desea permanecer sin sesión. Ver la respuesta de axtavt. – Paul

26

Para llegar referencia a ServletContext, su clase puede implementar ServletContextAware

EDIT:ServletContext es también accesible en el contenedor de aplicaciones web bajo el nombre de frijol servletContext, por lo que se puede inyectar como cualquier otro frijol en Primavera.

+0

limpio, no sabía que había un frijol incorporado para esto. Gracias. –

+1

Esta es la mejor respuesta. Funciona incluso si no tiene una sesión, y la inyección de dependencia es la forma de primavera después de todo. – Paul

+0

no funciona. en caso de que no esté dentro de un servlet ... obtengo el objeto "context", pero getContextPath devuelve null. – OhadR

0

Obtener la URL del servidor utilizando ServletContext no es seguro en diferentes entornos.

Sería mejor recuperar la url de un archivo de propiedades.

Cuestiones relacionadas