Как установить имя загруженного файла xls. Он всегда загружается как download.xls [duplicate]

Многие объяснения уже присутствуют, чтобы объяснить, как это происходит и как это исправить, но вы также должны следовать рекомендациям, чтобы избежать NullPointerException вообще.

См. также: A хороший список лучших практик

Я бы добавил, очень важно, хорошо использовать модификатор final. Использование "окончательной" модификатор, когда это применимо в Java

Сводка:

  1. Используйте модификатор final для обеспечения хорошей инициализации.
  2. Избегайте возврата null в методы, например, при возврате пустых коллекций.
  3. Использовать аннотации @NotNull и @Nullable
  4. Быстрое завершение работы и использование утверждений, чтобы избежать распространения нулевых объектов через все приложение, когда они не должен быть пустым.
  5. Сначала используйте значения с известным объектом: if("knownObject".equals(unknownObject)
  6. Предпочитают valueOf() поверх toString ().
  7. Используйте null safe StringUtils StringUtils.isEmpty(null).

37
задан huangcd 10 January 2014 в 12:25
поделиться

4 ответа

Вы можете достичь этого, используя атрибут download для элементов <a>. Например:

<a href="1251354216241621.txt" download="your-foo.txt">Download Your Foo</a>

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

Вместо использования window.open() вы можете создать невидимую ссылку с атрибутом download и .click().

var str = "Name, Price\nApple, 2\nOrange, 3";
var uri = 'data:text/csv;charset=utf-8,' + str;

var downloadLink = document.createElement("a");
downloadLink.href = uri;
downloadLink.download = "data.csv";

document.body.appendChild(downloadLink);
downloadLink.click();
document.body.removeChild(downloadLink);

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

63
ответ дан Jeremy 19 August 2018 в 16:55
поделиться
  • 1
    Часть downloadLink.click(); в Google Chrome 58.0.3029.110 не запускается. Мне нужно вручную щелкнуть гиперссылку, чтобы сделать это. Любые обходные пути или не поддерживаются в указанном браузере. – Deepak Chaudhary 9 June 2017 в 04:53
  • 2
    идеально подходит для Ubuntu Chrome 59 и Firefox 54. UPVOTED – tony gil 6 August 2017 в 11:33
  • 3
    Вам не нужно добавлять этот элемент в тело. Просто вызовите .click(), и все! – Achmedzianov Danilian 13 February 2018 в 14:48
  • 4
    @AchmedzianovDanilian Мне пришлось добавить ссылку, чтобы она работала в Firefox 59. Без нее в DOM щелчок (), кажется, ничего не делает. – ManoDestra 8 April 2018 в 19:00
  • 5
    Спасибо, но в Angular это не работает – FindOutIslamNow 8 July 2018 в 08:14

Это не работает в последнем Chrome, я изменил это, и следующий код будет работать нормально,

    $("#download_1").click(function() {
    var json_pre = '[{"Id":1,"UserName":"Sam Smith"},{"Id":2,"UserName":"Fred Frankly"},{"Id":1,"UserName":"Zachary Zupers"}]';
    var json = $.parseJSON(json_pre);

    var csv = JSON2CSV(json);
    var downloadLink = document.createElement("a");
    var blob = new Blob(["\ufeff", csv]);
    var url = URL.createObjectURL(blob);
    downloadLink.href = url;
    downloadLink.download = "data.csv";

    document.body.appendChild(downloadLink);
    downloadLink.click();
    document.body.removeChild(downloadLink);
});

Поэтому, когда вы нажимаете кнопку download_1 id, тогда он создаст невидимую ссылку для скачивания и щелкните это. Я использовал другую функцию для подготовки js.

Функция JSON2CSV выглядит следующим образом:

function JSON2CSV(objArray) {
    var array = typeof objArray != 'object' ? JSON.parse(objArray) : objArray;
    var str = '';
    var line = '';

    if ($("#labels").is(':checked')) {
        var head = array[0];
        if ($("#quote").is(':checked')) {
            for (var index in array[0]) {
                var value = index + "";
                line += '"' + value.replace(/"/g, '""') + '",';
            }
        } else {
            for (var index in array[0]) {
                line += index + ',';
            }
        }

        line = line.slice(0, -1);
        str += line + '\r\n';
    }

    for (var i = 0; i < array.length; i++) {
        var line = '';

        if ($("#quote").is(':checked')) {
            for (var index in array[i]) {
                var value = array[i][index] + "";
                line += '"' + value.replace(/"/g, '""') + '",';
            }
        } else {
            for (var index in array[i]) {
                line += array[i][index] + ',';
            }
        }

        line = line.slice(0, -1);
        str += line + '\r\n';
    }
    return str;
}

Надеюсь, что это поможет другим:)

21
ответ дан Jewel 19 August 2018 в 16:55
поделиться
  • 1
    Нет, это также не работает в Chrome и Firefox. – Marc 11 March 2017 в 21:49
  • 2
    какая часть? он работал для меня в хроме для загрузки файла с правильным именем – No Idea For Name 4 July 2017 в 14:02
  • 3
    Прекрасно загружает CSV-файл! Не могли бы вы помочь, как включить ключи (Id, Username)? – Chip 16 January 2018 в 00:43

Решение для IE состоит в том, чтобы использовать msSaveBlob и передать имя файла.

Для решения современных браузеров это выглядит следующим образом: IE11, FF & amp; Chrome

 var csvData = new Blob([arg.data], {type: 'text/csv;charset=utf-8;'});
        //IE11 & Edge
        if (navigator.msSaveBlob) {
            navigator.msSaveBlob(csvData, exportFilename);
        } else {
            //In FF link must be added to DOM to be clicked
            var link = document.createElement('a');
            link.href = window.URL.createObjectURL(csvData);
            link.setAttribute('download', exportFilename);
            document.body.appendChild(link);    
            link.click();
            document.body.removeChild(link);    
        }

Здесь есть хорошее обсуждение здесь

5
ответ дан lucas.coelho 19 August 2018 в 16:55
поделиться

Более короткая версия принятого сообщения (для моего случая пришлось использовать unicode)

var link = document.createElement("a");
link.href = 'data:text/csv,' + encodeURIComponent("algún texto");
link.download = "Example.csv";
link.click();
4
ответ дан Sameera R. 19 August 2018 в 16:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: