Как в 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:
Существует класс 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')