2016-04-28 5 views
0

表示されたバケットにファイルをアップロードする働きのJavaサーブレットがありますが、1MB未満のファイルは完全にアップロードできます。 1MBを超えるファイルをアップロードすると、最初のMBのデータのみがアップロードされ、残りのファイルは空になります。Blobstoreはファイルをアップロードしますが、最初の1MBだけを受け取ります

package com.google.appengine; 



import java.io.IOException; 

import java.util.List; 

import java.util.Map; 

import java.nio.ByteBuffer; 

import java.io.PrintWriter; 



import javax.servlet.*; 

import javax.servlet.http.*; 



import com.google.appengine.api.blobstore.BlobKey; 

import com.google.appengine.api.blobstore.BlobInfo; 

import com.google.appengine.api.blobstore.BlobstoreService; 

import com.google.appengine.api.blobstore.BlobstoreServiceFactory; 

import com.google.appengine.api.blobstore.BlobstoreInputStream; 



import com.google.appengine.tools.cloudstorage.GcsFileOptions; 

import com.google.appengine.tools.cloudstorage.GcsFilename; 

import com.google.appengine.tools.cloudstorage.GcsOutputChannel; 

import com.google.appengine.tools.cloudstorage.GcsService; 

import com.google.appengine.tools.cloudstorage.GcsServiceFactory; 

import com.google.appengine.tools.cloudstorage.RetryParams; 



public class upload extends HttpServlet { 

    private BlobstoreService blobstoreService = BlobstoreServiceFactory.getBlobstoreService(); 



    @Override 

    public void doPost(HttpServletRequest request, HttpServletResponse response) 

     throws ServletException, IOException { 

PrintWriter out = response.getWriter(); 

HttpSession session = request.getSession(); 

String Bucketname = (String) session.getAttribute("BUCKET"); 



     Map<String, List<BlobInfo>> blobsData = blobstoreService.getBlobInfos(request); 

    for (String key : blobsData.keySet()) 

     { 

     for(BlobInfo blob:blobsData.get(key)) 

     { 

      byte[] b = new byte[(int)blob.getSize()]; 

      BlobstoreInputStream in = new BlobstoreInputStream(blob.getBlobKey()); 

      in.read(b); 



      GcsService gcsService = GcsServiceFactory.createGcsService(); 

      GcsFilename filename = new GcsFilename(Bucketname, blob.getFilename()); 

      GcsFileOptions options = new GcsFileOptions.Builder() 

      .mimeType(blob.getContentType()) 

      //.acl("authenticated-read") 

      .build(); 



      gcsService.createOrReplace(filename,options,ByteBuffer.wrap(b)); 

      in.close(); 

     } 

     } 

String SharedMessage = "File has been Uploaded Successfully!"; 

String SharedURL = ""; 

session.setAttribute("SHAREDMESSAGE",SharedMessage); 

session.setAttribute("SHAREDURL",SharedURL); 

response.sendRedirect("SharedResult.jsp"); 



    } 

} 

助けてください。ありがとうございました

答えて

0

あなたは戻り値in.read(byte[]);を無視しています。アレイ全体が必ずしも満たされるとは限りません。アレイが大きい場合は特にそうです。 -1になるまで読む必要があります。これは、ストリームがなくなったことを意味します。

ByteBuffer b = ByteBuffer.allocate((int)blob.getSize()); 
BlobstoreInputStream in = new BlobstoreInputStream(blob.getBlobKey()); 
byte[] buf = new byte[8192]; 
int bytes = 0; 
while((bytes = in.read(buf)) != -1) 
    b.put(buf, 0, bytes); 
b.flip(); 
... 
関連する問題