当前位置: 首页 > 知识库问答 >
问题:

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

宋嘉禧
2023-03-14

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

PHP代码能够使用正确的gs_bucket_名称生成上传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

我必须补充一点,这也不再在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 - 

我认为“删除”是把我上传的文件扔掉的罪魁祸首,但为什么呢?

    Things I tried so far:
  • If I omit the bucket then I will see an uploaded file in the blob store on the dev server, but since all the other files in the deployed application are in that bucket, I doubt this will work together nicely.
  • If I store the file immediately in the blob store omitting the upload step, I get both a __BlobInfo__ and a __GsFileInfo__ entry in my datastore, but the filename field on the __BlobInfo__ is empty, and that just happened to be the key I was using to link the uploaded image back to the original record it came from, so the image could be served alongside it. (As you can see I experimented with a workaround for this already, but this info would then be missing on all the images already in the cloud right now, so still not a decent solution)
        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 -
    

    第二次日志记录看起来几乎是我一直想要的,所以我的问题是:为什么上传被删除,云存储写入得以保留?有没有办法“解决”任何问题?更新:即使文件被删除,被调用的php页面仍然在它的$_FILES数组中获取有关它的信息:

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

共有1个答案

尹承业
2023-03-14

现在看来,上传后必须移动文件。在PHP中,函数move\u-upload\u-file将执行此操作。不确定这是由于询问Python的上传URL导致的,还是因为这是一个新的需求,而在我大约2年前第一次部署我的程序时,它并不存在。但是,仅仅将文件移动到特定的文件名似乎就可以在删除文件内容之前保存文件内容。

 类似资料:
  • 我在两台服务器的memcache上都面临会话存储问题。我在云服务器上安装了memcached 3)vi/etc/sysconfig/memcached并添加 port=“11211” user=“memcached” maxconn=“1024” cachesize=“264” options=“-l 127.0.0.1”//,我尝试将服务器1的ip放在服务器1的memcache配置文件上,将服务

  • 我试图使用Laravel 5的Storage::disk()- 以下是我的方法: 这是我的错误:

  • 问题内容: 使用该插件,我将创建一个文件并基于单击按钮生成下载。我想将文件保存到服务器上,而不是启动下载。因此,当单击按钮时,我希望将文件保存在: 我知道我需要使用将文件发布到服务器。但是,查看文档并没有看到对任何数据类型的支持。 我的代码: 基于此xml文档保存示例,我尝试了以下操作: 这将下载文件而不是保存文件。如何保存文件? 问题答案: 我设法使用来解决此问题,方法如下: upload.ph

  • 我有一个基于Spring(Spring Security,Spring控制器和MVC)的项目,所以在我的超文本标记语言页面中,我必须允许文件下载。 我处理事件并使用基于jquery插件的代码 在我的控制器中: 但它在Spring Security性方面有问题,比如这个post x-frame,在internet explorer上不起作用。那么,有没有一种不用插件就能下载存储在我服务器上的文件的方

  • 我正在尝试上传一个图像。当我从本地主机上进行时,它工作得很好,但当我发布它时,它从服务器上抛出一个错误: 当我使用此代码时: 错误为: System.io.DirectoryNotFoundException:找不到路径“d:\inetpub\vhosts\xx.com\httpdocs\images\sections\developer\clientlogo\demo.png”的一部分。在sys

  • 我正在使用Phonegap Developer for Android开发Phonegap应用程序。我有一个大问题:在我更改一些文件之后,比如索引。html,或一些。js,一些。css,一些。png 。。。它在应用程序上不起作用。基本上,应用程序重新加载,我得到相同的旧文件。 我尝试用四个手指重新加载,用三个手指返回应用程序主页,然后再次连接。我试着通过桌面检查并强制定位。重新加载(true)。没