Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
当返回类型为stream:django时使用ajxax_Django_Jquery_Filestream - Fatal编程技术网

当返回类型为stream:django时使用ajxax

当返回类型为stream:django时使用ajxax,django,jquery,filestream,Django,Jquery,Filestream,我需要在表单中使用ajax。但是,$.ajax的success函数似乎不支持文件。现在我想知道,当我需要一些时间返回表单(当表单无效时)和一些时间返回流到客户端以进行下载(当表单有效时)时,如何使用ajax。我用谷歌搜索过,似乎用$.get可能会有用。但我有表格,我必须使用post。有人能帮我吗?怎么走?非常感谢 在下面的函数中,流不工作 $('#sendButton').click(function(e) { e.preventDefault(); var te

我需要在表单中使用ajax。但是,$.ajax的success函数似乎不支持文件。现在我想知道,当我需要一些时间返回表单(当表单无效时)和一些时间返回流到客户端以进行下载(当表单有效时)时,如何使用ajax。我用谷歌搜索过,似乎用$.get可能会有用。但我有表格,我必须使用post。有人能帮我吗?怎么走?非常感谢

在下面的函数中,流不工作

$('#sendButton').click(function(e) {
        e.preventDefault();
        var temp = $("#mainForm").serialize();
        $.ajax({
            type: "POST",
            data: temp,
            url: 'main/',
            success: function(data) {                
               ...
            }
        });
    });
my views.py:

def mainFunc(request):
    if request.is_ajax():
         form = mainForm(request.POST)
         if request.method == 'POST':
             if form.is_valid():
                 result = ""               
                 string_to_return = webservice._result
                 file_to_send = ContentFile(string_to_return)
                 response = HttpResponse(file_to_send,'application/x-gzip')
                 response['Content-Length'] = file_to_send.size
                 response['Content-Disposition'] = 'attachment;                  filename="somefile.tar.gz"'
                 return response
          else:
               form = mainForm()
          return render_to_response('main.html', RequestContext(request, {'form':form}))
     else:
          return render_to_response("ajax.html", {}, context_instance=RequestContext(request))

您仍然无法将文件返回到ajax请求。自那以后,答案一直没有改变

您可以做的是返回下载的url并重定向用户或弹出一个新窗口/选项卡。像这样

$('#sendButton').click(function(e) {
    e.preventDefault();
    var temp = $("#mainForm").serialize();
    $.ajax({
        type: "POST",
        data: temp,
        url: 'main/',
        success: function(data) {
           # Option 1 - redirect
           window.location = data;
           # Option 2 - new window
           window.open(data, '_blank');
           window.focus();
        }
    });
});

您仍然无法将文件返回到ajax请求。自那以后,答案一直没有改变

您可以做的是返回下载的url并重定向用户或弹出一个新窗口/选项卡。像这样

$('#sendButton').click(function(e) {
    e.preventDefault();
    var temp = $("#mainForm").serialize();
    $.ajax({
        type: "POST",
        data: temp,
        url: 'main/',
        success: function(data) {
           # Option 1 - redirect
           window.location = data;
           # Option 2 - new window
           window.open(data, '_blank');
           window.focus();
        }
    });
});

谢谢。我有点困惑。“数据”到底是什么?我对小溪了解不多。当我们返回流时,这意味着我们正在逐字节返回文件?因为在流媒体中,我们没有在服务器上保存文件,所以文件url应该是什么?如果它有一个url,我们将返回流(我们的文件);所以“数据”就是流。现在,当数据是流时,如何将url发送到success函数?真的很抱歉我愚蠢的问题:“>您不能响应ajax请求流式传输数据。数据是对ajax请求的整个响应,因此在我的示例中,响应将只是url。您可能希望返回的不仅仅是url,在这种情况下,您需要将文件url与其余数据分开。因为ajax请求和文件下载请求是分开的,所以您需要暂时保存文件,直到用户下载完为止。我知道这不是你想听的答案,但事实就是如此。嗯。。。假设这是我希望用户下载的文件的url:result=“media/mainFiles/main.tar.gz”。若我在视图中返回HttpResponse(result),那个么返回流呢?正如我所说的,我对这条小溪不太了解。怎么退的?再次抱歉,你知道我是初学者…我的解决方案中的成功函数将获取该url并打开一个新窗口,要求用户保存文件。是的,但我认为如果我从视图返回url,它将不再是流。我的意思是我不会再回来了…非常感谢。我有点困惑。“数据”到底是什么?我对小溪了解不多。当我们返回流时,这意味着我们正在逐字节返回文件?因为在流媒体中,我们没有在服务器上保存文件,所以文件url应该是什么?如果它有一个url,我们将返回流(我们的文件);所以“数据”就是流。现在,当数据是流时,如何将url发送到success函数?真的很抱歉我愚蠢的问题:“>您不能响应ajax请求流式传输数据。数据是对ajax请求的整个响应,因此在我的示例中,响应将只是url。您可能希望返回的不仅仅是url,在这种情况下,您需要将文件url与其余数据分开。因为ajax请求和文件下载请求是分开的,所以您需要暂时保存文件,直到用户下载完为止。我知道这不是你想听的答案,但事实就是如此。嗯。。。假设这是我希望用户下载的文件的url:result=“media/mainFiles/main.tar.gz”。若我在视图中返回HttpResponse(result),那个么返回流呢?正如我所说的,我对这条小溪不太了解。怎么退的?再次抱歉,你知道我是初学者…我的解决方案中的成功函数将获取该url并打开一个新窗口,要求用户保存文件。是的,但我认为如果我从视图返回url,它将不再是流。我的意思是我再也不会回来了。。。