解码已编码为Blob的pickle文件

时间:2018-02-22 00:43:46

标签: javascript python flask pickle

概述:

我正在尝试将保存/加载功能作为我正在构建的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。

参考文献:

Url decode UTF-8 in Python

decoding URL encoded byte stream data in python

1 个答案:

答案 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)