保存到数据库超过50kB时,PDF损坏了

时间:2019-07-02 01:53:51

标签: ajax pdf flask blob flask-sqlalchemy

我有一个网页,用户可以在其中上传PDF文件,并使用AJAX将其发送到我的Flask应用程序。这是ajax代码:

var formData = new FormData();
formData.append('attachment', document.getElementById("attachment").files[0]);
$.ajax({
    type: 'POST',
    url: 'process_award_storage',
    contentType: false,
    processData: false,
    data: formData
})

我认为这没有任何问题,因为我可以在python代码中打印出文件的内容和标题。然后,我的烧瓶模型就这样定义了,使用LargeBinary作为PDF附件:

class AwardStore(db.Model):
    __tablename__ = 'awards_store'
    id = db.Column(db.Integer, primary_key=True)
    ...
    file = db.Column(db.LargeBinary, nullable=True) #I am sure this is the right file type for PDF saving

最后,这是将AJAX文件保存到数据库的方式:

     award = AwardStore(name=name, file=request.files['attachment'].read())
     db.session.add(award)
     db.session.commit()

我可以使用MySQL Workbench看到它已保存。但是,当我尝试从那里将BLOB下载到桌面并打开它时,它显示“无法加载PDF文档”。当我使用烧瓶的send_file时,也会发生同样的情况。好像我在网上看到的一样,做了所有事情,但是出了点问题。

这些警告是否相关?:

C:\Users\msolonko\Desktop\NICKFI~1\CACHTM~1\APP_DE~1\virt\lib\site-packages\pymysql\cursors.py:170: Warning: (1300, "Invalid utf8 character string: 'C4E5F2'")
  result = self._query(query)
C:\Users\msolonko\Desktop\NICKFI~1\CACHTM~1\APP_DE~1\virt\lib\site-packages\pymysql\cursors.py:170: Warning: (1265, "Data truncated for column 'file' at row 1")
  result = self._query(query)

我尝试使用Google搜索,但没有找到任何东西。感谢您的协助。

编辑:

我注意到通常会正确上传和显示小文件。问题在于文件大小>〜50kB。我正在使用AWS RDS的数据库,是否可以更改某个设置以启用更大的大小?

1 个答案:

答案 0 :(得分:1)

LargeBinary也接受长度字段。 它将转换为mysql的BLOB,其默认长度为65535字节(64kb)。 尝试增加长度并将其设置为

一个MEDIUMBLOB,用于16777215字节(16 MB)

一个LONGBLOB,用于4294967295字节(4 GB)。

希望这会有所帮助