您好,登錄后才能下訂單哦!
Flask是支持文件上傳的, 近來做了一個上傳SQL文件的功能, SQL中會使用到中文, 泰文, 馬來西亞文等多種語言,
我們通過Flask接收到文件, 先把文件保存在后端, 保存后卻發現是亂碼.
from flask import request
from werkzeug.utils import secure_filename
@app.route('/upload', methods=['GET', 'POST'])
def upload_file():
if request.method == 'POST':
f = request.files['the_file']
f.save('/var/www/uploads/' + secure_filename(f.filename))
...
通過上面一段代碼接收并保存中文文件會亂碼的.
如何解決呢?
首先考慮亂碼是如何產生的呢, 兩種不同的編碼方式導致的.
通過Python的chardet模塊的detect方法可以獲取到字符串的編碼方式
file = request.files.get('file')
sql_content = file.read()
encoding = chardet.detect(sql_content)['encoding']
我的項目中獲取的編碼方式是GB2312編碼
解決編碼錯亂的問題就是先正確解碼, 再重新編碼, 本項目中是先用GB2312解碼, 然后用UTF-8編碼. 如下:
sql_content = sql_content.decode('GB2312').encode('utf-8')
上面重新編碼后的sql_content的再重新寫入文件對象, 然后保存就解決了中文亂碼的問題.
file.truncate()
file.seek(0)
file.write(sql_content)
file.save('test.sql')
后臺之間保存文件的亂碼問題解決后, 我們通過MINIO的SDK上傳的亂碼問題也迎刃而解.
代碼全覽:
# 文件上傳接口
class DBTaskSQLFile(Resource):
# 新建文件
def post(self):
file = request.files.get('file')
file.seek(0)
sql_content = file.read()
encoding = chardet.detect(sql_content)['encoding']
sql_content = sql_content.decode(encoding).encode('utf-8')
file.truncate()
file.seek(0)
file.write(sql_content)
file.seek(0)
# SQL文件上傳至文件服務器
try:
pass
except Exception as err:
print('[MINIO]:', err)
return jsonify(code=1, msg='SQL文件上傳至文件服務器時失敗')
return jsonify(code=0, msg='Success')
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。