我使用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 -
我认为'删除'有罪魁祸首将我上传的文件丢弃,但为什么?
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
)
答案 0 :(得分:0)
现在似乎必须在上传后移动文件。在PHP中,函数move_uploaded_file
将执行此操作。不确定是否是由于要求上传URL到Python发生这种情况,或者是否是一个新的要求,当我第一次部署我的程序差不多2年前。但只是将文件移动到特定的文件名似乎可以在删除之前保存文件内容。
答案 1 :(得分:0)
您的回答是正确的,因为您必须移动该文件,否则它将自动从Google云端存储中删除。如Implementing file uploads文章中所述:
注意:任何用户都上传了未使用的文件 在请求完成之前
move_uploaded_file
或rename
将是 自动从Google云端存储中删除。
我没有快速找到任何旧文档,显示此要求何时可能已更改。