为什么我无法通过应用引擎将文件上传到大于100KByte的Google云端存储?

我的项目只包含简单的文件上传表单和重定向来查看它。 我可以上传任何小于50 KB的文件但是当我上传一些大于100 KB的文件时,它会从应用引擎中抛出IO Exception。 我不确定问题出在哪里。 有谁知道如何通过应用引擎中的表单发布来增加我可以上传到Google云端存储的文件大小? 文件大小正确小于10 MB是可以的。 任何代码片段都会受到高度赞赏。 谢谢。

java.io.IOException at com.google.appengine.api.files.FileServiceImpl.translateException(FileServiceImpl.java:615) at com.google.appengine.api.files.FileServiceImpl.makeSyncCall(FileServiceImpl.java:588) at com.google.appengine.api.files.FileServiceImpl.append(FileServiceImpl.java:535) at com.google.appengine.api.files.FileServiceImpl.append(FileServiceImpl.java:289) at com.google.appengine.api.files.FileWriteChannelImpl.write(FileWriteChannelImpl.java:57) at com.google.appengine.api.files.FileWriteChannelImpl.write(FileWriteChannelImpl.java:46) at java.nio.channels.Channels.write(Channels.java:80) at java.nio.channels.Channels.access$000(Channels.java:64) at java.nio.channels.Channels$1.write(Channels.java:151) at java.io.BufferedOutputStream.flushBuffer(BufferedOutputStream.java:82) at java.io.BufferedOutputStream.flush(BufferedOutputStream.java:140) at storefile.StorageService.storeFile(StorageService.java:46) at storefile.UploadServlet.doPost(UploadServlet.java:46) at javax.servlet.http.HttpServlet.service(HttpServlet.java:637) at javax.servlet.http.HttpServlet.service(HttpServlet.java:717) 

以下是我的代码:upload.html

    Hello App Engine   

Hello App Engine!

File

uploadServlet.java

 import java.io.BufferedInputStream; import java.io.IOException; import java.io.InputStream; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.commons.fileupload.FileItemIterator; import org.apache.commons.fileupload.FileItemStream; import org.apache.commons.fileupload.servlet.ServletFileUpload; import com.google.appengine.api.blobstore.BlobKey; public class UploadServlet extends HttpServlet{ private static final long serialVersionUID = 1L; private StorageService storage = new StorageService(); private static int BUFFER_SIZE =1024 * 1024* 10; @Override public void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException { resp.setContentType("text/plain"); resp.getWriter().println("Now see here your file content, that you have uploaded on storage.."); ServletFileUpload upload = new ServletFileUpload(); FileItemIterator iter; try { iter = upload.getItemIterator(req); while (iter.hasNext()) { FileItemStream item = iter.next(); String fileName = item.getName(); String mime = item.getContentType(); storage.init(fileName, mime); InputStream is = new BufferedInputStream(item.openStream()); byte[] b = new byte[BUFFER_SIZE]; int readBytes = is.read(b, 0, BUFFER_SIZE); while (readBytes != -1) { storage.storeFile(b, readBytes); readBytes = is.read(b, 0, readBytes); } is.close(); storage.destroy(); resp.getWriter().println("File uploading done"); // resp.getWriter().println("READ:" + storage.readTextFileOnly(fileName)); BlobKey key = storage.getBlobkey(fileName); if (key != null) { resp.sendRedirect("/serve?blob-key=" + key.getKeyString()); } else { resp.sendRedirect("/"); } } } catch (Exception e) { e.printStackTrace(resp.getWriter()); System.out.println("Exception::"+e.getMessage()); e.printStackTrace(); } } } 

StorageService.java

 import java.io.BufferedOutputStream; import java.io.BufferedReader; import java.nio.channels.Channels; import java.util.logging.Logger; import com.google.appengine.api.blobstore.BlobKey; import com.google.appengine.api.blobstore.BlobstoreService; import com.google.appengine.api.blobstore.BlobstoreServiceFactory; import com.google.appengine.api.files.AppEngineFile; import com.google.appengine.api.files.FileReadChannel; import com.google.appengine.api.files.FileService; import com.google.appengine.api.files.FileServiceFactory; import com.google.appengine.api.files.FileWriteChannel; import com.google.appengine.api.files.GSFileOptions.GSFileOptionsBuilder; public class StorageService { public static final String BUCKET_NAME = "aaaa"; private FileWriteChannel writeChannel = null; FileService fileService = FileServiceFactory.getFileService(); private BufferedOutputStream bos = null; private static final Logger log = Logger.getLogger(StorageService.class.getName()); private BlobstoreService blobstoreService = BlobstoreServiceFactory.getBlobstoreService(); public void init(String fileName, String mime) throws Exception { System.out.println("Storage service:init() method: file name:"+fileName+" and mime:"+mime); log.info("Storage service:init() method: file name:"+fileName+" and mime:"+mime); GSFileOptionsBuilder builder = new GSFileOptionsBuilder() .setAcl("public_read") .setBucket(BUCKET_NAME) .setKey(fileName) .setMimeType(mime); AppEngineFile writableFile = fileService.createNewGSFile(builder.build()); boolean lock = true; writeChannel = fileService.openWriteChannel(writableFile, lock); bos = new BufferedOutputStream(Channels.newOutputStream(writeChannel)); } public void storeFile(byte[] b, int readSize) throws Exception { bos.write(b,0,readSize); bos.flush(); } public void destroy() throws Exception { log.info("Storage service: destroy() method"); bos.close(); writeChannel.closeFinally(); } public BlobKey getBlobkey (String filename) { BlobKey bk = blobstoreService.createGsBlobKey("/gs/aaaa/"+filename); return bk; } } 

fileserve.java

 import java.io.IOException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import com.google.appengine.api.blobstore.BlobKey; import com.google.appengine.api.blobstore.BlobstoreService; import com.google.appengine.api.blobstore.BlobstoreServiceFactory; public class fileserve extends HttpServlet { private BlobstoreService blobstoreService = BlobstoreServiceFactory.getBlobstoreService(); public void doGet(HttpServletRequest req, HttpServletResponse res) throws IOException { BlobKey blobKey = new BlobKey(req.getParameter("blob-key")); blobstoreService.serve(blobKey, res); } } 

web.xml中

   upload storefile.UploadServlet   upload /upload   serve storefile.fileserve   serve /serve   index.jsp  

尝试更改第二个is.read

 readBytes = is.read(b, 0, readBytes); 

至:

 readBytes = is.read(b, 0, BUFFER_SIZE); 

如果在某些时候你读得更快,那么数据可用, readBytes设置为0并且它永远保持在这个值,因为它基本上是在做is.read(b, 0, 0)

更好 – 您应该检查是否有要写入的数据:

 while (readBytes != -1) { if(readBytes > 0) storage.storeFile(b, readBytes); readBytes = is.read(b, 0, BUFFER_SIZE); }