Flask/Python:从绝对路径创建zip文件失败-没有这样的文件或目录

Flask/Python:从绝对路径创建zip文件失败-没有这样的文件或目录,python,flask,server,zipfile,Python,Flask,Server,Zipfile,我正在创建一个CKAN插件,允许用户从数据库服务器选择和下载多个资源(文件)。 我用一些Python代码创建了一个flask view函数,该函数应该使用请求的资源创建一个zip文件,但是创建失败,出现了“没有这样的文件或目录”错误,尽管我给出了绝对路径 代码是基于,和后,并解决目前的问题,我已经检查,并没有太多的成功 代码如下: import zipfile import io def download_multiple_resources(): if request.method

我正在创建一个CKAN插件,允许用户从数据库服务器选择和下载多个资源(文件)。 我用一些Python代码创建了一个flask view函数,该函数应该使用请求的资源创建一个zip文件,但是创建失败,出现了“没有这样的文件或目录”错误,尽管我给出了绝对路径

代码是基于,和后,并解决目前的问题,我已经检查,并没有太多的成功

代码如下:

import zipfile
import io

def download_multiple_resources():
    if request.method == "POST":

        memory_file = io.BytesIO()
        with zipfile.ZipFile(memory_file, "w", zipfile.ZIP_STORED) as zf:
            for res in request.form.values():
                zf.write(str(res), 'download.zip')

return send_file(memory_file, mimetype='application/zip', as_attachment=True, attachment_filename='download.zip')
用户通过一个表单选择资源,该表单发布请求。 表单提交所请求文件的完整路径,因此如果用户选择下载
testfile.txt
,则在
res
值上方的代码中类似于
http://localhost:5000/dataset/6192bb3b-6c4a/resource/dbe39d59-b938/download/testfile.txt
。(当前正在我的机器上docker容器中创建的服务器上测试)

请注意,通过在浏览器中复制粘贴上述路径,我可以访问该文件,而不会出现任何问题。 但是,
zf.write
命令失败,出现“无此类文件或目录”错误


你知道哪里出了问题吗?

你说你想通过绝对路径访问资源,但是你的
res
示例值是一个URL


我认为
zipfile.zipfile.write
不支持这一点,因为将文件添加到zip存档中会使用文件系统中的元数据(时间戳等)。您需要通过其本地路径访问资源,或者如果无法从应用程序容器访问资源,请先将其下载到临时位置。(后一种情况当然会删除元数据。)

结果证明我最初的猜测是正确的,除了通过http请求读取文件外,只需使用
writest()
而不是
write()
。 以下是完整的工作代码:

import zipfile
import io
import requests
from flask import request, send_file

def download_multiple_resources():
    if request.method == "POST":
        memory_file = io.Bytes.IO()
        with zipfile.ZipFile(memory_file, 'w', zipfile.ZIP_STORED) as zf:
            for res in request.form:
                f = requests.get(res, allow_redirects=True)
                zf.writestr('your_chosen_filename', f.content)
        memory_file.seek(0)

    return send_file(memory_file, mimetype='application/zip', as_attachment=True, attachment_filename="download.zip")

额外注意:如果您在像我这样的外部服务器上工作,并使用此功能让登录用户下载文件,请确保将用户的凭据传递给
请求。get()
调用以授权下载。在我的例子中,这是使用选项
headers={'Authorization':user.apiKey}
完成的,但这可能取决于您的框架/应用程序。

谢谢您的回答!我看不出绝对路径和完整URL之间有什么区别——这是服务器上的绝对路径——但我的技术水平不足以对此有更好的看法。我将尝试使用您建议的本地路径,并标记为答案(如果有效)。下载我在服务器上的文件以压缩它并将其作为下载返回给用户似乎是一种非常低效的方法。对于任何对此进行否决的人,您可能会很有帮助,并写下1)您否决的原因,以便在必要时我可以改进我的问题;2)也许你对解决方案有什么想法?