Je souhaite enregistrer les images téléchargées dans un dossier spécifique d'une application Spring 3 MVC déployée sur Tomcat
Mon problème est que je ne peux pas enregistrer les fichiers images téléchargés sur l'hôte où l'application est en cours d'exécution.
Voici ce que j'ai essayé:
private void saveFile(MultipartFile multipartFile, int id) throws Exception {
String destination = "/images/" + id + "/" + multipartFile.getOriginalFilename();
File file = new File(destination);
multipartFile.transferTo(file);
}
Résultat: FileNotFoundException - Oui, bien sûr, je veux créer ce fichier!?!
Je l'ai essayé en utilisant le context.getRealPath
ou le getResources("destination")
, mais sans succès.
Comment créer un nouveau fichier dans un dossier spécifique de mon application avec le contenu de mon fichier multipart?
Ce code va sûrement vous aider.
String filePath = request.getServletContext().getRealPath("/");
multipartFile.transferTo(new File(filePath));
J'ai vu un exemple Spring 3 utilisant la configuration xml (notez que cela ne fonctionne pas pour spring 4.2. *): http://www.devmanuals.com/tutorials/Java/spring/spring3/mvc/spring3-mvc-upload- fichier.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>
Ce qui suit a fonctionné pour moi sur Ubuntu:
String filePath = request.getServletContext().getRealPath("/");
File f1 = new File(filePath+"/"+multipartFile.getOriginalFilename());
multipartFile.transferTo(f1);
String ApplicationPath =
ContextLoader.getCurrentWebApplicationContext().getServletContext().getRealPath("");
Voici comment obtenir le vrai chemin de l'application au printemps (sans utiliser de réponse, de session ...)
Vous pouvez obtenir le inputStream à partir de multipartfile et le copier dans le répertoire de votre choix.
public String write(MultipartFile file, String fileType) throws IOException {
String date = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyMMddHHmmss-"));
String fileName = date + file.getOriginalFilename();
// folderPath here is /sismed/temp/exames
String folderPath = SismedConstants.TEMP_DIR + fileType;
String filePath = folderPath + "/" + fileName;
// Copies Spring's multipartfile inputStream to /sismed/temp/exames (absolute path)
Files.copy(file.getInputStream(), Paths.get(filePath), StandardCopyOption.REPLACE_EXISTING);
return filePath;
}
Cela fonctionne pour Linux et Windows.