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