django 文件上传样例以及遇到的一些问题
使用django上传文件 主流有两种方法 from表单以及ajax,为了自由度高一点,选择了ajax来实现文件的上传
前端部分代码如下: 主要关注
一 有一个文件上传(type='file')的按钮,绑定了id f
二 有一个submit按钮来确认文件上传 绑定id FileUpload
<div class="form-group"> <label for="exampleInputFile">File input</label> <input type="file" id="f"> <p class="help-block">Example block-level help text here.</p> </div> </div> <!-- /.box-body --> <div class="box-footer"> <button type="submit" class="btn btn-primary" id="FileUpload">Submit</button> </div> </div>
JS代码如下
需要注意的是 绑定了submit点击事件,点击了之后通过FromData 方法 把文件以字典 f : $("#f")[0].files[0]); 方式传递给前端 $("#f")[0]是把JQ转换为JS对象
files[0]是获取文件,因为可能有很多文件,这里的意思是获取第一个文件。
$("#FileUpload").click(function () {
var formdata = new FormData();
formdata.append("csrfmiddlewaretoken", $("[name='csrfmiddlewaretoken']").val());
formdata.append("f", $("#f")[0].files[0]);
// console.log("asdasdas")
$.ajax({
url: "/assets/api/",
type: "post",
data: formdata,
contentType: false,
processData: false,
success: function (data) {
alert("上传成功!")
}
})
})
后端代码
通过mession的值做不同的任务
def api(request):if request.method == "POST" and request.POST.get('mession') == "fileupload": f_obj = request.FILES.get("f") print(f_obj) name = f_obj.name print(name) destination = open(os.path.join("/opt/upload", name), 'wb+') # 打开特定的文件进行二进制的写操作 for chunk in f_obj.chunks(): # 分块写入文件 destination.write(chunk) destination.close() return HttpResponse("上传成功")
在文件传输的过程中,发现部分文件无法传输,发现django对文件的大小有限制,修改settings.py配置文件
from django.core.files.uploadedfile import InMemoryUploadedFile from django.core.files.uploadhandler import TemporaryFileUploadHandler FILE_UPLOAD_HANDLERS = [ 'django.core.files.uploadhandler.MemoryFileUploadHandler', 'django.core.files.uploadhandler.TemporaryFileUploadHandler', ] FILE_UPLOAD_MAX_MEMORY_SIZE = 8621440 DATA_UPLOAD_MAX_MEMORY_SIZE = 8621440 DATA_UPLOAD_MAX_NUMBER_FIELDS = 5000