【问题标题】:How can I retrieve a blobstore file by name如何按名称检索 blobstore 文件
【发布时间】:2012-05-15 09:41:32
【问题描述】:

我写了以下代码:

                     FileService fileService = FileServiceFactory
                 .getFileService();

                 // Create a new Blob file with mime-type "text/plain"
                 AppEngineFile file = fileService.createNewBlobFile(
                 "image/jpeg", name);

                 if(null!=file)
                 log.warn(file.toString());

                 FileReadChannel readChannel =
                 fileService.openReadChannel(
                 file, true);

                 // Again, different standard Java ways of reading from
                 // the
                 // channel.
                 BufferedReader reader = new BufferedReader(Channels
                 .newReader(readChannel, "UTF8"));
                 String line = reader.readLine();

                 resp.setContentType("text/plain");
                 resp.getWriter().println(line);

                 readChannel.close();

但不幸的是,它给了我以下异常:

来自 servlet 的未捕获异常 com.google.appengine.api.files.FinalizationException 在 com.google.appengine.api.files.FileServiceImpl.translateException(FileServiceImpl.java:597) 在 com.google.appengine.api.files.FileServiceImpl.makeSyncCall(FileServiceImpl.java:574) 在 com.google.appengine.api.files.FileServiceImpl.open(FileServiceImpl.java:496) 在 com.google.appengine.api.files.FileServiceImpl.openForRead(FileServiceImpl.java:456) 在 com.google.appengine.api.files.FileServiceImpl.openForRead(FileServiceImpl.java:447) 在 com.google.appengine.api.files.FileServiceImpl.openReadChannel(FileServiceImpl.java:202) 在 com.myfileshost.MyfileshostServlet.doGet(MyfileshostServlet.java:362) 在 javax.servlet.http.HttpServlet.service(HttpServlet.java:617) 在 javax.servlet.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) 在 com.google.apphosting.utils.servlet.ParseBlobUploadFilter.doFilter(ParseBlobUploadFilter.java:102) 在 org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157) 在 com.google.apphosting.runtime.jetty.SaveSessionFilter.doFilter(SaveSessionFilter.java:35) 在 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) 在 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.apphosting.runtime.jetty.AppVersionHandlerMap.handle(AppVersionHandlerMap.java:249) 在 org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152) 在 org.mortbay.jetty.Server.handle(Server.java:326) 在 org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:542) 在 org.mortbay.jetty.HttpConnection$RequestHandler.headerComplete(HttpConnection.java:923) 在 com.google.apphosting.runtime.jetty.RpcRequestParser.parseAvailable(RpcRequestParser.java:76) 在 org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:404) 在 com.google.apphosting.runtime.jetty.JettyServletEngineAdapter.serviceRequest(JettyServletEngineAdapter.java:135) 在 com.google.apphosting.runtime.JavaRuntime$RequestRunnable.run(JavaRuntime.java:446) 在 com.google.tracing.TraceContext$TraceContextRunnable.runInContext(TraceContext.java:449) 在 com.google.tracing.TraceContext$TraceContextRunnable$1.run(TraceContext.java:455) 在 com.google.tracing.TraceContext.runInContext(TraceContext.java:695) 在 com.google.tracing.TraceContext$AbstractTraceContextCallback.runInInheritedContextNoUnref(TraceContext.java:333) 在 com.google.tracing.TraceContext$AbstractTraceContextCallback.runInInheritedContext(TraceContext.java:325) 在 com.google.tracing.TraceContext$TraceContextRunnable.run(TraceContext.java:453) 在 com.google.apphosting.runtime.ThreadGroupPool$PoolEntry.run(ThreadGroupPool.java:251) 在 java.lang.Thread.run(Thread.java:679)

【问题讨论】:

    标签: google-app-engine blobstore


    【解决方案1】:

    通过 GAE FileService 创建文件时,必须先完成文件才能读取。

    openReadChannel(..) 的 Javadoc 明确指出,如果文件未最终确定,此方法将抛出 FinalizationException

    这是一个关于如何创建文件、完成文件并从中读取的完整示例:https://developers.google.com/appengine/docs/java/blobstore/overview#Writing_Files_to_the_Blobstore

    【讨论】:

      猜你喜欢
      • 2015-07-26
      • 1970-01-01
      • 2011-10-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-20
      • 1970-01-01
      • 2013-09-13
      相关资源
      最近更新 更多