如何允许将DOM对象下载到文件中

时间:2014-02-24 16:19:17

标签: jquery html django

我有一个网页(Django-python-jquery网站),其中包含一个<p>标签,我从服务器端数据库上传文本(根据客户的选择)。

我希望允许客户调整页面并下载文本(即在本地保存为txt文件) 仔细查看这个,我找到的唯一方法是将文本保存为服务器上的文件并返回浏览器指向新创建的文件的链接,然后下载它。

由于数据已经在客户端上,当然有一种方法可以在本地保存,有人可以指出我该怎么做?

2 个答案:

答案 0 :(得分:0)

有一个jsPDF客户端脚本,允许您以pdf格式保存。值得一试

http://parall.ax/products/jspdf

请拥有上述文件的视图来源和 您可以将doc.save函数从pdf更改为txt

var initDownloadPDF = function(){

$('.download-pdf').click(function(){
                eval(editor.getValue());

                var file = demos[$('#template').val()];
                if (file === undefined) {
                    file = 'demo';
                }
                doc.save(file + '.txt');
            });
            return false;
        };

答案 1 :(得分:0)

好的,所以在花了很长时间尝试从客户端做到这一点后,我意识到最好的方法是(正如我所担心的)让服务器创建一个包含所需信息的文件并指向客户端(通过ajax打电话下载它 Django视图(在客户端点击下载时创建文件)看起来像:

def download_log(request):
    if request.is_ajax() and request.GET:
        FS_STATIC_DIR = "/root/Documents/pdsc/static/"
        URL_STATIC_DIR = "/static/"
        TEMP_DIR = "tmp/"
        TEMP_FILE_DIR = FS_STATIC_DIR+TEMP_DIR
        heartbeat_content = Heartbeats.objects.get(id=(request.GET['heartbeat_id'])).attachment
        heartbeat_filename = Heartbeats.objects.get(id=(request.GET['heartbeat_id'])).attachment_name
        heartbeat_filename = re.sub('^/','', heartbeat_filename)  # Delete all preceding /
        heartbeat_filename = re.sub('/','-', heartbeat_filename)  # Change all / to -
        try:
            heartbeat_content = base64.b64decode(heartbeat_content)
        except:
            pass

        full_temp_log_file_path = TEMP_FILE_DIR+heartbeat_filename+str(datetime.now())
        full_temp_log_file_path = re.sub(r"\s+", '-', full_temp_log_file_path)
        temp_log_file = open(full_temp_log_file_path, 'w')

        temp_log_file.write(heartbeat_content)
        temp_log_file.close()

        temp_log_file_url = re.sub(FS_STATIC_DIR, URL_STATIC_DIR, full_temp_log_file_path)
        response = HttpResponse(temp_log_file_url, content_type='text/plain')
    else:
        response = HttpResponse("No log requested", content_type='text/plain')

    return response

The relevant ajax code look like:
var $contextMenu = $("#contextMenu");
                $("body").on("contextmenu", "#heartbeats-table tr", function (e) {
                    e.preventDefault();
                    var $rowClicked = $(this);
                    $contextMenu.css({
                        display: "block",
                        left: e.pageX,
                        top: e.pageY
                    });
                    $contextMenu.data("heartbeat-id", $rowClicked.data("heartbeat-id"));
                    return false;
                });
                $(document).click(function () {
                    $contextMenu.hide();
                    $contextMenu.data("heatbeat-id","")
                });
                $("#download_log").click(function(){
                    $.ajax({
                       'url': '/download_log',
                       'type': 'GET',
                        data: {heartbeat_id:$contextMenu.data("heartbeat-id")},
                        'complete': function( data ){
                            window.location.replace( data.responseText );
                        }
                    });
                });