在客户端使用chrome中的javascript创建文件

时间:2011-08-23 12:01:29

标签: javascript google-chrome javascript-events google-chrome-extension facebook-javascript-sdk

我想知道我是否可以使用javascript创建文本文件并将文件保存在他/她的计算机的用户“下载”部分中。我的功能应该工作的方式是当用户单击提交按钮时,我在文本文件中填充用户信息,然后将其保存在他的机器中。我希望这能用于谷歌浏览器。

这可能吗?我看到的帖子明确告诉我这是一个严重的安全问题。

9 个答案:

答案 0 :(得分:39)

当然,您可以使用全新的API:http://jsfiddle.net/4D92b/88/

 window.requestFileSystem = window.requestFileSystem || window.webkitRequestFileSystem;

 window.requestFileSystem(window.TEMPORARY, 1024*1024, function(fs) {
    fs.root.getFile('test.bin', {create: true}, function(fileEntry) { // test.bin is filename
        fileEntry.createWriter(function(fileWriter) {
            var arr = new Uint8Array(3); // data length

            arr[0] = 97; // byte data; these are codes for 'abc'
            arr[1] = 98;
            arr[2] = 99;

            var blob = new Blob([arr]);

            fileWriter.addEventListener("writeend", function() {
                // navigate to file, will download
                location.href = fileEntry.toURL();
            }, false);

            fileWriter.write(blob);
        }, function() {});
    }, function() {});
}, function() {});

答案 1 :(得分:11)

在Chrome浏览器中输入

data:text;charset=utf-8,helloWorld

因此,要为您的用户构建下载,您可以执行类似

的操作

data='<a href='data:text;charset=utf-8,'+uriEncode(yourUSERdataToDownload)+' >Your Download</a>

然后将其注入dom,供用户按下。

答案 2 :(得分:4)

试试这个:

document.body.innerHTML+="<a id='test' href='data:text;charset=utf-8,"+encodeURIComponent("hi")+"'>Your Download</a>";
document.getElementById('test').click();

如果要设置文件名使用锚标记的download属性:

document.body.innerHTML+="<a id='test' href='data:text;charset=utf-8,"+encodeURIComponent("hi")+"' download=yourfilename>Your Download</a>";
document.getElementById('test').click();

答案 3 :(得分:4)

以下方法适用于IE11 +,Firefox 25+和Chrome 30 +:

<a id="export" class="myButton" download="" href="#">export</a>
<script>
    function createDownloadLink(anchorSelector, str, fileName){
        if(window.navigator.msSaveOrOpenBlob) {
            var fileData = [str];
            blobObject = new Blob(fileData);
            $(anchorSelector).click(function(){
                window.navigator.msSaveOrOpenBlob(blobObject, fileName);
            });
        } else {
            var url = "data:text/plain;charset=utf-8," + encodeURIComponent(str);
            $(anchorSelector).attr("download", fileName);               
            $(anchorSelector).attr("href", url);
        }
    }

    $(function () {
        var str = "hi,file";
        createDownloadLink("#export",str,"file.txt");
    });

</script>

在行动中查看此内容:http://jsfiddle.net/Kg7eA/

Firefox和Chrome支持用于导航的数据URI,它允许我们通过导航到数据URI来创建文件,而IE出于安全目的不支持它。

另一方面,IE有用于保存blob的API,可用于创建和下载文件。

答案 4 :(得分:0)

不,因为这会让您在客户端的计算机上创建恶意程序,并损害他的隐私。

此外,下载文件的请求来自服务器,因此您需要在服务器上创建该文件,并将其提供给用户,并希望他能保存它(如果他要求保存它可能是他会)。

另一个可能的解决方案是使用数据URI或CSV,但浏览器对它们的支持不完整(IE),请参阅Create a file in memory for user to download, not through server

答案 5 :(得分:0)

您需要服务器端功能才能为用户提供文本文件(javascript是不够的)。 您可以创建一个服务器端脚本来创建文件并使用javascript来提示用户保存它。

答案 6 :(得分:0)

在用户的“提交”按钮上,您可以在服务器上创建文件,并将用户重定向到该文件的URL,以便自动下载该文件。

答案 7 :(得分:-1)

var isIE = /*@cc_on!@*/ false || !! document.documentMode; // At least IE6
var uri = "some data"; //data in file
var fileName = "file.i4cvf"; // any file name with any extension
if (isIE) {
    var fileData = ['\ufeff' + uri];
    var blobObject = new Blob(fileData);
    window.navigator.msSaveOrOpenBlob(blobObject, fileName);
} else //chrome
{
    window.requestFileSystem = window.requestFileSystem || window.webkitRequestFileSystem;
    window.requestFileSystem(window.TEMPORARY, 1024 * 1024, function (fs) {
        fs.root.getFile(fileName, {
            create: true
        }, function (fileEntry) {
            fileEntry.createWriter(function (fileWriter) {
                var fileData = ['\ufeff' + uri];
                var blob = new Blob(fileData);
                fileWriter.addEventListener("writeend", function () {
                    var fileUrl = fileEntry.toURL();
                    var link = document.createElement('a');
                    link.href = fileUrl;
                    link.download = fileName;
                    document.body.appendChild(link);
                    link.click();
                    document.body.removeChild(link);
                }, false);
                fileWriter.write(blob);
            }, function () {});
        }, function () {});
    }, function () {});
}

答案 8 :(得分:-1)

此链接对我有很大帮助并解决了我的问题。跨浏览器解决方案:

https://www.thewebflash.com/reading-and-creating-text-files-using-the-html5-file-api/

这是最相关的部分:

if ('msSaveOrOpenBlob' in navigator) {

    navigator.msSaveOrOpenBlob(textFileAsBlob, fileName);
} else {
    var downloadLink = document.createElement('a');
    downloadLink.download = fileName;
    downloadLink.innerHTML = 'Download File';
    if ('webkitURL' in window) {
        // Chrome allows the link to be clicked
        // without actually adding it to the DOM.
        downloadLink.href = window.webkitURL.createObjectURL(textFileAsBlob);
    } else {
        // Firefox requires the link to be added to the DOM
        // before it can be clicked.
        downloadLink.href = window.URL.createObjectURL(textFileAsBlob);
        downloadLink.onclick = destroyClickedElement;
        downloadLink.style.display = 'none';
        document.body.appendChild(downloadLink);
    }

    downloadLink.click();
}