到目前为止,我正在尝试使用Django提供一个简单的文本文件。我认为我的Django代码没问题:
def status(request):
# Get data from database
parameters = get_parameters_from_database()
if request.method == "GET":
// Stuff here to render the view for a GET request
return render_to_response('myapp/status.html', {'page_name': 'status', 'parameters' : parameters})
elif request.method == "POST":
if request.POST['request_name'] == 'download_txt':
file_path = parameters['file_path']
with open(file_path, 'rb') as fsock:
response = HttpResponse()
response['content_type'] = 'text/plain'
response['Content-Disposition'] = 'attachment; filename=current.txt'
response.write(fsock.read())
print(response)
return response
收到POST请求后,会在Web服务器控制台中打印以下内容,所以我认为没问题:
<HttpResponse status_code=200, "text/html; charset=utf-8">
所以我认为问题在于我没有在Jquery的Ajax方法中处理成功事件:
$('#downloadButton').click(function(){
$.ajax({
url: '',
method: 'POST',
data: {
request_name: 'download_txt'
},
success: function (data) {
//TODO
},
error: function (err) {
console.log('Error downloading file');
}
});
});
问题在于我不知道如何处理成功事件:我认为一旦服务器回答了content_type
任何帮助?
答案 0 :(得分:1)
浏览器不会自动对您的数据执行任何操作。您必须手动创建可下载元素并将其填入数据中。这里还an article how to download data with javascript。
试试(不需要使用任何库):
$('#downloadButton').click(function(){
$.ajax({
url: '',
method: 'POST',
data: {
request_name: 'download_txt'
},
success: function (data) {
var element = document.createElement('a');
element.setAttribute('href', 'data:text/plain;charset=utf-8,' + encodeURIComponent(data));
element.setAttribute('download', 'my-file-name');
element.style.display = 'none';
document.body.appendChild(element);
element.click();
document.body.removeChild(element);
},
error: function (err) {
console.log('Error downloading file');
}
});
});
答案 1 :(得分:0)
您可以使用FileSaver库来保存文件。以下是如何做到这一点:
success: function (data) {
var FileSaver = require('file-saver');
var blob = new Blob([data], {type: "text/plain;charset=utf-8"});
FileSaver.saveAs(blob, "filename.txt");
},
答案 2 :(得分:0)
没有ajax只需返回带文件附件的httpresponse
set dict=createobject("Scripting.Dictionary")
for i=1 to 100
dict(Or(i))=dict(Or(i))+1
next
for i=1 to 100
Orx(i)=(dict(Or(i))>1)
next