Python 开发服务器上的云存储正在删除上载的文件
我已经使用PIL创建了一个jpg文件,我想将该图像存储在云服务上。在生产过程中,该云服务已经有了一个存储桶,其中包含以前使用我的计算机创建图像并上传图像的实现中的图像,但这需要花费大量电力,因此我用python重新编写了该应用程序,所以我希望将整件事情都放在谷歌应用程序引擎上。为图像服务的主要应用程序运行PHP,我正在开发的这个新东西是运行python的应用程序的一个模块 PHP代码能够使用正确的gs_bucket_名称生成上传url,如下所示:Python 开发服务器上的云存储正在删除上载的文件,python,google-app-engine,google-cloud-storage,Python,Google App Engine,Google Cloud Storage,我已经使用PIL创建了一个jpg文件,我想将该图像存储在云服务上。在生产过程中,该云服务已经有了一个存储桶,其中包含以前使用我的计算机创建图像并上传图像的实现中的图像,但这需要花费大量电力,因此我用python重新编写了该应用程序,所以我希望将整件事情都放在谷歌应用程序引擎上。为图像服务的主要应用程序运行PHP,我正在开发的这个新东西是运行python的应用程序的一个模块 PHP代码能够使用正确的gs_bucket_名称生成上传url,如下所示: $storage = new CloudStor
$storage = new CloudStorageTools();
$url = $storage->createUploadUrl("/process_file",['gs_bucket_name' => 'my_bucket']);
echo("URL: $url\n");
curl http://localhost:8080/_ah/upload/ahFkZXZ-d2ltdm8tbWFycy0zZHIiCxIVX19CbG9iVXBsb2FkU2Vzc2lvbl9fGICAgICA-IULDA --form file=somefilename.jpg
我的电脑可以上传到那个url,文件会出现在开发服务器上,最终在实时版本上也运行良好,上传了很多图片。我用curl这样做:
$storage = new CloudStorageTools();
$url = $storage->createUploadUrl("/process_file",['gs_bucket_name' => 'my_bucket']);
echo("URL: $url\n");
curl http://localhost:8080/_ah/upload/ahFkZXZ-d2ltdm8tbWFycy0zZHIiCxIVX19CbG9iVXBsb2FkU2Vzc2lvbl9fGICAgICA-IULDA --form file=somefilename.jpg
我必须补充一点,这也不再在dev服务器上工作(从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)
但是,当我运行此命令时,上传的文件似乎立即被删除:
我得到的上传url具有不同的端口号,因为它们现在由处理模块(python)提供服务,而不再是默认模块(php),例如http://localhost:51022/_ah/upload/ahFkZXZ-D2LTDM8TBWFYCY0ZZHIICXIVX19CBG9IVXBS2FKU2VZC2LVBL9FGICAGICA 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 -
我认为“删除”是把我上传的文件扔掉的罪魁祸首,但为什么呢
- 到目前为止我尝试过的事情:
- 如果我省略了bucket,那么我将在dev服务器上的blob存储中看到一个上传的文件,但是由于部署的应用程序中的所有其他文件都在该bucket中,我怀疑这是否能很好地协同工作。
- 如果我立即将文件存储在blob存储中,而忽略上载步骤,我会在数据存储中同时获得一个uuu BlobInfo_uuu和一个uuu GsFileInfo_uu条目,但是uu BlobInfo_u上的filename字段是空的,而这恰好是我用来将上载的图像链接回原始记录的密钥,因此,图像可以与它一起使用。(正如你所看到的,我已经尝试了一种解决方法,但是现在云中已经存在的所有图像都会丢失这些信息,所以仍然不是一个合适的解决方案)
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()
现在看来,上传后必须移动文件。在PHP中,函数
将执行此操作。不确定这是由于询问Python的上传URL导致的,还是因为这是一个新的需求,而在我大约2年前第一次部署我的程序时,它并不存在。但是,仅仅将文件移动到特定的文件名似乎就可以在删除文件内容之前保存文件内容 现在看来,上传后必须移动文件。在PHP中,函数move\u-upload\u-file
将执行此操作。不确定这是由于询问Python的上传URL导致的,还是因为这是一个新的需求,而在我大约2年前第一次部署我的程序时,它并不存在。但是,仅仅将文件移动到特定的文件名似乎就可以在删除文件内容之前保存文件内容 您的答案是正确的,您必须移动该文件,否则它将自动从谷歌云存储中删除。如本文所述: 注意:未使用移动的任何用户上载的文件move\u-upload\u-file
或move\u上传的\u文件
在请求完成之前将被删除 自动从谷歌云存储中删除rename
我没有很快找到任何显示此要求何时更改的旧文档。您的回答是正确的,您必须移动该文件,否则它将自动从Google云存储中删除。如本文所述: 注意:未使用移动的任何用户上载的文件
或move\u上传的\u文件
在请求完成之前将被删除 自动从谷歌云存储中删除rename
我没有很快找到任何显示此要求何时更改的旧文档。您提到该文件似乎已被删除。您使用什么来确定文件已被删除?您还可以将此代码添加到您的示例中吗?日志记录是这样写的:
,并且如果我查询我的数据存储,也没有其他BlobInfo条目。但我找到了一个解决方案,我会在一分钟后发布。您提到该文件似乎已被删除。您使用什么来确定文件已被删除?您还可以将此代码添加到您的示例中吗?日志记录是这样写的:INFO 2016-01-24 10:48:30891 module.py:787]proc_mod:“DELETE/_ah/gcs/my_bucket/fake-pywzB198-jubU_Kcl-REhA%3D%3D HTTP/1.1”204
,并且如果我查询我的数据存储,也没有其他BlobInfo条目。但我找到了一个解决方案,我将在一分钟后发布。INFO 2016-01-24 10:48:30891 module.py:787]proc_mod:“DELETE/_ah/gcs/my_bucket/fake-pywzB198-jubU_Kcl-REhA%3D%3D HTTP/1.1”204