如何在 Django 中处理上传的文件以将其存储在数据库中
How to handle an uploaded file in Django to store it in the database
用户应从表单上传文件(图片、pdf、ms word 等)。
它们应该存储在 Oracle 数据库 (blob) 中。
在我使用的模型中 BinaryField
。除了文件,
我需要存储文件名 (works) 和文件扩展名 (works)(例如 png、jpeg 等)和文件大小(需要帮助)。
但是我不知道如何处理上传的文件以便将其存储到数据库 blob 列。 (尽管下面的虚拟数据有效 [参见 res
])
request.FILES['file']
是我认为的关键
P.S。我知道在数据库中存储静态文件不是最佳做法,但我必须这样做。
我的模特:
class File(models.Model):
du_id = models.AutoField(primary_key=True)
du_file = models.BinaryField()
du_file_name = models.CharField(max_length=1000)
du_file_extension = models.CharField(max_length=100)
du_file_size = models.CharField(max_length=100)
forms.py:
from django import forms
class UploadFileForm(forms.Form):
file = forms.FileField(label='Upload document')
html形式:
<form method="post" action="{% url 'images:upload' %}" enctype="multipart/form-data">{% csrf_token %}
{{form}}
<input type="submit" value="Upload file">
</form>
查看:
from django.shortcuts import render
from images.models import File
from images.forms import UploadFileForm
from django.http import HttpResponse, HttpResponseRedirect, JsonResponse
from django.urls import reverse
from django.utils.timezone import datetime
import datetime,base64
def file_upload(request):
if request.method == 'POST':
form = UploadFileForm(request.POST, request.FILES)
if form.is_valid():
file_name = str(form.cleaned_data['file'])
file_name_split = file_name.split('.')
extension = file_name_split[-1].upper()
test_string = "test string"
res = bytes(test_string, 'utf-8')
a = File.objects.create(du_file = res,du_file_name=file_name,du_file_extension=extension,
du_file_size='1023')
a.save()
return HttpResponse(file_name)
#return HttpResponseRedirect(reverse('images:home'))
else:
return HttpResponse('Form is not valid!')
else:
return HttpResponse('Failed')
您可以在 here 查看文件上传的 django 文档。
此处给出的实施片段:
from django.http import HttpResponseRedirect
from django.shortcuts import render
from .forms import UploadFileForm
# Imaginary function to handle an uploaded file.
from somewhere import handle_uploaded_file
def upload_file(request):
if request.method == 'POST':
form = UploadFileForm(request.POST, request.FILES)
if form.is_valid():
handle_uploaded_file(request.FILES['file'])
return HttpResponseRedirect('/success/url/')
else:
form = UploadFileForm()
return render(request, 'upload.html', {'form': form})
def handle_uploaded_file(f):
with open('some/file/name.txt', 'wb+') as destination:
for chunk in f.chunks():
destination.write(chunk)
因为他们使用的是二进制格式的文件,所以您应该可以使用它
您可以使用read()
方法从文件中return指定字节数,然后将其存储在数据库中。
请注意,不推荐这样做。最好从单独的 Web 服务器(如 Nginx)或从云(如 Amazon S3)提供静态文件。
这种方法很吃内存,所以你必须在前端做一些大小限制,比如最大 2mb。
如果您不使用 Django 表单,也可以。您可以这样获取文件:
request.FILES.get('your_file_key_param')
def file_upload(request):
if request.method == 'POST':
form = UploadFileForm(request.POST, request.FILES)
if form.is_valid():
file = form.cleaned_data.get('your_file')
file_bytes = file.read()
a = File.objects.create(du_file = file_bytes ,du_file_name=file_name,du_file_extension=extension,
du_file_size='1023')
a.save()
return HttpResponse(file_name)
else:
return HttpResponse('Form is not valid!')
else:
return HttpResponse('Failed')
用户应从表单上传文件(图片、pdf、ms word 等)。
它们应该存储在 Oracle 数据库 (blob) 中。
在我使用的模型中 BinaryField
。除了文件,
我需要存储文件名 (works) 和文件扩展名 (works)(例如 png、jpeg 等)和文件大小(需要帮助)。
但是我不知道如何处理上传的文件以便将其存储到数据库 blob 列。 (尽管下面的虚拟数据有效 [参见 res
])
request.FILES['file']
是我认为的关键
P.S。我知道在数据库中存储静态文件不是最佳做法,但我必须这样做。
我的模特:
class File(models.Model):
du_id = models.AutoField(primary_key=True)
du_file = models.BinaryField()
du_file_name = models.CharField(max_length=1000)
du_file_extension = models.CharField(max_length=100)
du_file_size = models.CharField(max_length=100)
forms.py:
from django import forms
class UploadFileForm(forms.Form):
file = forms.FileField(label='Upload document')
html形式:
<form method="post" action="{% url 'images:upload' %}" enctype="multipart/form-data">{% csrf_token %}
{{form}}
<input type="submit" value="Upload file">
</form>
查看:
from django.shortcuts import render
from images.models import File
from images.forms import UploadFileForm
from django.http import HttpResponse, HttpResponseRedirect, JsonResponse
from django.urls import reverse
from django.utils.timezone import datetime
import datetime,base64
def file_upload(request):
if request.method == 'POST':
form = UploadFileForm(request.POST, request.FILES)
if form.is_valid():
file_name = str(form.cleaned_data['file'])
file_name_split = file_name.split('.')
extension = file_name_split[-1].upper()
test_string = "test string"
res = bytes(test_string, 'utf-8')
a = File.objects.create(du_file = res,du_file_name=file_name,du_file_extension=extension,
du_file_size='1023')
a.save()
return HttpResponse(file_name)
#return HttpResponseRedirect(reverse('images:home'))
else:
return HttpResponse('Form is not valid!')
else:
return HttpResponse('Failed')
您可以在 here 查看文件上传的 django 文档。
此处给出的实施片段:
from django.http import HttpResponseRedirect
from django.shortcuts import render
from .forms import UploadFileForm
# Imaginary function to handle an uploaded file.
from somewhere import handle_uploaded_file
def upload_file(request):
if request.method == 'POST':
form = UploadFileForm(request.POST, request.FILES)
if form.is_valid():
handle_uploaded_file(request.FILES['file'])
return HttpResponseRedirect('/success/url/')
else:
form = UploadFileForm()
return render(request, 'upload.html', {'form': form})
def handle_uploaded_file(f):
with open('some/file/name.txt', 'wb+') as destination:
for chunk in f.chunks():
destination.write(chunk)
因为他们使用的是二进制格式的文件,所以您应该可以使用它
您可以使用read()
方法从文件中return指定字节数,然后将其存储在数据库中。
请注意,不推荐这样做。最好从单独的 Web 服务器(如 Nginx)或从云(如 Amazon S3)提供静态文件。
这种方法很吃内存,所以你必须在前端做一些大小限制,比如最大 2mb。
如果您不使用 Django 表单,也可以。您可以这样获取文件:
request.FILES.get('your_file_key_param')
def file_upload(request):
if request.method == 'POST':
form = UploadFileForm(request.POST, request.FILES)
if form.is_valid():
file = form.cleaned_data.get('your_file')
file_bytes = file.read()
a = File.objects.create(du_file = file_bytes ,du_file_name=file_name,du_file_extension=extension,
du_file_size='1023')
a.save()
return HttpResponse(file_name)
else:
return HttpResponse('Form is not valid!')
else:
return HttpResponse('Failed')