开发服务器上的云存储正在删除上载的文件

时间:2016-01-24 10:37:20

标签: python google-app-engine google-cloud-storage

我使用PIL创建了一个jpg文件,我想将该图像存储在云服务上。在生产中,云服务已经有一个带有图像的存储桶,其中包含使用我的计算机创建图像并上传它的先前实现,但这需要大量电力,所以我在python中重新编写应用程序,所以我希望将整个事情放在谷歌应用引擎上。为图像提供服务的主要应用程序运行PHP,我正在开发的这个新东西是运行python的应用程序的模块。

PHP代码能够使用正确的gs_bucket_name生成上传URL,如下所示:

$storage = new CloudStorageTools();
$url = $storage->createUploadUrl("/process_file",['gs_bucket_name' => 'my_bucket']);
echo("URL: $url\n");

我的电脑可以上传到该网址,文件将出现在开发服务器中,最终也会在实时版本中运行得很好,并且上传了大量图片。我正在使用curl这样做:

curl http://localhost:8080/_ah/upload/ahFkZXZ-d2ltdm8tbWFycy0zZHIiCxIVX19CbG9iVXBsb2FkU2Vzc2lvbl9fGICAgICA-IULDA --form file=somefilename.jpg

我必须补充一点,现在它也不再适用于开发服务器(从PHP端)

在python方面,我正在做类似的事情,但现在一切都在进行: 请注意,一旦上传图像,我仍然试图在我的默认PHP模块上调用回调函数。

callback = "http://%s/process_file" % modules.get_hostname(module="default")
upload_url = blobstore.create_upload_url(callback,gs_bucket_name="my_bucket")
outputstream = cStringIO.StringIO()
outputdata.save(outputstream, format="JPEG", optimized=True, quality=90)
files = []
files.append(MultipartParam("file", filename = filename, filetype = 'image/jpeg', value = outputstream.getvalue()))
outputstream.close()
data, headers = multipart_encode(files)
headers.pop('Content-Length',None)
result = urlfetch.fetch(
  url = upload_url,
  payload="".join(data),
  method=urlfetch.POST,
  headers=headers,
  follow_redirects = False)

然而,当我运行它时,似乎立即删除了上传的文件:

我得到的上传网址有不同的端口号,因为它们现在由处理模块(python)提供,而不再是默认模块(php),例如: http://localhost:51022/_ah/upload/ahFkZXZ-d2ltdm8tbWFycy0zZHIiCxIVX19CbG9iVXBsb2FkU2Vzc2lvbl9fGICAgICA-MULDA 在控制台日志中,我看到:

INFO     2016-01-24 10:48:30,891 module.py:787] proc_mod: "DELETE /_ah/gcs/my_bucket/fake-pywzB198-jubU_Kcl-REhA%3D%3D HTTP/1.1" 204 -
INFO     2016-01-24 10:48:30,904 module.py:787] default: "POST /process_file HTTP/1.1" 200 - 

我认为'删除'有罪魁祸首将我上传的文件丢弃,但为什么?

    到目前为止我尝试过的事情:
  • 如果我省略了存储桶,那么我将在开发服务器上的blob存储区中看到上传的文件,但由于部署的应用程序中的所有其他文件都在该存储桶中,我怀疑这将很好地协同工作。
  • 如果我将文件立即存储在blob存储区中而省略上传步骤,我会在数据存储区中同时获得__BlobInfo__和__GsFileInfo__条目,但__BlobInfo__上的文件名字段为空,这恰好发生在是我用来将上传的图像链接回原始记录的关键,因此图像可以与它一起提供。 (正如你所看到的那样,我已经尝试了一种解决方法,但是现在云中已有的所有图像都会丢失这些信息,因此仍然不是一个不错的解决方案)
        file = cloudstorage.open("/my_bucket/%s" % filename,mode = "w", content_type = 'image/jpeg', options = {'x-goog-meta-original': filename})
        file.write(outputstream.getvalue())
        file.close()
    
    现在记录如下:
    
    INFO     2016-01-24 11:12:59,993 module.py:787] proc_mod: "POST /_ah/gcs/my_bucket/somefilename.jpg HTTP/1.1" 201 -
    INFO     2016-01-24 11:13:00,069 module.py:787] proc_mod: "PUT /_ah/gcs/my_bucket/somefilename.jpg?upload_id=encoded_gs_file%3AbWFyczNkL3NvbWV0aGluZy5qcGc%3D HTTP/1.1" 200 -
    

第二次登录几乎看起来像我一直想要的,所以我的问题是:为什么上传被删除而cloudstorage写入保持不变? 有没有办法'修复'出错的地方? 更新:即使文件被删除,被调用的php页面仍然在它的$ _FILES数组中获取有关它的信息:

    [file] => Array
        (
            [name] => somefilename.jpg
            [type] => image/jpeg
            [tmp_name] => gs://my_bucket/fake-IrYBUvl5acdwBmDoOBKgCQ==
            [error] => 0
            [size] => 84916
        )

2 个答案:

答案 0 :(得分:0)

现在似乎必须在上传后移动文件。在PHP中,函数move_uploaded_file将执行此操作。不确定是否是由于要求上传URL到Python发生这种情况,或者是否是一个新的要求,当我第一次部署我的程序差不多2年前。但只是将文件移动到特定的文件名似乎可以在删除之前保存文件内容。

答案 1 :(得分:0)

您的回答是正确的,因为您必须移动该文件,否则它将自动从Google云端存储中删除。如Implementing file uploads文章中所述:

  

注意:任何用户都上传了未使用的文件   在请求完成之前move_uploaded_filerename将是   自动从Google云端存储中删除。

我没有快速找到任何旧文档,显示此要求何时可能已更改。