2012-04-23 3 views
1

Я пытаюсь настроить пример загрузки файлов с помощью JAX RS. Я мог бы настроить проект и успешно загрузить файл в местоположении сервера. Но я получаю следующее сообщение об ошибке, когда размер файла больше, чем 10KB (странно !!)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) 

Я новичок в JAX RS и я не уверен, что именно этот вопрос является. Нужно ли устанавливать некоторые параметры на стороне клиента или на стороне сервера (например, размер, время ожидания и т. Д.)?

Это на стороне клиента код вызова вебсервис:

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(); 
    } } } 

Пожалуйста, дайте мне знать, какие параметры я должен изменить для файлов размером более 10KB ?

Спасибо!

ответ

0

Я использую 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

Привет, Сэмюэл, я пробовал код в методе writeToFile() отдельно, и он отлично работает. Я не уверен, что может быть пролетом. – user732362

+0

Какую версию Джерси вы используете? Я загружаю файл, но мой код совсем другой, и я использую трикотаж 1.12. –

+0

Вы также можете заменить e.printStackTrace(); с некоторым loggin AND return Response.status (Status.INTERNAL_SERVER_ERROR) .build(); если такая ошибка возникает, может помочь понять проблему –

0

я столкнулся с той же проблемой с Джерси. Я активировал трассу Джерси, но мне ничего не помогает.

Я изменил библиотеку с помощью библиотеки apache, и я вижу проблему, связанную с репозиторием для временных файлов для tomcat. Репозитория не существует. Для файлов под 10k репозиторий не использовался.

Итак, после создания репозитория я использовал библиотеку трикотажа, и все работает отлично.

Смежные вопросы