所以。我是个白痴。星期五,我以编程方式覆盖了存储桶中的大约 14,000 个文件,直到今天才意识到这一点。幸运的是,这些文件是有版本控制的。不幸的是,我找不到一个清楚的例子来说明如何编写脚本来遍历文件,然后恢复第二个最近的版本。我一直在浏览 Boto 文档,我看到了如何删除版本,而不是恢复。如果有人能给我一些显示如何恢复特定版本的代码,我很乐意使用 php 或 python。
最佳答案
这需要您多加注意。我不想尝试为您提供完整的解决方案,因为我没有时间对其进行彻底测试,也不想做出任何 promise 。
但是,也许这会有所帮助。
首先,假设我们想要在 boto 的特定存储桶中查找特定 key 的所有版本。我们可以这样做:
import boto
conn = boto.connect_s3()
bucket_name = 'mybucket'
key_name = 'mykey'
bucket = conn.lookup(bucket_name)
for k in bucket.list_versions(key_name):
print(k.name, k.version_id, k.last_modified)
这应该打印出这样的东西:
mykey TyvPH4UUD4zRnGhmmLH6HGHOcOnsJgQG 2013-03-03T19:10:39.000Z
mykey IxNYlmoyDsOSspR6SwuGVNM7Nr83ZTSI 2013-03-03T15:11:06.000Z
mykey XVI9_yxQYU6B2KXQv0VLj7luYOGwWCoh 2013-03-03T15:10:55.000Z
mykey qh0zjxWjRC8WvXQc_RmvVdCJ.S3gF2ui 2013-03-03T15:07:46.000Z
假设我们想要“恢复”最旧的文件。为此,我们实际上将对象的所需版本复制回自身。在 boto 中,它看起来像这样:
bucket.copy_key(new_key_name=key_name, src_bucket_name=bucket_name, src_key_name=key_name, src_version_id='qh0zjxWjRC8WvXQc_RmvVdCJ.S3gF2ui')
这会将指定版本的 key 复制回同一存储桶中的自身。
我认为在松开脚本之前,您必须对此进行一些探索并进行大量测试。例如,您可以尝试将所需版本的对象复制到另一个存储桶中,并在复制到所需存储桶之前查看是否获得所需内容。
希望这对您有所帮助。
关于php - 在 Amazon 的 S3 上批量恢复以前的版本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16025971/
从给定URL下载文件并立即将其上传到AmazonS3的更直接的方法是什么(+将有关文件的一些信息保存到数据库中,例如名称、大小等)?现在,我既不使用Paperclip,也不使用Carrierwave。谢谢 最佳答案 简单明了:require'open-uri'require's3'amazon=S3::Service.new(access_key_id:'KEY',secret_access_key:'KEY')bucket=amazon.buckets.find('image_storage')url='http://www.ex
我正在编写一个小脚本来定位aws存储桶中的特定文件,并创建一个临时验证的url以发送给同事。(理想情况下,这将创建类似于在控制台上右键单击存储桶中的文件并复制链接地址的结果)。我研究过回形针,它似乎不符合这个标准,但我可能只是不知道它的全部功能。我尝试了以下方法:defauthenticated_url(file_name,bucket)AWS::S3::S3Object.url_for(file_name,bucket,:secure=>true,:expires=>20*60)end产生这种类型的结果:...-1.amazonaws.com/file_path/file.zip.A
我发现ActiveRecord::Base.transaction在复杂方法中非常有效。我想知道是否可以在如下事务中从AWSS3上传/删除文件:S3Object.transactiondo#writeintofiles#raiseanexceptionend引发异常后,每个操作都应在S3上回滚。S3Object这可能吗?? 最佳答案 虽然S3API具有批量删除功能,但它不支持事务,因为每个删除操作都可以独立于其他操作成功/失败。该API不提供任何批量上传功能(通过PUT或POST),因此每个上传操作都是通过一个独立的API调用完成的
我在我的Rails项目中使用Pow和powifygem。现在我尝试升级我的ruby版本(从1.9.3到2.0.0,我使用RVM)当我切换ruby版本、安装所有gem依赖项时,我通过运行railss并访问localhost:3000确保该应用程序正常运行以前,我通过使用pow访问http://my_app.dev来浏览我的应用程序。升级后,由于错误Bundler::RubyVersionMismatch:YourRubyversionis1.9.3,butyourGemfilespecified2.0.0,此url不起作用我尝试过的:重新创建pow应用程序重启pow服务器更新战俘
我正在尝试修改当前依赖于定义为activeresource的gem:s.add_dependency"activeresource","~>3.0"为了让gem与Rails4一起工作,我需要扩展依赖关系以与activeresource的版本3或4一起工作。我不想简单地添加以下内容,因为它可能会在以后引起问题:s.add_dependency"activeresource",">=3.0"有没有办法指定可接受版本的列表?~>3.0还是~>4.0? 最佳答案 根据thedocumentation,如果你想要3到4之间的所有版本,你可以这
在Rails4.0.2中,我使用s3_direct_upload和aws-sdkgems直接为s3存储桶上传文件。在开发环境中它工作正常,但在生产环境中它会抛出如下错误,ActionView::Template::Error(noimplicitconversionofnilintoString)在View中,create_cv_url,:id=>"s3_uploader",:key=>"cv_uploads/{unique_id}/${filename}",:key_starts_with=>"cv_uploads/",:callback_param=>"cv[direct_uplo
我正在尝试编写一个将文件上传到AWS并公开该文件的Ruby脚本。我做了以下事情:s3=Aws::S3::Resource.new(credentials:Aws::Credentials.new(KEY,SECRET),region:'us-west-2')obj=s3.bucket('stg-db').object('key')obj.upload_file(filename)这似乎工作正常,除了该文件不是公开可用的,而且我无法获得它的公共(public)URL。但是当我登录到S3时,我可以正常查看我的文件。为了使其公开可用,我将最后一行更改为obj.upload_file(file
如果我使用ruby版本2.5.1和Rails版本2.3.18会怎样?我有基于rails2.3.18和ruby1.9.2p320构建的rails应用程序,我只想升级ruby的版本,而不是rails,这可能吗?我必须面对哪些挑战? 最佳答案 GitHub维护apublicfork它有针对旧Rails版本的分支,有各种变化,它们一直在运行。有一段时间,他们在较新的Ruby版本上运行较旧的Rails版本,而不是最初支持的版本,因此您可能会发现一些关于需要向后移植的有用提示。不过,他们现在已经有几年没有使用2.3了,所以充其量只能让更
我安装了ruby版本管理器,并将RVM安装的ruby实现设置为默认值,这样'哪个ruby'显示'~/.rvm/ruby-1.8.6-p383/bin/ruby'但是当我在emacs中打开inf-ruby缓冲区时,它使用安装在/usr/bin中的ruby。有没有办法让emacs像shell一样尊重ruby的路径?谢谢! 最佳答案 我创建了一个emacs扩展来将rvm集成到emacs中。如果您有兴趣,可以在这里获取:http://github.com/senny/rvm.el
我有一个应用程序可以读取文件的内容并为其编制索引。我将它们存储在磁盘本身中,但现在我使用的是AmazonS3,因此以下方法不再适用。事情是这样的:defperform(docId)@document=Document.find(docId)if@document.file?#Youshould'tcreateanewversion@document.versionlessdo|doc|@document.file_content=Cloudoc::Extractor.new.extract(@document.file.file)@document.saveendendend@docu