2012-04-23 9 views
1

JAX RSを使用してファイルアップロードの例を設定しようとしています。私はプロジェクトをセットアップし、サーバーの場所にファイルを正常にアップロードすることができました。ファイルサイズが10キロバイト以上の場合は、しかし、私は、私はJAX RSに新しいですcom.sun.jersey.api.client.UniformInterfaceException(応答ステータスが400を返しました)

com.sun.jersey.api.client.UniformInterfaceException: POST http://localhost:9090/DOAFileUploader/rest/file/upload returned a response status of 400 
at com.sun.jersey.api.client.WebResource.handle(WebResource.java:607) 
at com.sun.jersey.api.client.WebResource.access$200(WebResource.java:74) 
at com.sun.jersey.api.client.WebResource$Builder.post(WebResource.java:507) 
at com.sony.doa.rest.client.DOAClient.upload(DOAClient.java:75) 
at com.sony.doa.rest.client.DOAMain.main(DOAMain.java:34) 

(変な!!)次のエラーを取得し、私は正確に問題が何であるかわかりません。私はいくつかのパラメータをクライアント側またはサーバー側(サイズ、タイムアウトなど)に設定する必要がありますか?

これは、Webサービスを呼び出すクライアント側のコードです:

public void upload() { 
    File file = new File(inputFilePath); 
    FormDataMultiPart part = new FormDataMultiPart(); 
    part.bodyPart(new FileDataBodyPart("file", file, MediaType.APPLICATION_OCTET_STREAM_TYPE)); 
    WebResource resource = Client.create().resource(url); 
    String response = resource.type(MediaType.MULTIPART_FORM_DATA_TYPE).post(String.class, part); 
    System.out.println(response); 
} 

これは、サーバー側のコードです:

@Path("/file") 
public class UploadFileService { 

@POST 
@Path("/upload") 
@Consumes(MediaType.MULTIPART_FORM_DATA) 
public Response uploadFile(
     @FormDataParam("file") InputStream uploadedInputStream, 
     @FormDataParam("file") FormDataContentDisposition fileDetail) { 

    String uploadedFileLocation = "e://uploaded/" 
      + fileDetail.getFileName(); 

    writeToFile(uploadedInputStream, uploadedFileLocation); 

    String output = "File uploaded to : " + uploadedFileLocation; 

    return Response.status(200).entity(output).build(); 

} 

private void writeToFile(InputStream uploadedInputStream, 
     String uploadedFileLocation) { 

    try { 
     OutputStream out = new FileOutputStream(new File(
       uploadedFileLocation)); 
     int read = 0; 
     byte[] bytes = new byte[16000]; 

     out = new FileOutputStream(new File(uploadedFileLocation)); 
     while ((read = uploadedInputStream.read(bytes)) != -1) { 
      out.write(bytes, 0, read); 
     } 
     out.flush(); 
     out.close(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } } } 

私はファイルを変更する必要がどのような設定を教えてください10キロバイトよりも大きいサイズ?

ありがとうございます!

答えて

0

私はJerseyのコンテキストでorg.apache.commons.fileupload.servlet.ServletFileUploadを使用しています。これはうまくいきます。はい、これは最大ファイルサイズを設定しています。ここ

は、私はジャージーと同じ問題に遭遇してきた私が使用したコードのsnipet(これはマルチパート形式であるので、ファイルと一緒に他のフィールドがあります)

private LibraryUpload parseLibraryUpload(HttpServletRequest request) { 
LibraryUpload libraryUpload; 

File libraryZip = null; 
String name = null; 
String version = null; 

ServletFileUpload upload = new ServletFileUpload(); 
upload.setFileSizeMax(MAX_FILE_SIZE); 

FileItemIterator iter; 
try { 
    iter = upload.getItemIterator(request); 
while (iter.hasNext()) { 
.... 
if (item.isFormField()) { 
.... 
}else{ 
BufferedInputStream buffer = new BufferedInputStream(stream); 
     buffer.mark(MAX_FILE_SIZE); 
     libraryZip = File.createTempFile("fromUpload", null); 
     IOUtils.copy(buffer, new FileOutputStream(libraryZip)); 
... 
} 
+0

こんにちはSamuel、writeToFile()メソッドでコードを別途試してみましたが、うまく動作します。私は、プロラムが何であるかはわかりません。 – user732362

+0

Jerseyのどのバージョンを使用していますか?私はファイルをアップロードしますが、私のコードは全く異なります。ジャージ1.12を使用します。 –

+0

e.printStackTrace()を置き換えることもできます。いくつかのログを取得し、Response.status(Status.INTERNAL_SERVER_ERROR).build();を返します。この種のエラーが発生した場合は、問題の理解に役立つかもしれない –

0

です。私はジャージートレースを有効にしていますが、何も私を助けません。

私はapacheライブラリでライブラリを変更しましたが、Tomcat用の一時ファイルのリポジトリにリンクされているという問題があります。リポジトリは存在しませんでした。 10k未満のファイルの場合、リポジトリは使用されませんでした。

リポジトリの作成後、私はジャージライブラリを使用し、すべて正常に動作します。

関連する問題