【问题标题】:Let users download a CSV file in Rails app让用户在 Rails 应用程序中下载 CSV 文件
【发布时间】:2019-11-30 23:12:10
【问题描述】:

我的 S3 存储桶中存储了一个 CSV 文件,我想在 Rails 中添加一个方法,以便用户可以单击一个按钮并下载该文件。在控制器中我放了以下

def s3_downloader(bucketName, key, localPath)
    # (1) Create S3 object
    s3 = Aws::S3::Resource.new(region: 'us-east-2')
    # (2) Create the source object
    sourceObj = s3.bucket(bucketName).object(key)
    # (3) Download the file
    sourceObj.get(response_target: localPath)
    puts "s3://#{bucketName}/#{key} has been downloaded to #{localPath}"
  end

我从Tutorial得到的

请问我应该把什么作为localPath?我尝试了一些简单的方法:

s3_downloader(Rails.application.secrets.s3_bucket_name, "Product_csv_file_sample.csv", "/Downloads")

但我得到了错误:

Errno::EACCES (Permission denied @ rb_sysopen - /Downloads)
2.6.3 :040 >   s3_downloader(Rails.application.secrets.s3_bucket_name, "Product_csv_file_sample.csv", "/Downloads")

Traceback (most recent call last):
        3: from (irb):40
        2: from (irb):40:in `rescue in irb_binding'
        1: from (irb):30:in `s3_downloader'

另外,我如何确保无论用户使用的是 Mac 还是 Windows,localPath 仍然有效。

下载文件夹中的chmod 'chown'返回:

usage:  chmod [-fhv] [-R [-H | -L | -P]] [-a | +a | =a  [i][# [ n]]] mode|entry file ...
    chmod [-fhv] [-R [-H | -L | -P]] [-E | -C | -N | -i | -I] file ...

【问题讨论】:

  • “/Downloads”指的是哪里?在客户端还是服务器上?您不需要在客户端上指定文件夹。
  • 您似乎正在尝试访问服务器上的文件夹。而不是响应文件,让浏览器将其放置在默认下载位置。
  • 嗨,我以为我将 localPath 指示为下载文件的文件夹。请问你有什么推荐的?
  • 可能在将文件发送到客户端之前创建一个临时路径来存储文件。例如"/#{Rails.root}/tmp/downloads/#{some_id_here}/"
  • 还研究如何使用文件stackoverflow.com/questions/9233021/returning-files-from-rails响应网络请求

标签: ruby-on-rails


【解决方案1】:

根据您发布的错误,运行rails server 的用户似乎没有写入/读取Downloads 目录的权限。我会在那里检查,并在必要时使用chmod`chown` 修复它们。

【讨论】:

  • 我修改问题添加了chmod的结果
猜你喜欢
  • 2017-03-16
  • 1970-01-01
  • 2021-05-23
  • 2021-11-29
  • 2020-10-10
  • 2012-04-10
  • 2023-03-30
  • 1970-01-01
  • 2011-09-17
相关资源
最近更新 更多