web-dev-qa-db-fra.com

Spring MVC enregistrer le fichier multipart envoyé dans un dossier spécifique

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?

25
Alexander

Ce code va sûrement vous aider.

String filePath = request.getServletContext().getRealPath("/"); 
multipartFile.transferTo(new File(filePath));
27
Ravi Maroju

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>

1
Marco Schoolenberg

Ce qui suit a fonctionné pour moi sur Ubuntu:

String filePath = request.getServletContext().getRealPath("/");
File f1 = new File(filePath+"/"+multipartFile.getOriginalFilename());
multipartFile.transferTo(f1);
0
Vijay
String ApplicationPath = 
        ContextLoader.getCurrentWebApplicationContext().getServletContext().getRealPath("");

Voici comment obtenir le vrai chemin de l'application au printemps (sans utiliser de réponse, de session ...)

0
Laster Liang

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.

0