반응형
파일을 다중 요소 파일로 변환하는 중
File 개체를 MultiPartFile로 변환할 수 있는 방법이 있습니까?그러면 해당 개체를 다음 개체를 수락하는 메서드로 보낼 수 있습니다.MultiPartFile
인터페이스?
File myFile = new File("/path/to/the/file.txt")
MultiPartFile ....?
def (MultiPartFile file) {
def is = new BufferedInputStream(file.getInputStream())
//do something interesting with the stream
}
이 용도로 MockMultipartFile이 있습니다.당신의 스니펫에서처럼 파일 경로가 알려져 있다면 아래 코드가 저에게 적합합니다.
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import org.springframework.mock.web.MockMultipartFile;
Path path = Paths.get("/path/to/the/file.txt");
String name = "file.txt";
String originalFileName = "file.txt";
String contentType = "text/plain";
byte[] content = null;
try {
content = Files.readAllBytes(path);
} catch (final IOException e) {
}
MultipartFile result = new MockMultipartFile(name,
originalFileName, contentType, content);
File file = new File("src/test/resources/input.txt");
FileInputStream input = new FileInputStream(file);
MultipartFile multipartFile = new MockMultipartFile("file",
file.getName(), "text/plain", IOUtils.toByteArray(input));
MultipartFile multipartFile = new MockMultipartFile("test.xlsx", new FileInputStream(new File("/home/admin/test.xlsx")));
이 코드는 저에게 잘 맞습니다.시도해 볼 수 있을 겁니다.
저 같은 경우에는.
fileItem.getOutputStream();
작동하지 않았습니다.그래서 IOUTils를 사용하여 직접 만들었습니다.
File file = new File("/path/to/file");
FileItem fileItem = new DiskFileItem("mainFile", Files.probeContentType(file.toPath()), false, file.getName(), (int) file.length(), file.getParentFile());
try {
InputStream input = new FileInputStream(file);
OutputStream os = fileItem.getOutputStream();
IOUtils.copy(input, os);
// Or faster..
// IOUtils.copy(new FileInputStream(file), fileItem.getOutputStream());
} catch (IOException ex) {
// do something.
}
MultipartFile multipartFile = new CommonsMultipartFile(fileItem);
디스크에 파일을 수동으로 만들지 않고 해결할 수 있습니다.
MultipartFile fichier = new MockMultipartFile("fileThatDoesNotExists.txt",
"fileThatDoesNotExists.txt",
"text/plain",
"This is a dummy file content".getBytes(StandardCharsets.UTF_8));
Mocking 클래스가 없는 솔루션, Java9+ 및 Spring만 해당.
FileItem fileItem = new DiskFileItemFactory().createItem("file",
Files.probeContentType(file.toPath()), false, file.getName());
try (InputStream in = new FileInputStream(file); OutputStream out = fileItem.getOutputStream()) {
in.transferTo(out);
} catch (Exception e) {
throw new IllegalArgumentException("Invalid file: " + e, e);
}
CommonsMultipartFile multipartFile = new CommonsMultipartFile(fileItem);
File file = new File("src/test/resources/validation.txt");
DiskFileItem fileItem = new DiskFileItem("file", "text/plain", false, file.getName(), (int) file.length() , file.getParentFile());
fileItem.getOutputStream();
MultipartFile multipartFile = new CommonsMultipartFile(fileItem);
NPE를 방지하려면 다음이 필요합니다.
fileItem.getOutputStream();
또한 파일이 비어 있지 않도록 파일 내용을 fileItem에 복사해야 합니다.
new FileInputStream(f).transferTo(item.getOutputStream());
MultipartFile을 직접 구현할 수 있습니다.예:
public class JavaFileToMultipartFile implements MultipartFile {
private final File file;
public TPDecodedMultipartFile(File file) {
this.file = file;
}
@Override
public String getName() {
return file.getName();
}
@Override
public String getOriginalFilename() {
return file.getName();
}
@Override
public String getContentType() {
try {
return Files.probeContentType(file.toPath());
} catch (IOException e) {
throw new RuntimeException("Error while extracting MIME type of file", e);
}
}
@Override
public boolean isEmpty() {
return file.length() == 0;
}
@Override
public long getSize() {
return file.length();
}
@Override
public byte[] getBytes() throws IOException {
return Files.readAllBytes(file.toPath());
}
@Override
public InputStream getInputStream() throws IOException {
return new FileInputStream(file);
}
@Override
public void transferTo(File dest) throws IOException, IllegalStateException {
throw new UnsupportedOperationException();
}
}
가져올 수 없는 경우MockMultipartFile
사용.
import org.springframework.mock.web.MockMultipartFile;
아래의 종속성을 에 추가해야 합니다.pom.xml
:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
제게 효과가 있습니다.
File file = path.toFile();
String mimeType = Files.probeContentType(path);
DiskFileItem fileItem = new DiskFileItem("file", mimeType, false, file.getName(), (int) file.length(),
file.getParentFile());
fileItem.getOutputStream();
MultipartFile multipartFile = new CommonsMultipartFile(fileItem);
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import org.apache.commons.io.IOUtils;
import org.springframework.mock.web.MockMultipartFile;
import org.springframework.web.multipart.MultipartFile;
public static void main(String[] args) {
convertFiletoMultiPart();
}
private static void convertFiletoMultiPart() {
try {
File file = new File(FILE_PATH);
if (file.exists()) {
System.out.println("File Exist => " + file.getName() + " :: " + file.getAbsolutePath());
}
FileInputStream input = new FileInputStream(file);
MultipartFile multipartFile = new MockMultipartFile("file", file.getName(), "text/plain",
IOUtils.toByteArray(input));
System.out.println("multipartFile => " + multipartFile.isEmpty() + " :: "
+ multipartFile.getOriginalFilename() + " :: " + multipartFile.getName() + " :: "
+ multipartFile.getSize() + " :: " + multipartFile.getBytes());
} catch (IOException e) {
System.out.println("Exception => " + e.getLocalizedMessage());
}
}
이것은 저에게 효과가 있었습니다.
Gradle 프로젝트의 경우 추가 - 구현 그룹: 'org.스프링 프레임워크.boot', 이름: 'spring-boot-boot-boot-test', 버전: '2.7.4'
언급URL : https://stackoverflow.com/questions/16648549/converting-file-to-multipartfile
반응형
'programing' 카테고리의 다른 글
Oracle 분산 데이터베이스에서 LOB를 처리하는 가장 좋은 방법 (0) | 2023.08.09 |
---|---|
잘못된 SQL을 반환하는 Larvel 마이그레이션 (0) | 2023.08.09 |
Oracle과 함께 Dapper 사용 (0) | 2023.08.09 |
ASP 활용.자체 데이터 암호화를 위한 NET machineKey (0) | 2023.08.09 |
도커 오류로 도커 컨테이너를 삭제할 수 없습니다. 충돌: 리포지토리 참조를 제거할 수 없습니다. (0) | 2023.08.04 |