簡體   English   中英

Blobstore上傳文件,但只有1st 1 mb

[英]Blobstore upload files but only the 1st 1 mb

我有一個正常工作的Java Servlet,它將文件上傳到指定的存儲桶中,但是,它只能完全上傳小於1MB的文件。 如果我要上傳的文件大小超過1MB,則只會上傳第1 MB的數據,而其余文件將為空。

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");



    }

}

任何幫助將不勝感激。 謝謝

您將忽略in.read(byte[]);的返回值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();
...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM