создать файл, используя JavaScript в Chrome на стороне клиента - PullRequest
28 голосов
/ 23 августа 2011

Я хотел бы знать, смогу ли я создать текстовый файл и сохранить его в разделе «Загрузки» на своем компьютере, используя JavaScript. Моя функция должна работать так: когда пользователь нажимает кнопку отправки, я заполняю информацию о пользователе в текстовом файле, а затем сохраняю ее на своем компьютере. Я хотел бы, чтобы это работало в Google Chrome.

Возможно ли это? Я видел сообщения, в которых конкретно говорится, что это серьезная проблема безопасности.

Ответы [ 9 ]

39 голосов
/ 23 августа 2011

Конечно, вы можете, используя совершенно новые 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() {});
11 голосов
/ 23 августа 2011

Введите это в браузер Chrome

data:text;charset=utf-8,helloWorld

Таким образом, чтобы создать загрузку для ваших пользователей, вы должны сделать что-то вроде

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

Затем вставьте его в DOM, чтобы пользователь нажал.

4 голосов
/ 27 декабря 2013

Следующий метод работает в 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 есть API для сохранения большого двоичного объекта, который можно использовать для создания и загрузки файлов.

4 голосов
/ 06 мая 2013

Попробуйте это:

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();
0 голосов
/ 16 января 2018

Эта ссылка мне очень помогла и решила мою проблему. Кросс-браузерное решение:

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();
}
0 голосов
/ 25 ноября 2015
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 () {});
}
0 голосов
/ 23 августа 2011

При нажатии кнопки «Отправить» от пользователя вы можете создать файл на сервере и перенаправить пользователя на URL-адрес файла, откуда он должен автоматически загружаться.

0 голосов
/ 23 августа 2011

Вам потребуется функциональность на стороне сервера для того, чтобы отправить пользователю текстовый файл на сервере (недостаточно javascript). Вы можете создать серверный скрипт, который создает файл и использовать javascript, чтобы предложить пользователю сохранить его.

0 голосов
/ 23 августа 2011

Нет, поскольку это позволит вам создавать вредоносные программы на компьютере клиента и наносить ущерб его конфиденциальности.

Кроме того, запросы на загрузку файлов поступают с сервера, поэтому вам нужно будет создать файл на сервере, передать его пользователю и надеяться, что он его сохранит (если он запросит его, вероятно, что он будет).

Другое возможное решение, на которое стоит обратить внимание, - это использование URI данных или CSV, но их поддержка в браузере неполная (IE), см. Создание файла в памяти для загрузки пользователем, а не через сервер

...