2014-09-09 3 views
2

저지를 사용하여 여러 파일 업로드에 도움이 필요합니다. Jersey를 사용하여 단일 파일을 업로드하는 데 다음 코드를 사용했습니다.여러 파일 선택 및 저어지를 사용하여 업로드

package my.first.rest; 

import java.io.File; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.OutputStream; 

import javax.ws.rs.Consumes; 
import javax.ws.rs.FormParam; 
import javax.ws.rs.POST; 
import javax.ws.rs.Path; 
import javax.ws.rs.core.MediaType; 



import com.sun.jersey.core.header.FormDataContentDisposition; 
import com.sun.jersey.multipart.FormDataParam; 

@Path("uploadfile") 
public class Upload { 
String location; 



    @POST 
    @Path("/upload") 
    @Consumes(MediaType.MULTIPART_FORM_DATA) 
    public String uploadfile(@FormDataParam("file") InputStream is, @FormDataParam("file") FormDataContentDisposition filedetail){ 



     saveToDisk(is,filedetail); 
     return "File Uploaded Succesfully_"+location; 

    } 


    private void saveToDisk(InputStream is1, 
      FormDataContentDisposition filedetail) { 
     // TODO Auto-generated method stub 

     location = "E://upload/"+filedetail.getFileName(); 
     try{ 
      OutputStream out = new FileOutputStream(new File(location)); 
      int read = 0; 
      byte[] bytes = new byte[1024]; 
      out = new FileOutputStream (new File(location)); 
      while((read = is1.read(bytes)) != -1){ 
       out.write(bytes,0,read); 
      } 
      out.flush(); 

      out.close(); 
     }catch (IOException e){ 
      e.printStackTrace(); 
     } 
    } 


} 

위의 코드는 하나의 파일을 업로드 잘 작동하지만, 입력 유형 = 파일의 태그에 여러 = "여러"속성을 추가 할 때, 나는 그것을 하나의 업로드에 여러 항목을 선택할 수 있어요 첫 번째 선택한 항목과 마지막으로 선택한 항목의 이름을 업로드합니다. 나는 그것이 여러 파일 업로드를 처리하기위한 것이 아니기 때문에 코드가 작동 할 것이라고 기대하지는 않는다.하지만 그 주위에 방법이 있어야한다. 이후 하나의 파일과 다른 파일의 이름을 사용합니다.

나는 여러 개의 stackoverflow 스레드를 보았고 많이 봤다. 내가 대답을 찾으면 나는 이것을 게시하지 않았을 것이다. 아래 유형의 코드를 사용하여 여러 파일을 업로드하지 않으려합니다.

<input type ="file" name="file"> 
<input type ="file" name="file"> 
<input type ="file" name="file2"> 

개별적으로 여러 파일을 업로드하고 싶지 않습니다. 한 번에 여러 파일을 선택하고 모든 파일을 업로드 할 수 있기를 원합니다. 내 태그는 다음과 같습니다.

<input type ="file" name="file" multiple="multiple"> 

다음은 전체 HTML 코드입니다.

<!DOCTYPE html> 
<html> 
<head> 
<meta charset="ISO-8859-1"> 
<title>Insert title here</title> 
</head> 
<body> 
<form action ="http://localhost:8080/fuseframework/uploadfile/upload" method="post" enctype="multipart/form-data"> 
file: 
<br> 
<input type ="file" name="file" multiple="multiple"> 

<input type="submit" value="send"> 
</form> 
</body> 
</html> 

이 내가 http://i.stack.imgur.com/1tVT8.png

답변

6

나를 'FormDataMultiPart'를 사용하는 것이 확인 작동 를 사용했던 항아리입니다.

여기에 자바 코드 인 FormDataContentDisposition 객체 (formParams)에는 실제 파일 내용이 들어 있습니다. 그것은이 일이 꽤 잘 나를 위해 일한

+0

좋은 ......... –

+0

파일 내용을 사용하려면 다음을 입력하십시오. InputStream is = bodyPart.getEntityAs (InputStream.class); – Gab

+0

내가 inputException을 인수로 전달하려고 할 때 런타임 예외가 발생하면 "DataHead $ ReadMultiStream"이 직렬화되지 않는다고 표시됩니다. 어떤 생각? –

3

도움이 될 것입니다

for (var i = 0; i < files.length; i++) 
    fd.append('file', files[i]); 

원하는 : 다음 JS 측에서
List<FormDataBodyPart> parts = formParams.getFields("file"); 
for (FormDataBodyPart part : parts) { 
    FormDataContentDisposition file = part.getFormDataContentDisposition(); 
} 

, 나는 FormData 객체를 사용하고 동일한 이름을 가진 여러 파일을 밀어

@POST 
@Consumes(MediaType.MULTIPART_FORM_DATA) 
public void uploadMultiple(@FormDataParam("file") FormDataBodyPart body){ 
    for(BodyPart part : body.getParent().getBodyParts()){ 
     InputStream is = part.getEntityAs(InputStream.class); 
     ContentDisposition meta = part.getContentDisposition(); 
     doUpload(is, meta); 
    } 
}