Django 分块上传文件:避免保存两次

Django 分块上传文件:避免保存两次,django,file-upload,django-models,django-forms,django-views,Django,File Upload,Django Models,Django Forms,Django Views,我使用一个自定义函数上传一个文件,并将其分块,如文档所示。 我的问题是在handle\u upload\u file()之后调用save()会将我的文件上载两次,一次上载到“MEDIA\u URL/My\u path”目录,另一次上载到“MEDIA\u URL”。 但我只希望有一个上传,一个与块。 是否可以强制save()进行“分块”上传? 或者我应该使用不同的方法? 多谢各位 models.py class ShapeFile(models.Model): name = models

我使用一个自定义函数上传一个文件,并将其分块,如文档所示。 我的问题是在
handle\u upload\u file()
之后调用
save()
会将我的文件上载两次,一次上载到“MEDIA\u URL/My\u path”目录,另一次上载到“MEDIA\u URL”。 但我只希望有一个上传,一个与块。 是否可以强制
save()
进行“分块”上传? 或者我应该使用不同的方法? 多谢各位

  • models.py

    class ShapeFile(models.Model):
        name = models.CharField(max_length=100)
        srid = models.ForeignKey(SpatialRefSys)
        user = models.ForeignKey(User)
        color_table = models.ForeignKey(ColorTable)
        file = models.FileField(upload_to="my_path")
        class Meta:
            unique_together = ('name', 'user')
    
  • forms.py

    class UploadForm(ModelForm):
        class Meta:
            model = ShapeFile
            fields = ('name','user','srid','file','color_table')
            widgets = {'srid': TextInput(),
                       'user': HiddenInput()
    
  • views.py

    def handle_uploaded_file(fileName, filePath):
        with open(filePath, 'wb+') as destination:
            for chunk in fileName.chunks():
                destination.write(chunk)
    
    @login_required
    def shapeIng(request):
        if request.method == 'POST':
            form = UploadForm(request.POST, request.FILES)
            if form.is_valid():
                req = request.POST
    
                # Split uploaded file into chunks
                fileName = request.FILES['file']
                filePath = ShapeFile(file=fileName).file.path
                handle_uploaded_file(fileName, filePath)
    
                form.save()
    
                messages.success(request, 'Shapefile upload succesful!')
                return redirect('shapeCreated')
            else:
                messages.error(request, 'Something went wrong uploading Shapefile.')
        else: # request.method == 'GET'
            form = UploadForm(initial={'user': request.user})
        return render_to_response('my_app/base_shapeIngestion.html',
                                  {'form': form},
                                  context_instance=RequestContext(request))
    

将查看功能更改为:

def testupload2(request):
    if request.method == 'POST':
        file_name=request.FILES['file']
    form = SomeForm(request.POST, request.FILES)
    if form.is_valid():
        dest_file = open('C:/prototype/upload/'+ str(file_name), 'wb+')
        path = 'C:/prototype/upload/'+ str(file_name)
        for chunk in  request.FILES['file'].chunks():
            dest_file.write(chunk)
        dest_file.close()

    t = get_template("testupload2.html")

    lst = os.listdir('C:/downloads/prototype/prototype/upload/')

    html = t.render(Context({'MEDIA_URL':'http://127.0.0.1:8000/site_media/'}))
    return HttpResponse(html)

尝试不要将
请求.FILES
传递到
上传表单
。仅用于处理程序。如果我这样做,则不满足
is\u valid()
方法,并且我正确地在页面上获得“This field is required”(此字段是必需的)消息,即使我选择了要上载的字段。
到\u json
arr
变量的目的是什么?如果不使用
form.save()
,如何保存表单的其他4个元素?为什么要使用
HttpResponse
?@caneta我在写答案时,在我的项目中使用了这两项功能,但我忘了删除它们OK…那么要从表单中保存的其他元素呢?