2013-05-20 14 views
19

Czy istnieje jakiś sposób przekonwertowania obiektu pliku na plik MultiPartFile? Czy mogę wysłać ten obiekt do metod akceptujących obiekty interfejsu MultiPartFile?Konwertowanie pliku na 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 
} 
+2

Powinieneś być w stanie napisać własną klasę, która implementuje ['FileItem'] (http://commons.apache.org/proper/commons-fileupload/apidocs/org/apache/commons/fileupload/FileItem.html) ale to zabiera rzeczywisty "plik" do delegowania, a następnie przekazuje instancję 'FileItem' do konstruktora [' CommonsMultipartFile'] (http://static.springsource.org/spring/docs/1.2.x/api/org /springframework/web/multipart/commons/CommonsMultipartFile.html), który implementuje 'MultiPartFile' –

+0

Zrobiłem klasy, która implementuje FileItem, ale nie wiem jak wdrożyć wszystkie metody tego interfejsu. W tej klasie utworzyłem zmienną o nazwie "File myFile". Czy powinienem po prostu zaimplementować 'getinputStream()' i 'getOutputStream()'? – birdy

+0

w szczególności, nie wiem, co masz na myśli przez to "ale to ma rzeczywisty plik do delegowania". Oto, co do tej pory miałem: https://gist.github.com/birdy101/5616009 – birdy

Odpowiedz

4
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); 

Musisz

fileItem.getOutputStream(); 

ponieważ będzie rzucać NPE inaczej.

+0

** fileItem.getOutputStream(); ** wygląda jak magia – gstackoverflow

+1

To jest magia Java;) – despot

16

MockMultipartFile istnieje w tym celu. Podobnie jak w twoim fragmencie, jeśli ścieżka do pliku jest znana, poniższy kod działa dla mnie.

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); 
+3

Czy można to zrobić bez zapisywania pliku na dysku? – Tisha

6
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)); 
1

W moim przypadku,

fileItem.getOutputStream(); 

nie działa. Tak więc zrobiłem to sam używając 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); 
} catch (IOException ex) { 
    // do something. 
} 

MultipartFile multipartFile = new CommonsMultipartFile(fileItem); 
+0

Dzięki, to było dokładnie to, czego potrzebowałem !! :) – gabowsky

3
MultipartFile multipartFile = new MockMultipartFile("test.xlsx", new FileInputStream(new File("/home/admin/test.xlsx"))); 

ten kod wooks dobrze me.May być może trzeba spróbować.