Flask应用程序文件上载 - 获取文件内容时出错

时间:2016-02-01 02:20:52

标签: python file-upload flask ibm-cloud cloudant

我正在开发一个烧瓶应用程序,它将文件上传到IBM Bluemix Cloudant DB。我需要将文件的内容保存为Cloudant中的键值对。 如果我尝试保存文本文件,它会正确读取内容。对于其他类型的文件,它不起作用。 以下是我的烧瓶REST API代码:

@app.route('/upload', methods=['POST'])
def upload_file():
    file_to_upload = request.files['file_upload'];
    response = CloudantDB().upload_file_to_db(file_to_upload);

//tHE FUNCTION upload_file under CloudantDB is as shown below.
file_name = file.filename;
uploaded_file_content = file.read();
data = {
            'file_name': file_name,
            'file_contents': uploaded_file_content,
            'version': version
            }
my_doc = self.database.create_document(data);

我知道错误是因为“uploaded_file_content”的格式不同(例如,对于PDF,JPG等)。 无论如何我能克服这个吗?

谢谢!

1 个答案:

答案 0 :(得分:0)

区别在于文本文件包含普通文本,而JPG,PNG等包含二进制数据。

二进制数据应该以mime类型的attachment上传,您需要对数据进行base64编码。您没有显示create_document()正在做什么,但它不太可能将二进制数据视为附件。这可能会为你解决这个问题:

from base64 import b64encode

uploaded_file_content = b64encode(file.read());
data = {
    'file_name': file_name,
    'version': version,

    '_attachments': {
        file_name : {
            'content-type': 'image/png',
            'data': uploaded_file_content
        }
    }
}

my_doc = self.database.create_document(data);

您当前的代码也应该可以简单地对文件内容进行base64编码并上传。因此,如果您以后检索它,您需要知道存储了哪种类型的数据,您需要添加另一个键值对来存储mime类型,如上面的content-type所示。

附件的优点在于它们可以单独处理,读取,删除和更新,而不会影响包含文档,因此您最好使用它们。