Python基礎教程:Flask上傳檔案(包含中文)儲存後亂碼問題解決

千鋒Python唐小強發表於2019-11-11


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')


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69923331/viewspace-2663557/,如需轉載,請註明出處,否則將追究法律責任。

相關文章