我正在尝试将保存/加载功能作为我正在构建的Web应用程序的一部分,但在我下载文件后无法正常重新加载文件。
我在python中列出了一个类似于
的列表 git pull
。
这是我关心的数据。然后我用
来腌制它[[bytes, bytes, int, list, list, str], [...], [...], etc]
并使用Flask的send_file发送它:
with open(file_path, 'wb') as fp:
pickle.dump(save_this_arr, fp)
在前端,我正在创建一个blob,编码数据网址,然后将其设置为隐藏return send_file(file_path, as_attachment=True)
的src:
<iframe>
这样可以正常工作并获取一个我可以重新上传的文件。
我不知道如何正确解码URL,以便我可以pickle.load结果。下面的两个链接看起来像是我需要的,但是当我将它应用到我的代码时,我得到了UnicodeDecodeErrors。
let blob = new Blob([response.data], { type: "application/octet-stream" });
let url = window.URL.createObjectURL(blob);
self.downloader.src = url
最初的问题是关于解码网址,因为我误解了with open(file_path, "rb") as fid:
contents = fid.read()
data = urllib.parse.parse_qs(contents, encoding='utf-16')
with open(file_path, 'wb') as fid:
fid.write(text)
with open(file_path, 'rb') as fid:
myList = pickle.load(fid)
正在做什么。从this blog post开始,我意识到我们实际上正在创建对内存中blob的引用。所以我真正想做的是在Python中读取Blob。
答案 0 :(得分:0)
我不确定为什么我无法直接解码blob,但在写入文件之前编码为base64字符串。
import base64
with open(file_path, 'wb') as fp:
data = pickle.dumps(save_this_arr)
encoded = base64.b64encode(data)
fp.write(encoded)
let blob = new Blob([response.data], { type: "application/octet-stream" });
let url = window.URL.createObjectURL(blob);
self.downloader.src = url
with open(file_path, "rb") as fid:
contents = fid.read()
decoded = base64.b64decode(contents)
myList = pickle.loads(decoded)