아무도 멀티 파트 파일 (org.springframework.web.multipart.MultipartFile)을 파일 (java.io.File)로 변환하는 가장 좋은 방법이 무엇인지 말해 줄 수 있습니까?
내 봄 mvc 웹 프로젝트에서 나는 Multipart 파일로 업로드 된 파일을 얻고 있습니다. 파일 (io)로 변환해야 하므로이 이미지 저장 서비스 ( Cloudinary )를 호출 할 수 있습니다 .
너무 많은 검색을했지만 실패했습니다. 좋은 표준 방법을 아는 사람이 있으면 알려주세요. Thnx
답변
메소드 MultipartFile
를 사용하여 의 내용을 가져올 수 있으며 다음 을 사용 getBytes
하여 파일에 쓸 수 있습니다 Files.newOutputStream()
.
public void write(MultipartFile file, Path dir) {
Path filepath = Paths.get(dir.toString(), file.getOriginalFilename());
try (OutputStream os = Files.newOutputStream(filepath)) {
os.write(file.getBytes());
}
}
transferTo 메서드를 사용할 수도 있습니다 .
public void multipartFileToFile(
MultipartFile multipart,
Path dir
) throws IOException {
Path filepath = Paths.get(dir.toString(), multipart.getOriginalFilename());
multipart.transferTo(filepath);
}
답변
@PetrosTsialiamanis post에 대한 작은 수정,
new File( multipart.getOriginalFilename())
이것은 언젠가 사용자에 대한 쓰기 권한 문제에 직면하게 될 서버 위치에 파일을 생성합니다. 작업을 수행하는 모든 사용자에게 항상 쓰기 권한을 부여 할 수있는 것은 아닙니다.
System.getProperty("java.io.tmpdir")
파일이 제대로 생성 될 임시 디렉토리를 생성합니다. 이렇게하면 파일이 생성되는 임시 폴더를 만들고 나중에 파일 또는 임시 폴더를 삭제할 수 있습니다.
public static File multipartToFile(MultipartFile multipart, String fileName) throws IllegalStateException, IOException {
File convFile = new File(System.getProperty("java.io.tmpdir")+"/"+fileName);
multipart.transferTo(convFile);
return convFile;
}
이 방법을 일반적인 유틸리티에 넣고 예를 들어처럼 사용하십시오. Utility.multipartToFile(...)
답변
받아 들여지는 대답은 정확하지만 이미지를 cloudinary에 업로드하려는 경우 더 좋은 방법이 있습니다.
Map upload = cloudinary.uploader().upload(multipartFile.getBytes(), ObjectUtils.emptyMap());
multipartFile은 org.springframework.web.multipart.MultipartFile 입니다.
답변
Apache Commons IO 라이브러리 및 FileUtils 클래스를 사용할 수도 있습니다 . maven을 사용하는 경우 위의 종속성을 사용하여로드 할 수 있습니다.
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.4</version>
</dependency>
MultipartFile의 소스는 디스크에 저장됩니다.
File file = new File(directory, filename);
// Create the file using the touch method of the FileUtils class.
// FileUtils.touch(file);
// Write bytes from the multipart file to disk.
FileUtils.writeByteArrayToFile(file, multipartFile.getBytes());
답변
MultipartFile.transferTo (File)은 좋지만 결국 임시 파일을 정리하는 것을 잊지 마십시오.
// ask JVM to ask operating system to create temp file
File tempFile = File.createTempFile(TEMP_FILE_PREFIX, TEMP_FILE_POSTFIX);
// ask JVM to delete it upon JVM exit if you forgot / can't delete due exception
tempFile.deleteOnExit();
// transfer MultipartFile to File
multipartFile.transferTo(tempFile);
// do business logic here
result = businessLogic(tempFile);
// tidy up
tempFile.delete();
아래에서 JVM 종료시 실행되는 File.deleteOnExit ()에 대한 Razzlero의 주석 (극히 드물지만) 세부 정보를 확인하십시오.
답변
private File convertMultiPartToFile(MultipartFile file ) throws IOException
{
File convFile = new File( file.getOriginalFilename() );
FileOutputStream fos = new FileOutputStream( convFile );
fos.write( file.getBytes() );
fos.close();
return convFile;
}
답변
당신은 인터페이스의 클래스가있는 경우 캐스팅에 의해 봄에 임시 파일에 액세스 할 수 MultipartFile
있습니다 CommonsMultipartFile
.
public File getTempFile(MultipartFile multipartFile)
{
CommonsMultipartFile commonsMultipartFile = (CommonsMultipartFile) multipartFile;
FileItem fileItem = commonsMultipartFile.getFileItem();
DiskFileItem diskFileItem = (DiskFileItem) fileItem;
String absPath = diskFileItem.getStoreLocation().getAbsolutePath();
File file = new File(absPath);
//trick to implicitly save on disk small files (<10240 bytes by default)
if (!file.exists()) {
file.createNewFile();
multipartFile.transferTo(file);
}
return file;
}
10240 바이트 미만의 파일로 트릭을 제거하려면 클래스 maxInMemorySize
에서 속성을 0으로 설정할 수 있습니다 @Configuration
@EnableWebMvc
. 그 후에 업로드 된 모든 파일은 디스크에 저장됩니다.
@Bean(name = "multipartResolver")
public CommonsMultipartResolver createMultipartResolver() {
CommonsMultipartResolver resolver = new CommonsMultipartResolver();
resolver.setDefaultEncoding("utf-8");
resolver.setMaxInMemorySize(0);
return resolver;
}