Alguém pode me dizer qual é a melhor maneira de converter um arquivo multiparte (org.springframework.web.multipart.MultipartFile) em arquivo (java.io.File)?
No meu projeto da web do Spring mvc, estou recebendo um arquivo carregado como um arquivo multipart. Tenho que convertê-lo em um arquivo (io), portanto, posso chamar esse serviço de armazenamento de imagens ( Cloudinary ). Eles aceitam apenas o tipo (arquivo).
Fiz muitas pesquisas, mas falhei. Se alguém souber de uma boa maneira padrão, por favor me avise. Thnx
java
spring
spring-mvc
file-upload
cloudinary
Amila Iddamalgoda
fonte
fonte
MultipartFile.transferTo()
?Respostas:
Você pode obter o conteúdo de um
MultipartFile
usando ogetBytes
método e pode gravar no arquivo usandoFiles.newOutputStream()
:Você também pode usar o método transferTo :
fonte
createNewFIle()
é inútil e um desperdício aqui. Agora você está obrigandonew FileOutputStream()
(por meio do sistema operacional) a excluir o arquivo criado e a criar um novo.Embora a resposta aceita esteja correta, mas se você está apenas tentando enviar sua imagem para o cloudinary, existe uma maneira melhor:
Onde multipartFile é seu org.springframework.web.multipart.MultipartFile .
fonte
pequena correção na postagem de @PetrosTsialiamanis,
new File( multipart.getOriginalFilename())
isso criará um arquivo no local do servidor onde em algum momento você enfrentará problemas de permissão de gravação para o usuário, nem sempre é possível dar permissão de gravação a todos os usuários que executam a ação.System.getProperty("java.io.tmpdir")
irá criar um diretório temporário onde seu arquivo será criado corretamente. Desta forma, você está criando uma pasta temporária, onde o arquivo é criado, mais tarde você pode excluir o arquivo ou pasta temporária.coloque este método em seu utilitário comum e use-o como por exemplo.
Utility.multipartToFile(...)
fonte
Você também pode usar a biblioteca Apache Commons IO e a classe FileUtils . Caso você esteja usando o maven, você pode carregá-lo usando a dependência acima.
A fonte para salvar MultipartFile no disco.
fonte
FileUtils.touch()
é inútil e um desperdício aqui. Agora você está obrigandonew FileOutputStream()
(por meio do sistema operacional) a excluir o arquivo criado e a criar um novo.MultipartFile.transferTo (File) é bom, mas não se esqueça de limpar o arquivo temporário depois de tudo.
Confira o comentário de Razzlero sobre File.deleteOnExit () executado na saída da JVM (que pode ser extremamente rara), os detalhes abaixo.
fonte
deleteOnExit()
, ele só será acionado quando a JVM for encerrada, portanto, não será acionado durante as exceções. Por isso, você precisa ter cuidado ao usardeleteOnExit()
aplicativos de longa duração, como aplicativos de servidor. Para aplicativos de servidor, a JVM raramente será encerrada. Portanto, você precisa ter cuidado para nãodeleteOnExit()
causar vazamentos de memória. A JVM precisa manter o controle de todos os arquivos que precisa excluir na saída e que não foram limpos porque a JVM não é encerrada.fonte
Você pode acessar o arquivo temporário no Spring lançando se a classe da interface
MultipartFile
forCommonsMultipartFile
.Para se livrar do truque com arquivos com menos de 10240 bytes, a
maxInMemorySize
propriedade pode ser definida como 0 na@Configuration
@EnableWebMvc
classe. Depois disso, todos os arquivos carregados serão armazenados no disco.fonte
createNewFIle()
é inútil e um desperdício aqui. Agora você está obrigandonew FileOutputStream()
(por meio do sistema operacional) a excluir o arquivo criado e a criar um novo.A resposta de Alex78191 funcionou para mim.
Para fazer upload de arquivos com tamanho superior a 10240 bytes, altere maxInMemorySize em multipartResolver para 1 MB.
fonte
maxInMemorySize
não tem nada a ver com a limitação do tamanho de upload do arquivo. O tamanho do upload do arquivo é definido pelamaxUploadSize
propriedade.maxInMemorySize
prop pode ser definido como0
.se você não quiser usar MultipartFile.transferTo (). Você pode escrever um arquivo como este
fonte