我正在尝试使用blobstore API,但是我有这个错误:
com.google.api.server.spi.SystemService invokeServiceMethod:调用后台方法时发生异常 com.google.apphosting.api.ApiProxy $ CallNotFoundException:找不到API包'file'或调用'Create()'。 在java.lang.Thread.getStackTrace(Thread.java:1589) 在com.google.apphosting.api.ApiProxy.makeSyncCall(ApiProxy.java:116) 在com.google.apphosting.api.ApiProxy.makeSyncCall(ApiProxy.java:65) 在com.google.appengine.api.files.FileServiceImpl.makeSyncCall(FileServiceImpl.java:590) 在com.google.appengine.api.files.FileServiceImpl.create(FileServiceImpl.java:512) 在com.google.appengine.api.files.FileServiceImpl.createNewBlobFile(FileServiceImpl.java:111) 在com.listecourses.model.ListeModelEndpoint.insertListeModel(ListeModelEndpoint.java:182) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 在java.lang.reflect.Method.invoke(Method.java:45) 在com.google.api.server.spi.SystemService.invokeServiceMethod(SystemService.java:359) 在com.google.api.server.spi.SystemServiceServlet.execute(SystemServiceServlet.java:113) 在com.google.api.server.spi.SystemServiceServlet.doPost(SystemServiceServlet.java:71) 在javax.servlet.http.HttpServlet.service(HttpServlet.java:637) 在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) 在org.mortbay.jetty.servlet.ServletHandler $ CachedChain.doFilter(ServletHandler.java:1157) 在org.mortbay.jetty.servlet.ServletHandler $ CachedChain.doFilter(ServletHandler.java:1157) 在org.mortbay.jetty.servlet.ServletHandler $ CachedChain.doFilter(ServletHandler.java:1157) 在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) 在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) at org.mortbay.jetty.HttpConnection $ RequestHandler.headerComplete(HttpConnection.java:923) 在org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:404) 在com.google.tracing.TraceContext $ TraceContextRunnable.runInContext(TraceContext.java:437) 在com.google.tracing.TraceContext $ TraceContextRunnable $ 1.run(TraceContext.java:444) 在com.google.tracing.CurrentContext.runInContext(CurrentContext.java:230) 在com.google.tracing.TraceContext $ AbstractTraceContextCallback.runInInheritedContextNoUnref(TraceContext.java:308) 在com.google.tracing.TraceContext $ AbstractTraceContextCallback.runInInheritedContext(TraceContext.java:300) 在com.google.tracing.TraceContext $ TraceContextRunnable.run(TraceContext.java:441) 在java.lang.Thread.run(Thread.java:745)
我使用此代码:
@ApiMethod(name = "insertListeModel", httpMethod = "POST")
public ListeModel insertListeModel(ListeModel listemodel) {
EntityManager mgr = getEntityManager();
try {
if (containsListeModel(listemodel)) {
throw new EntityExistsException("Object already exists");
}
FileService fileService = FileServiceFactory.getFileService();
if(listemodel.getImage()!=null && !listemodel.getImage().equals(""))
{
byte[] data = listemodel.getImage();
String mimeType = "image/png";
// save data to Google App Engine Blobstore
listemodel.setImage(null);
mgr.persist(listemodel);
AppEngineFile file;
file = fileService.createNewBlobFile(mimeType,"LM_"+listemodel.getId());
FileWriteChannel writeChannel = fileService.openWriteChannel(file, true);
writeChannel.write(java.nio.ByteBuffer.wrap(data));
writeChannel.closeFinally();
// your blobKey to your data in Google App Engine BlobStore
BlobKey blobKey = fileService.getBlobKey(file);
// THANKS TO BLOBKEY YOU CAN GET FOR EXAMPLE SERVING URL FOR IMAGES
// UploadOptions uploadOptions = UploadOptions.Builder
// .withGoogleStorageBucketName("photobucket11");
// Get the image serving URL (in https:// format)
String imageUrl = ImagesServiceFactory.getImagesService().getServingUrl(ServingUrlOptions.Builder.withBlobKey(blobKey).secureUrl(true));
// ImagesService imagesService = ImagesServiceFactory
// .getImagesService();
// ServingUrlOptions servingOptions = ServingUrlOptions.Builder
// .withBlobKey(blobKey);
// String imageUrl = imagesService.getServingUrl(servingOptions);
if(listemodel.getIdBlobkey()!=null)
{
BlobKey blobKeytmp= new BlobKey(listemodel.getIdBlobkey());
final AppEngineFile f = fileService.getBlobFile(blobKeytmp);
if(f.isReadable())
{
if(f.hasFinalizedName())
{
fileService.delete(f); // Problematic line
}
}
}
listemodel.setAvatar(imageUrl);
listemodel.setIdBlobkey(blobKey.getKeyString());
}
mgr.persist(listemodel);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
mgr.close();
}
return listemodel;
}
你能帮助我吗?
答案 0 :(得分:0)
看来文件API在2013年已被弃用,并最终在今年被禁用。请参阅:https://cloud.google.com/appengine/docs/deprecations/files_api