2012-11-30 87 views
2

我试图从我的存储桶中获取存储的PDF文件。该文件还没有公开,但权限被设置为项目的私人如何阅读和下载存储在Bucket中的文件?

我使用下面的代码:

String filename = "/gs/" + BUCKETNAME + "/" + FILENAME; 
AppEngineFile readableFile = new AppEngineFile(filename); 
FileReadChannel readChannel = fileService.openReadChannel(readableFile, false); 
BufferedReader reader = new BufferedReader(Channels.newReader(readChannel, "UTF8")); 
String line = reader.readLine(); 
resp.getWriter().println("READ:" + line); 
readChannel.close(); 

之前,我会为我设置访问控制列表和我的服务帐户名

<Entry> 
<Scope type="UserByEmail"> 
    <EmailAddress> 
    [email protected] 
    </EmailAddress> 
</Scope> 
<Permission>FULL_CONTROL</Permission> 
</Entry> 

当我运行我的应用程序时,我会在行FileReadChannel recive此错误readChannel = fileService.openReadChannel(readableFile,false);:

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.open(FileServiceImpl.java:521) 
at com.google.appengine.api.files.FileServiceImpl.openForRead(FileServiceImpl.java:481) 
at com.google.appengine.api.files.FileServiceImpl.openForRead(FileServiceImpl.java:473) 
at com.google.appengine.api.files.FileServiceImpl.openReadChannel(FileServiceImpl.java:197) 
at it.tiquadra.webso.controller.MainController.readFile(MainController.java:386) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
at java.lang.reflect.Method.invoke(Method.java:43) 
at org.springframework.web.bind.annotation.support.HandlerMethodInvoker.invokeHandlerMethod(HandlerMethodInvoker.java:176) 
at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.invokeHandlerMethod(AnnotationMethodHandlerAdapter.java:426) 
at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.handle(AnnotationMethodHandlerAdapter.java:414) 
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:790) 
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:719) 
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:644) 
at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:549) 
at javax.servlet.http.HttpServlet.service(HttpServlet.java:617) 
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717) 
at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:511) 
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1166) 
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157) 
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157) 
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157) 
at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:388) 
at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216) 
at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:182) 
at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:765) 
at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:418) 
at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152) 
at org.mortbay.jetty.Server.handle(Server.java:326) 
at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:542) 
at org.mortbay.jetty.HttpConnection$RequestHandler.headerComplete(HttpConnection.java:923) 
at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:404) 
at com.google.tracing.TraceContext$TraceContextRunnable.runInContext(TraceContext.java:454) 
at com.google.tracing.TraceContext$TraceContextRunnable$1.run(TraceContext.java:461) 
at com.google.tracing.TraceContext.runInContext(TraceContext.java:703) 
at com.google.tracing.TraceContext$AbstractTraceContextCallback.runInInheritedContextNoUnref(TraceContext.java:338) 
at com.google.tracing.TraceContext$AbstractTraceContextCallback.runInInheritedContext(TraceContext.java:330) 
at com.google.tracing.TraceContext$TraceContextRunnable.run(TraceContext.java:458) 
at java.lang.Thread.run(Thread.java:679) 
Caused by: com.google.apphosting.api.ApiProxy$ApplicationException: ApplicationError: 8: 
    at java.lang.Thread.getStackTrace(Thread.java:1495) 
    at com.google.apphosting.api.ApiProxy.makeSyncCall(ApiProxy.java:107) 
    at com.google.apphosting.api.ApiProxy.makeSyncCall(ApiProxy.java:56) 
    at com.google.appengine.api.files.FileServiceImpl.makeSyncCall(FileServiceImpl.java:584) 
    ... 40 more 

Caused by: com.google.apphosting.api.ApiProxy$ApplicationException: ApplicationError: 8: 
    at com.google.net.rpc3.client.RpcStub$RpcCallbackDispatcher$1.runInContext(RpcStub.java:783) 
    at com.google.tracing.TraceContext$TraceContextRunnable$1.run(TraceContext.java:461) 
    at com.google.tracing.TraceContext.runInContext(TraceContext.java:703) 
    at com.google.tracing.TraceContext$AbstractTraceContextCallback.runInInheritedContextNoUnref(TraceContext.java:338) 
    at com.google.tracing.TraceContext$AbstractTraceContextCallback.runInInheritedContext(TraceContext.java:330) 
    at com.google.tracing.TraceContext$TraceContextRunnable.run(TraceContext.java:458) 
    at com.google.net.rpc3.client.RpcStub$RpcCallbackDispatcher.rpcFinished(RpcStub.java:823) 
    at com.google.net.rpc3.client.RpcStub$RpcCallbackDispatcher.failure(RpcStub.java:814) 
    at com.google.net.rpc3.impl.client.RpcClientInternalContext.runCallbacks(RpcClientInternalContext.java:900) 
    at com.google.net.rpc3.impl.client.RpcClientInternalContext.finishRpcAndNotifyApp(RpcClientInternalContext.java:803) 
    at com.google.net.rpc3.impl.client.RpcNetChannel.afterFinishingActiveRpc(RpcNetChannel.java:1063) 
    at com.google.net.rpc3.impl.client.RpcNetChannel.finishRpc(RpcNetChannel.java:911) 
    at com.google.net.rpc3.impl.client.RpcNetChannel.handleResponse(RpcNetChannel.java:2267) 
    at com.google.net.rpc3.impl.client.RpcNetChannel.messageReceived(RpcNetChannel.java:2068) 
    at com.google.net.rpc3.impl.client.RpcNetChannel.access$2000(RpcNetChannel.java:143) 
    at com.google.net.rpc3.impl.client.RpcNetChannel$TransportCallback.receivedMessage(RpcNetChannel.java:3129) 
    at com.google.net.rpc3.impl.client.RpcChannelTransportData$TransportCallback.receivedMessage(RpcChannelTransportData.java:599) 
    at com.google.net.rpc3.impl.wire.RpcBaseTransport.receivedMessage(RpcBaseTransport.java:417) 
    at com.google.net.eventmanager.AbstractFutureTask$Sync.innerRun(AbstractFutureTask.java:260) 
    at com.google.net.eventmanager.AbstractFutureTask.run(AbstractFutureTask.java:121) 
    at com.google.net.eventmanager.EventManagerImpl.runTask(EventManagerImpl.java:578) 
    at com.google.net.eventmanager.EventManagerImpl.internalRunWorkerLoop(EventManagerImpl.java:1002) 
    at com.google.net.eventmanager.EventManagerImpl.runWorkerLoop(EventManagerImpl.java:884) 
    at com.google.net.eventmanager.WorkerThreadInfo.runWorkerLoop(WorkerThreadInfo.java:136) 
    at com.google.net.eventmanager.EventManagerImpl$WorkerThread.run(EventManagerImpl.java:1855) 

我的代码有什么问题? 谢谢

回答

0

我建议使用带有BlobKey的BlobReader类,该BlobKey指向Cloud Storage中的对象。

您可以使用createGsBlobKey生成BlobKey。

0

您的读者使用utf8这是一种字符编码。 PDF是一个二进制文件。尝试使用字节流进行读取。

相关问题