1

Проблема с кодом, который я использую, заключается в том, что файл появляется в блобе, но в виде файла размера 0B. Как будто никакие данные не были записаны в blob.Как загрузить изображение в blob в Azure?

Это форма я использую в моем JSP:

<form method="POST" action="UploadServlet" enctype="multipart/form-data" > 
    <input type="file" name="file" id="file" /> <br/> 
    </br> 
    <input type="submit" value="Upload" name="upload" id="upload" /> 
</form> 

И у меня есть следующий код в моем сервлета:

try { 
       CloudStorageAccount account; 
       CloudBlobClient serviceClient; 
       CloudBlobContainer container; 
       CloudBlockBlob blob; 

       account = CloudStorageAccount.parse(storageConnectionString); 
       serviceClient = account.createCloudBlobClient(); 
       container = serviceClient.getContainerReference("gettingstarted"); 
       container.createIfNotExist(); 

       // Set anonymous access on the container. 
       BlobContainerPermissions containerPermissions; 
       containerPermissions = new BlobContainerPermissions(); 
            containerPermissions.setPublicAccess(BlobContainerPublicAccessType.CONTAINER); 
       container.uploadPermissions(containerPermissions); 

       FileItemFactory factory = new DiskFileItemFactory(); 

      ServletFileUpload fileUpload = new ServletFileUpload(factory); 

       //process only if its multipart content 
       InputStream is = null; 
       if (ServletFileUpload.isMultipartContent(request)) { 
        List items = fileUpload.parseRequest(request); 
        Iterator iter = items.iterator(); 
        while (iter.hasNext()) { 
         FileItem item = (FileItem) iter.next(); 
         if (!item.isFormField()) { 
          is = item.getInputStream(); 
          String name = new File(item.getName()).getName(); 
          System.out.println(name); 
          blob = container.getBlockBlobReference(name); 
          File fileReference = new File(item.getName()); 
          System.out.println(is); 
          blob.upload(is, fileReference.length()); 
         } 
        } 
       } 
       is.close(); 

       request.getRequestDispatcher("hello").forward(request, response); 

    } catch (Exeption e) { 
    } 
+0

Это должно работать, насколько вы, ребята, отклоняетесь от стандартного учебника? –

+0

Я думаю, что ответ @Frans - хороший улов. Ваш входной поток 'is' не расположен в начале потока. В C# синтаксис будет выглядеть следующим образом: 'is.Seek (0, SeekOrigin.Begin); // Поместите поток в начале ', непосредственно перед строкой' blob.upload() '. –

ответ

3

Я не знаю, эквивалентный синтаксис в Java, но в C# вам часто приходится сбрасывать свою позицию в потоке обратно до 0, прежде чем передавать его методу загрузки blob (обычно это так, если поток уже был прочитан, - что у него будет для вас длина). Что-то вроде

is.position = 0; 
blob.upload(is, fileReference.length()); 
Смежные вопросы