【问题标题】:Processing files stored on cloud (S3 or Spaces)处理存储在云(S3 或 Spaces)上的文件
【发布时间】:2019-05-17 12:18:05
【问题描述】:

我已经设置了一个脚本来处理用户上传的 excel 文件。当文件存储在本地磁盘上时,脚本可以正常工作。

from openpyxl import load_workbook

wb = load_workbook("file_path.xlsx")  # Load workbook from disk works fine
ws = wb.worksheets[0]

然后我设置了django-storages 以允许用户上传的文件存储在数字海洋空间中。

我现在的问题是如何访问和处理云存储的文件。作为记录,如果我将文件 URL 传递给 load_workbook 它会失败并出现错误 No such file or directory: file_url

我必须使用requests 下载文件,然后将其作为本地文件处理吗?感觉效率低下?我有什么选择?

【问题讨论】:

    标签: python django openpyxl django-storage


    【解决方案1】:

    您可以获取文件的字节内容,将其包装在ContentFile 中并将其传递给openpyxl。假设您的模型是FileContainer,字段名称是file

    from django.core.files.base import ContentFile
    from openpyxl import load_workbook
    
    fc = FileContainer.objects.first()
    bytefile = fc.file.read()
    wb = load_workbook(ContentFile(bytefile))
    ws = wb.worksheets[0]
    

    我用 S3 检查了它,它工作得很好。

    如果你想在本地实际保存文件,你可以试试这个:

    from django.core.files.base import ContentFile
    from django.core.files.storage import FileSystemStorage
    from openpyxl import load_workbook
    
    fc = FileContainer.objects.first()
    local_storage = FileSystemStorage()
    
    bytefile = fc.file.read()
    newfile = ContentFile(bytefile)
    
    relative_path = local_storage.save(fc.file.name, newfile)
    
    wb = load_workbook(local_storage.path(relative_path))
    ws = wb.worksheets[0]
    

    【讨论】:

    • 谢谢。这也适用于 Digital Ocean 的 Spaces。对于小文件,我相信它就足够了。您会对其进行更改以使其对大文件(100-400 MB 范围)更有效吗?
    • 对于大文件,我宁愿下载文件并将其保存为默认FileSysteStorage。不是通过requests,而是通过原生 django 功能,以保持 AWS 凭证和灵活性。
    • 查看 Django 链接和快速谷歌搜索几分钟后,我不确定如何使用 FileStystemStorage 下载和保存文件。您能否提供 sn-p 或链接来说明如何完成此操作?
    • @lukik 我开始怀疑它是否是更好的解决方案,但无论如何附上它以供参考。想不出没有ContentFile 的其他解决方案。之后不要忘记删除文件。
    • @lukik 另一种选择是通过低级boto3 库(在django-storages 下使用)从S3 下载文件,然后直接打开它。不会使用 django 文件 API。
    猜你喜欢
    • 2013-06-10
    • 1970-01-01
    • 2018-06-23
    • 2017-06-16
    • 2019-09-25
    • 1970-01-01
    • 2021-11-30
    • 1970-01-01
    • 2021-12-02
    相关资源
    最近更新 更多