我正在开发一个烧瓶应用程序,它将文件上传到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等)。 无论如何我能克服这个吗?
谢谢!
答案 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
所示。
附件的优点在于它们可以单独处理,读取,删除和更新,而不会影响包含文档,因此您最好使用它们。