2015-09-30 2 views
0

В настоящее время у меня есть простая форма HTML с вызовом AJAX ресурсу Restlet Resource для загрузки изображения.Загрузка загруженного изображения не получает ImageInfo

Когда я делаю Sanselon.getImageInfo я получаю следующее сообщение об ошибке:

Caused by: org.apache.sanselan.ImageReadException: Couldn't read magic numbers to guess format. 
     at org.apache.sanselan.Sanselan.guessFormat(Sanselan.java:147) 
     at org.apache.sanselan.Sanselan.getImageParser(Sanselan.java:596) 
     .... 

Я в недоумении. Я получаю имя файла. Любая помощь будет принята с благодарностью.

Ниже мой HTML:

<html> 
<body> 
<form> 
<table> 

<tr> 
    <td colspan="2">File Upload</td> 
</tr> 

<tr> 
    <th>Select File </th> 
    <td><input id="fileToUpload" name="fileToUpload" type="file" /></td> 
</tr> 

<tr> 
    <td colspan="2"> 
    <input type="submit" value="submit"/> 
    </td> 
</tr> 

</table> 
</form> 
<script> 
$("form").submit(function(evt){ 
    evt.preventDefault(); 

    var formData = new FormData($(this)[0]); 
    $.ajax({ 
     url: 'http://localhost:8080/api/v1/fileupload', 
     type: 'POST', 
     data: formData, 
     async: false, 
     cache: false, 
     contentType: false, 
     enctype: 'multipart/form-data', 
     processData: false, 
     success: function (response) { 
      alert(response); 
     } 
    }); 

    return false; 
}); 
</script> 
</body> 
</html> 

Следующая ли мой ресурс Сообщение с Restlet:

@Post 
public Representation accept(Representation entity) throws Exception { 
    Representation result = null; 
    if (entity != null) { 
     if (MediaType.MULTIPART_FORM_DATA.equals(entity.getMediaType(), true)) { 
      // 1/ Create a factory for disk-based file items 
      DiskFileItemFactory factory = new DiskFileItemFactory(); 
      factory.setSizeThreshold(1000240); 

      // 2/ Create a new file upload handler based on the Restlet 
      // FileUpload extension that will parse Restlet requests and 
      // generates FileItems. 
      RestletFileUpload upload = new RestletFileUpload(factory); 

      // 3/ Request is parsed by the handler which generates a 
      // list of FileItems 
      FileItemIterator fileIterator = upload.getItemIterator(entity); 

      //FileWriter fstream = null; 

      // Process only the uploaded item called "fileToUpload" 
      // and return back 
      boolean found = false; 
      while (fileIterator.hasNext() && !found) { 
       FileItemStream fi = fileIterator.next(); 
       if (fi.getFieldName().equals("fileToUpload")) { 
        found = true; 
        // consume the stream immediately, otherwise the stream 
        // will be closed. 
        StringBuilder sb = new StringBuilder("media type: "); 
        sb.append(fi.getContentType()).append("\n"); 
        sb.append("file name : "); 
        sb.append(fi.getName()).append("\n"); 
        BufferedReader br = new BufferedReader(
          new InputStreamReader(fi.openStream())); 
        String line = null; 
        while ((line = br.readLine()) != null) { 
         sb.append(line); 
        } 
        result = new StringRepresentation(sb.toString(), MediaType.TEXT_PLAIN); 
        ImageInfo imageInfo =  Sanselan.getImageInfo(fi.openStream(), fi.getName()); 
        System.out.println(imageInfo); 
        ImageStatus imageStatus = fileUploadService.saveImage(fi); 

       } 
      } 
     } else { 
      // POST request with no entity. 
      setStatus(Status.CLIENT_ERROR_BAD_REQUEST); 
     } 
    } 
    return result; 
} 

Он терпит неудачу на следующей строке кода:

ImageInfo imageInfo = Sanselan.getImageInfo(fi.openStream(), fi.getName()); 

ответ

0

Я думаю, что ваш код находится на месте, чтобы потреблять поток загружаемого потока три раза:

  • в первый раз, заполнив StringBuilder (что совершенно бесполезно в вашем случае, поскольку файл изображения является двоичным вещи, не персонаж на основе материал),
  • во второй раз, получая данные изображения, используя sanselan ,
  • в третий раз, сохраняя изображение с помощью fileUploadService

Как мы можем читать только сокет один раз, есть проблема. Можете ли вы удалить первый блок кода? Это позволит вам получить ImageInfo, я думаю. Я немного более сдержан относительно операции «сохранить», я думаю, что это провалится.