首页 > 解决方案 > 在Django中使用ajax上传文件

问题描述

我将在我的页面中添加一个按钮来上传文件。用户单击此按钮并从计算机中选择文件,页面会将文件上传到服务器并向用户显示类似“上传成功”的消息。

我注意到 Django 有Filefield模型,我们可以定义一个class FileForm以便我们可以使用form = UploadFileForm(request.POST, request.FILES)form.save()上传。

但是,由于我想在上传后刷新部分页面,所以我想使用 ajax 来发送数据。此外,为了使用request.FILES它要求请求具有属性 enctype="multipart/form-data",我认为也许我们可以FormData()在ajax中使用。

html:

<div>
<input type="file" name="" id="ul_input">
<input type="hidden" name="local_id" id="get-local-id" value="{{ record.local_id }}"/>
</div>

Javascript:

// grab your file object from a file input
$('#ul_input').change(function () {
    var formData = new FormData();
    formData.append("ul_file", this.files[0]);
    formData.append("filename", this.files[0].name);
    formData.append("local_id", $('#get-local-id').val());
    $.ajax({
        url: 'uploadfile',
        type: 'POST',
        data: formData,
        processData: false,
        contentType: false,
        dataType: "json",
        beforeSend: function () {
            console.log("loading...please wait");
        },
        success: function (responseStr) {
            if (responseStr.status === 0) {
                alert('upload successfully');
            } else {
                alert("upload fail");
            }
        },
        error: function (responseStr) {
            console.log("error");
        }
    });
});

视图.py

def order_upload(request):  
    status = 1
    if request.is_ajax():
        local_id = request.POST.get('local_id')
        post = DetailList.objects.get(local_id=local_id)
        post.order_dir = request.FILES['ul_file']
        post.save()
        status = 0
    return HttpResponse(json.dumps({'status': status}), content_type='application/json')

模型.py

def file_directory_path(instance, filename):
    return 'file_list/{0}{1}/{2}'.format(instance.upload_date.strftime('%Y'),
                                          instance.upload_date.strftime('%m'),
                                          filename)

class DetailList(models.Model):
    local_id = models.IntegerField(...)
    start_date = models.DateField(...)
    order_dir = models.FileField(upload_to=file_directory_path, blank=True, null=True)

不要忘记MEDIA_ROOT = '/media/'在 settings.py 中设置

我尝试上传文件'test.docx'。现在看来我已经上传文件了media/file_list/201807/test.docx。我也检查order_dir了表格,它已经变成file_list/201807/test.docx了。我收到警报说'上传成功'。

但是,我在目录“media/file_list/201807/test.docx”中找不到我的“test.docx”。

我上传的文件在哪里?任何人都可以帮忙吗?

标签: pythondjango

解决方案


推荐阅读