在 Google 应用引擎中如何删除最初使用文件服务存储的文件

Posted

技术标签:

【中文标题】在 Google 应用引擎中如何删除最初使用文件服务存储的文件【英文标题】:In Google appengine how to delete a file originaly stored using FileService 【发布时间】:2013-06-30 09:27:51 【问题描述】:

我正在尝试删除使用 FileService 存储的文件。在少数情况下,删除会成功,但在大多数情况下不会成功,而且我还没有找到模式。我在本地服务器上的 Windows 7 上使用 Eclipse。我怎样才能删除文件?

编辑:当我上传到 appengine 时它​​可以工作。

这里是存储代码:

try 
                            
                                FileService fileService = FileServiceFactory.getFileService();
                                AppEngineFile file = fileService.createNewBlobFile(content_type, fileName);
                                boolean lock = true;
                                FileWriteChannel writeChannel = fileService.openWriteChannel(file, lock);
                                byte[] b1 = new byte[BUFFER_SIZE];
                                int readBytes1;
                                while ((readBytes1 = is.read(b1)) != -1) 
                                
                                    writeChannel.write(ByteBuffer.wrap(b1, 0, readBytes1));
                                

                                writeChannel.closeFinally();

                                blobKey = fileService.getBlobKey(file);
                                item_image_blob_key = blobKey.getKeyString();
                             
                            catch (Exception e) 
                            
                                System.out.println(e.getLocalizedMessage());
                                e.printStackTrace(response.getWriter());
                            

这是删除尝试:

@Override
public long deleteItem(Long id) 

    System.out.println(LOG +"   Trying to delete item with this id: " + id);

    Key parent = KeyFactory.createKey("MffItems", MFF_ITEM_ROOT_KEY);
    Key key = KeyFactory.createKey(parent, "Item", id);

    try
    
        Entity e = datastore.get(key); 
        String image_key = (String) e.getProperty("image_blob_key");

        BlobKey blobKey = new BlobKey(image_key);
        final AppEngineFile f = fileService.getBlobFile(blobKey);

        if(f.isReadable())
        
            System.out.println(LOG + "  file is readable");

            if(f.hasFinalizedName())
            
                System.out.println(LOG + "  file has finalized name:  " + f.getNamePart());

                fileService.delete(f); // Problematic line
                datastore.delete(key);
                return id;
            
        
    
    catch(Exception e)
    
        System.out.println(LOG + "   " + e.toString() + "  " + e.getMessage());
    

    // TODO Auto-generated method stub
    return -1;

这是我得到的错误:

I_MFF_ItemService 正在尝试删除具有此 ID 的项目:2 I_MFF_ItemService 文件可读 I_MFF_ItemService 文件已最终确定名称:TXP5bVCmBVugDOxktBGv_w 2013 年 6 月 30 日下午 12:24:03 com.google.appengine.api.blobstore.dev.LocalBlobstoreService$1 运行 警告:无法删除 blob: java.io.IOException:无法删除:C:\Users\Gideon\Desktop\dev\workspace2\ItemManager1.41\war\WEB-INF\appengine-generated\TXP5bVCmBVugDOxktBGv_w 在 com.google.appengine.api.blobstore.dev.FileBlobStorage.deleteBlob(FileBlobStorage.java:79) 在 com.google.appengine.api.blobstore.dev.LocalBlobstoreService$1.run(LocalBlobstoreService.java:153) 在 java.security.AccessController.doPrivileged(本机方法) 在 com.google.appengine.api.blobstore.dev.LocalBlobstoreService.deleteBlob(LocalBlobstoreService.java:146) 在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 在 sun.reflect.NativeMethodAccessorImpl.invoke(未知来源) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(未知来源) 在 java.lang.reflect.Method.invoke(未知来源) 在 com.google.appengine.tools.development.ApiProxyLocalImpl$AsyncApiCall.callInternal(ApiProxyLocalImpl.java:521) 在 com.google.appengine.tools.development.ApiProxyLocalImpl$AsyncApiCall.call(ApiProxyLocalImpl.java:475) 在 com.google.appengine.tools.development.ApiProxyLocalImpl$AsyncApiCall.call(ApiProxyLocalImpl.java:452) 在 java.util.concurrent.Executors$PrivilegedCallable$1.run(未知来源) 在 java.security.AccessController.doPrivileged(本机方法) 在 java.util.concurrent.Executors$PrivilegedCallable.call(未知来源) 在 java.util.concurrent.FutureTask$Sync.innerRun(未知来源) 在 java.util.concurrent.FutureTask.run(未知来源) 在 java.util.concurrent.ThreadPoolExecutor.runWorker(未知来源) 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(未知来源) 在 java.lang.Thread.run(Unknown Source)

I_MFF_ItemService java.io.IOException: Blobstore 失败 Blobstore 失败 2013 年 6 月 30 日下午 12:24:27 com.google.appengine.api.datastore.dev.LocalDatastoreService$PersistDatastore 坚持 信息:持久化数据存储的时间:20 毫秒

【问题讨论】:

【参考方案1】:

这是开发服务器的一个已知错误,由文件被锁定在文件系统中引起。见this logged issue。

停止/重新启动开发服务器是一种解决方法。

【讨论】:

以上是关于在 Google 应用引擎中如何删除最初使用文件服务存储的文件的主要内容,如果未能解决你的问题,请参考以下文章

如何从Google云端硬盘下载csv文件以在移动应用中显示内容

从 github 更新谷歌云应用引擎上的 nodejs 应用

如何在类似于应用引擎的Google Compute引擎上部署应用?

三步搭建自己的Google搜索引擎

谷歌云如何通过虚拟化实现可扩展性?

腾讯企点客服接待来源为搜索引擎社交广告直接访问其他是指什么?