Java GAE从URL将大文件上载到blobstore
我想将30MB到2GB的大型视频文件上载到blob存储区,该存储区具有访问此文件的外部URL 到目前为止,我尝试了类似的方法,但它不适用于大文件,我认为是因为32MB的限制:Java GAE从URL将大文件上载到blobstore,java,google-app-engine,Java,Google App Engine,我想将30MB到2GB的大型视频文件上载到blob存储区,该存储区具有访问此文件的外部URL 到目前为止,我尝试了类似的方法,但它不适用于大文件,我认为是因为32MB的限制: //InputStream is = new URL(getUrlThumbnailFullSize(wistiaResponse)).openStream(); HttpURLConnection con = (HttpURLConnection) new URL("URL of the file her
//InputStream is = new URL(getUrlThumbnailFullSize(wistiaResponse)).openStream();
HttpURLConnection con = (HttpURLConnection) new URL("URL of the file here").openConnection();
con.setConnectTimeout(0);
con.connect();
InputStream is = con.getInputStream();
//create file service to upload the video to the blob store
FileService fileService = FileServiceFactory.getFileService();
//create the App Engine File; assign MIME type and name
AppEngineFile file = fileService.createNewBlobFile("content type here", "file name here");
//lock when uploading file
boolean lock = true;
//open channel
FileWriteChannel writeChannel = fileService.openWriteChannel(file, lock);
//upload file
writeChannel.write(ByteBuffer.wrap(IOUtils.toByteArray(is)));
writeChannel.closeFinally();
//release the lock
lock = false;
//get blob key
BlobKey blobKey = FileServiceFactory.getFileService().getBlobKey(file);
但我有以下堆栈跟踪:
严重:com.google.appengine.api.urlfetch.responseToolarGeeException:
来自url的响应
太大了。在
com.google.appengine.api.urlfetch.URLFetchServiceImpl.fetch(URLFetchServiceImpl.java:57)
在
com.google.apphosting.utils.security.urlfetch.URLFetchServiceStreamHandler$Connection.fetchResponse(URLFetchServiceStreamHandler.java:417)
在
com.google.apphosting.utils.security.urlfetch.URLFetchServiceStreamHandler$Connection.getInputStream(URLFetchServiceStreamHandler.java:296)
在controller.CtrlWistia.download(CtrlWistia.java:149)下载
ajax(CtrlWistia.java:89)位于
controller.CtrlAjax.main(CtrlAjax.java:66)位于
vidaao.AjaxServlet.doPost(AjaxServlet.java:37)位于
http.HttpServlet.service(HttpServlet.java:637)位于
http.HttpServlet.service(HttpServlet.java:717)位于
org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:511)
在
org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1166)
在
org.tuckey.web.filters.urlrewrite.RuleChain.handleRewrite(RuleChain.java:176)
在
org.tuckey.web.filters.urlrewrite.RuleChain.doRules(RuleChain.java:145)
在
org.tuckey.web.filters.urlrewrite.UrlRewriter.processRequest(UrlRewriter.java:92)
在
org.tuckey.web.filters.urlrewrite.UrlRewriteFilter.doFilter(UrlRewriteFilter.java:394)
在
org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
在
com.google.appengine.api.socket.dev.DevSocketFilter.doFilter(DevSocketFilter.java:74)
在
org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
在
com.google.appengine.tools.development.ResponseWriterFilter.doFilter(responseWriterFilter.java:123)
在
org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
在
com.google.appengine.tools.development.headerficationfilter.doFilter(headerficationfilter.java:34)
在
org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
在
com.google.appengine.api.blobstore.dev.ServeBlobFilter.doFilter(ServeBlobFilter.java:61)
在
org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
在
com.google.apphosting.utils.servlet.TransactionCleanupFilter.doFilter(TransactionCleanupFilter.java:43)
在
org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
在
com.google.appengine.tools.development.StaticFileFilter.doFilter(StaticFileFilter.java:125)
在
org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
在
com.google.appengine.tools.development.BackendServersFilter.doFilter(BackendServersFilter.java:97)
在
org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
在
org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:388)
在
org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216)
在
org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:182)
在
org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:765)
在
org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:418)
在
com.google.appengine.tools.development.DevAppEngineWebAppContext.handle(DevAppEngineWebAppContext.java:94)
在
org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
在
com.google.appengine.tools.development.JettyContainerService$ApiProxyHandler.handle(JettyContainerService.java:409)
在
org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
位于org.mortbay.jetty.Server.handle(Server.java:326)
请使用大文件上传
[更新]
啊,我想我明白了。
目前不可能,因为URLFetch服务有32MB响应大小限制。作为一种解决方法,您能否从客户端javascript中的URL下载该文件,并使用blobstore服务创建的上载URL进行上载
[更新]
好的,您需要在服务器端实现这一点,从问题中我不清楚这一点。所以请忘记createUploadUrl
如果服务器支持范围标头,则可以多次请求较小的数据块,并将其存储为单独的blob存储对象,同时还可以存储所需的元数据,如文件名、mimetype、blob键列表等
此外,如果您想将它们合并到一个文件中,您可以使用谷歌云存储。使用,您可以将数据块多次发送到谷歌云存储。因此,请回答另一个问题。好的,我不知道是否可以下载一个2GB的JavaScript文件,并在使用blobstoreService.createUploadUrl后将其上载。并在推送队列中进行,以避免时间超过30秒。这就是你的建议,因为我认为你不能在推送队列中执行任何JS,对吗?你有没有因为我觉得不可能而编写的示例代码?