【问题标题】:How to handle an uploaded file in Django to store it in the database如何在 Django 中处理上传的文件以将其存储在数据库中
【发布时间】:2020-06-10 10:21:59
【问题描述】:

用户应从表单(图像、pdf、ms word 等)上传文件。

它们应该存储在 Oracle 数据库 (blob) 中。

在我使用BinaryField的模型中。除了文件, 我需要存储文件名(作品)和文件扩展名(作品)(例如 png、jpeg 等)和文件大小(需要帮助)。

但是我不知道如何处理上传的文件以便将其存储到数据库 blob 列。 (虽然下面的虚拟数据有效 [参见res])

request.FILES['file']是我认为的关键

附:我知道将静态文件存储在数据库中不是最佳做法,但我必须这样做。

我的模特:

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

【问题讨论】:

    标签: python django blob


    【解决方案1】:

    您可以在 here 查看 django 文档以进行文件上传。
    那里给出的实现 sn-ps:

    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)
    

    因为他们使用二进制格式的文件,所以你应该可以使用它

    【讨论】:

      【解决方案2】:

      您可以使用read()方法从文件中返回指定数量的字节,然后您可以将其存储在数据库中。

      请注意,不建议这样做。最好从单独的 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') 
      

      【讨论】:

        猜你喜欢
        • 2014-04-09
        • 2015-07-07
        • 2017-06-18
        • 2018-06-19
        • 2014-09-11
        • 2020-01-27
        • 1970-01-01
        • 2015-01-20
        • 2019-05-26
        相关资源
        最近更新 更多