Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.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
如何创建动态文件&x2B;Javascript中的下载链接?_Javascript_File_Dynamic_Download_Creation - Fatal编程技术网

如何创建动态文件&x2B;Javascript中的下载链接?

如何创建动态文件&x2B;Javascript中的下载链接?,javascript,file,dynamic,download,creation,Javascript,File,Dynamic,Download,Creation,通常,HTML页面可以链接到可以从服务器下载的文档(PDF等) 假设启用了Javascript的网页,是否可以从用户浏览器中动态创建文本文档(例如),并添加链接以下载此文档,而无需往返服务器(或最少一次) 换句话说,用户点击一个按钮,javascript将生成随机数(例如),并将它们放入一个结构中。然后,javascript(例如JQuery)将添加到页面的链接,以将结果作为文本文件从结构中下载 此目标是将所有(或至少大部分)工作负载保留在用户端 这是否可行,如果可行,如何实现?通过在页面中添加

通常,HTML页面可以链接到可以从服务器下载的文档(PDF等)

假设启用了Javascript的网页,是否可以从用户浏览器中动态创建文本文档(例如),并添加链接以下载此文档,而无需往返服务器(或最少一次)

换句话说,用户点击一个按钮,javascript将生成随机数(例如),并将它们放入一个结构中。然后,javascript(例如JQuery)将添加到页面的链接,以将结果作为文本文件从结构中下载

此目标是将所有(或至少大部分)工作负载保留在用户端

这是否可行,如果可行,如何实现?

通过在页面中添加一个,您可以在页面中嵌入一个可下载的文档。可以使用Javascript动态连接字符串的数据部分。您可以选择将其格式化为URL编码字符串或base64编码字符串。当它是base64编码时,浏览器将下载内容作为文件。您必须添加一个或jQuery插件来进行编码。下面是一个静态数据示例:

jQuery('body').prepend(jQuery('<a/>').attr('href','data:text/octet-stream;base64,SGVsbG8gV29ybGQh').text('Click to download'))
jQuery('body').prepend(jQuery('').attr('href','data:text/octet stream;base64,SGVsbG8gV29ybGQh').text('Click to download'))

PDF文件?否。一个
txt
文件。对使用最新的HTML5
blob
URI。代码的基本形式如下所示:

window.URL = window.webkitURL || window.URL;
window.BlobBuilder = window.BlobBuilder || window.WebKitBlobBuilder || window.MozBlobBuilder;
var file = new window.BlobBuilder(),
    number = Math.random().toString(); //In the append method next, it has to be a string
file.append(number); //Your random number is put in the file

var a = document.createElement('a');
a.href = window.URL.createObjectURL(file.getBlob('text/plain'));
a.download = 'filename.txt';
a.textContent = 'Download file!';
document.body.appendChild(a);
您可以使用其他答案中提到的其他方法作为备用方法,因为BlobBuilder可能非常好


注意:
BlobBuilder
似乎已被弃用。感谢您的提醒。

我创建了一个解决方案,它允许您通过单击创建和下载文件:

<html>
<body>
    <button onclick='download_file("my_file.txt", dynamic_text())'>Download</button>
    <script>
    function dynamic_text() {
        return "create your dynamic text here";
    }

    function download_file(name, contents, mime_type) {
        mime_type = mime_type || "text/plain";

        var blob = new Blob([contents], {type: mime_type});

        var dlink = document.createElement('a');
        dlink.download = name;
        dlink.href = window.URL.createObjectURL(blob);
        dlink.onclick = function(e) {
            // revokeObjectURL needs a delay to work properly
            var that = this;
            setTimeout(function() {
                window.URL.revokeObjectURL(that.href);
            }, 1500);
        };

        dlink.click();
        dlink.remove();
    }
    </script>
</body>
</html>

下载
函数dynamic_text(){
返回“在此处创建动态文本”;
}
函数下载文件(名称、内容、mime类型){
mime_类型=mime_类型| |“文本/普通”;
var blob=新blob([contents],{type:mime_type});
var dlink=document.createElement('a');
dlink.download=名称;
dlink.href=window.URL.createObjectURL(blob);
dlink.onclick=函数(e){
//revokeObjectURL需要延迟才能正常工作
var=这个;
setTimeout(函数(){
window.URL.revokeObjectURL(that.href);
}, 1500);
};
dlink.click();
dlink.remove();
}
我是通过修改代码并在工作前对其进行修改而创建的,因此我确信它存在问题(如果您有改进,请评论或编辑!),但这是一个工作的单点解决方案。


(至少,在Windows 7中最新版本的Chrome上它对我有效)

现在,我们可以使用构建URL来下载任何动态创建的数据。这在IE和Edge中不起作用:这是错误的。它将在IE和Edge中用于下载链接。它在IE/Edge中不适用于HTML和CSS文件等页面资产。您可以下载CSS,但不要在
标记中使用它。
BlobBuilder
已被弃用,请参阅@limonte谢谢!把它编辑成了答案太棒了。。。将在23小时55分钟内授予赏金…这应该是公认的答案。它显示了创建数据URI的“艰苦”工作。不只是说你需要使用它们。对于Firefox,在调用createElement()之后需要document.body.appendChild(dlink),然后在dlink.remove()之后可能需要document.body.removeChild(dlink)。测试过的Firefox:document.body.appendChild(dlink)需要,但不需要removeChild,remove()就足够了。谢谢你,阿霍夫和亚历山大!刚刚在Chrome版本73.0.3683.103(官方版本)(64位)上检查过,很好用!