为什么我无法通过应用引擎将文件上传到大于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!
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); }
- Java – Spring Ws – 在XSD文件中加载相对包含(Tomcat 8)
- SpringformsModelAttribute字段validation,以避免400 Bad Request Error
- 快速滚动使用UniversalImageloader或使用Views的引用优化ListView
- 如果我使用移动数据而不是wifi,Android无法运行
- Java中fileSystemWatcher的建议/示例代码
- 如何避免GoogleAppEngine DataStore延迟?
- TranslateAnimation无法按预期工作
- 使用bundle,seListAdapter运行时错误将ArrayList从片段传递到另一个片段(扩展ListFragment)
- Android TCP客户端。 服务器仅在进程停止后接收消息
- Android 4.4.2不删除文件
- Java编译器通过`(byte)+(char) – (int)+(long) – 1`解释什么?