处理存储在云端(S3 或 Spaces)的文件

Processing files stored on cloud (S3 or Spaces)

我设置了一个脚本来处理 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 下载文件,然后将其作为本地文件处理?感觉效率低下?我有哪些选择?

您可以获得文件的字节内容,将其包装在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]