Дамп файла pickle и получить загрузку, не сохраняя его нигде в приложении Flask

#html #python-3.x #flask #pickle #pem

#HTML #python-3.x #flask #pickle #pem

Вопрос:

 @app.route('/', methods=['POST'])
def upload_file():
  if request.method == 'POST':

    if 'files[]' not in request.files:
      flash('No file part')
      return redirect(request.url)

    files = request.files.getlist('files[]')
    ...Processing my multiple uploaded files in Flask App...
    ...
    b64_encoded_list = base64.b64encode(json_encoded_list)
    print(b64_encoded_list)
    ## b64_encoded_list is a simple string ##
    buffer = BytesIO()
    buffer.write(b64_encoded_list)
    buffer.seek(0)
    flash('File(s) successfully uploaded')
    return send_file(buffer, mimetype="image/jpg", attachment_filename="license.pem", as_attachment=True)
  

Теперь я могу отправлять и загружать в части веб-приложения, но файл .pem поврежден, поскольку b64_encoded_list содержит кодировку строки b64, хранящуюся в файлах .pem. Но после загрузки файла из веб-приложения и повторного чтения его обратно я получаю сообщение об ошибке — encrypted = pickle.загрузить (открыть (pemfile, «rb»))

Ошибка — UnpicklingError: неверный ключ загрузки, ‘W’.

Как решить эту проблему Я также использовал mimetype — application / x-x509-ca-cert, но все та же ошибка.

Пожалуйста, помогите в этом!!

Заранее спасибо!!

Ответ №1:

Вместо записи выходных данных в файл, вам нужно записать его в файлоподобный объект (например, в файл в памяти).

Вы можете использовать io.BytesIO .

https://docs.python.org/3/library/io.html#io .БайтзИО

После этого вы отправляете его клиенту.

Комментарии:

1. Okk тогда как я отправлю клиенту, чтобы загрузить формат файла .pem на стороне клиента??

2. flask.palletsprojects.com/en/1.1.x/api/#flask.send_file

3. возвращает send_file(BytesIO(b64_encoded_list.content), mimetype=»application/ x-x509-ca-cert», attachment_filename=»file.pem», as_attachment=True) Примечание — b64_encoded_list — это строка. Я пробовал это, но это не работает, не могли бы вы помочь мне в этом!!

4. buffer = BytesIO() buffer.write(b64_encoded_list) buffer.seek(0) возвращает отправленный файл (buffer, mimetype=»application / x-x509-ca-cert»,attachment_filename=»license.pem», as_attachment=True) Я сделал это и добился успеха при загрузке на стороне клиента, но .pem поврежден, поскольку он содержит кодировку base64 для возврата исходной строки, но при попытке вернуть строку из загруженного файла возникает новая ошибка — UnpicklingError: недопустимый ключ загрузки, ‘W’.

5. Я думаю, вам следует записать (для себя) список того, что должно происходить в какой последовательности, а затем сравнить это с вашим кодом, то есть с тем, что вы делаете. Я не совсем понимаю, чего вы хотите достичь, и я не знаю, что вы хотите в файле .pem (pem обычно используется для сертификатов). Я уверен, что вы можете разобраться в этом самостоятельно. Удачи!