在Django中下载简单的文本文件

时间:2018-04-11 08:47:59

标签: jquery ajax django

到目前为止,我正在尝试使用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

,浏览器就会自动下载文件

任何帮助?

3 个答案:

答案 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