2010-01-14 10 views
12

Sto provando a scrivere un file multipart caricato nel filesystem. Ho una directory chiamata audio che si trova nella radice della mia applicazione web (non all'interno di WEB-INF, ma accanto ad essa è pubblicamente accessibile come css e javascript).Ottieni root Web App da Spring Controller

Voglio scrivere il file caricato in quella directory ma non riesco a trovare il percorso che mi serve. Ho pensato che ottenere un ServletContext(), quindi usando realPath(), potrebbe funzionare, ma non ho un riferimento a ServletContext tramite un controller Spring. Grazie per qualsiasi 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

Grazie per avermi fatto questa domanda, è stato molto utile dato che avevo appena avuto questo problema. – MetroidFan2002

risposta

11

ho pensato di ottenere un ServletContext() quindi utilizzando realpath() può funzionare, ma io non ho un riferimento a ServletContext

Sì, sì. Vedi HttpServletRequest.getSession().getServletContext()

+0

perfetto, questo ha risolto le cose per me. Grazie. –

+4

Tuttavia, ciò non funzionerà se non si dispone di una sessione e si desidera rimanere senza sessione. Vedi la risposta di axtavt. – Paul

26

Per raggiungere riferimento alla ServletContext, la vostra classe può implementare ServletContextAware

EDIT:ServletContext è accessibile anche nel contenitore di applicazioni web con il nome di fagiolo servletContext, in modo da poter iniettare come qualsiasi altro fagiolo in Primavera.

+0

pulito, non sapevo che ci fosse un bean incorporato per questo. Grazie. –

+1

Questa è la risposta migliore. Funziona anche se non si dispone di una sessione, e l'iniezione di dipendenza è la via della primavera, dopo tutto. – Paul

+0

non funziona. nel caso in cui non sia all'interno di un servlet ... ottengo l'oggetto "context", ma getContextPath restituisce null. – OhadR

0

L'URL del server che utilizza ServletContext non è sicuro tra diversi ambienti.

Sarebbe meglio recuperare l'url da un file di proprietà.

Problemi correlati