Как в Django скрыть байты в файл, который пользователь может скачать?

Я хочу сделать сайт, который позволяет пользователю загрузить файл, а затем сделать его доступным для скачивания другим пользователем.

Код для преобразования загружаемого файла в байты выполнен (используется uploadedFile.read()). Я также планирую сохранять байты файла в базу данных вместо самого файла, например:

uploadedFile = request.FILES["file"]

file_data = uploadedFile.read()

# Save file_data to database here...

Как преобразовать байты файла в реальный загружаемый файл? (по сути, противоположность file.read() в Django)

Кто-нибудь знает, как это сделать, и, пожалуйста, отредактируйте этот вопрос или спросите, если что-то неясно. Спасибо.

Согласно документации Django, этот код можно использовать после получения файла:

def handle_uploaded_file(f):
with open('some/file/name.txt', 'wb+') as destination:
    for chunk in f.chunks():
        destination.write(chunk)

Если вы хотите сохранить его в базе данных, вам нужно просто создать объект вашей модели, например:

file = request.FILES["uploaded_file"]
save_file = File.objects.create(
                                name=file.name,
                                file=file
                               )

Для загрузки файла необходим путь к этому файлу.

file_path = save_file.file.path

Если вы посмотрите документацию Django:

Django запрос-ответ

Существует класс FileResponse

FileResponse(open_file, as_attachment=False, filename='', **kwargs)

FileResponse - это подкласс StreamingHttpResponse, оптимизированный для бинарных файлов.

он принимает файлоподобный объект типа io.BytesIO, но вы должны искать() его перед передачей в FileResponse.

FileResponse принимает любой файлоподобный объект с двоичным содержимым, например, файл, открытый в двоичном режиме так:

   from django.http import FileResponse
   import io

   buffer = io.BytesIO(file)
   buffer.seek(0)
   response = FileResponse(buffer, as_attachment=True, filename='filename.foo')
Вернуться на верх