将javascript生成的文件上传到服务器。

时间:2016-05-06 07:02:44

标签: javascript jquery html django

我有一些JavaScript代码可以在用户单击按钮时动态生成kml或xml文件。我希望能够在将该文件生成到我的Django服务器之后上传该文件。没有文件输入字段,用户从他/她的计算机输入文件。该文件只是根据其他内容动态生成。

有没有办法模拟文件上传而不在html中实际拥有表单,可能是通过使用javascript / jquery生成表单并以某种方式在表单中注入生成的文件?

请告知如何做到这一点。

这是我的Django视图,用于处理上传,该视图适用于用户输入文件:

def file_upload(request):
if request.is_ajax():   
    if request.method == 'POST':
        form = FileUploadForm(files=request.FILES)
        instance = Files(user=request.user, file=request.FILES['file'])
        instance.save()
        return HttpResponse(json.dumps(list_files(request.user)))
else:
    return HttpResponse(json.dumps(list_files(request.user)))

1 个答案:

答案 0 :(得分:0)

似乎你在制作正确的ajax请求时遇到了困难。

正如@ freedomn-m所评论的那样,您当前引用的“文件”仅存在于内存中。

因此,处理此问题的最佳方法是不要使用FileUploadForm来接收服务器端的数据,因为您实际上没有要上传的文件。只需使用处理普通字符串的东西即可。

假设您在js代码中将生成的xml存储在var xmlFile

var xhr = new XMLHttpRequest();
xhr.open('POST', '/your_url');
xhr.setRequestHeader('Content-Type', 'text/plain')
xhr.send(xmlFile);

现在在django:

if request.is_ajax():   
if request.method == 'POST':
    file_content = request.body
    instance = Files(user=request.user, file=ContentFile(file_content))
    instance.save()
    return HttpResponse(json.dumps(list_files(request.user)))

就是这样。

参考文献:

  1. https://docs.djangoproject.com/en/1.9/ref/request-response/#django.http.HttpRequest.body
  2. https://docs.djangoproject.com/en/1.9/ref/files/file/#the-contentfile-class