使用块上传文件:避免两次保存

时间:2013-04-24 12:13:50

标签: django file-upload django-models django-forms django-views

我使用自定义函数上传按文件分割的文件,如文档here所述。 我的问题是在save()上传文件两次后调用handle_uploaded_file(),一次上传到“MEDIA_URL / my_path”目录,一次上传到“MEDIA_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))
    

1 个答案:

答案 0 :(得分:0)

将您的视图功能更改为:

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)