2016-09-02 2 views
0

У меня есть требование получить файл из API, который возвращает filedata в формате base64. Я добавляю, что <a href тег, который выглядит, как показано нижеКак запустить загрузку файла из href вручную

<a id="myFile" href="data:image/png;base64,..." click="downloadFile()">Download File</a> 

Так что я хочу, чтобы вызвать FileDownload с помощью $('#myFile').click(), которая собирается downloadFile() функции, но я не могу использовать location.href как я не хочу страницу для перенаправления.

Есть ли альтернатива для этого требования? Любые предложения были бы большой помощью.

ПРИМЕЧАНИЕ: Я получаю значение href динамически с некоторым ответом ajax после нажатия ссылки, изначально href устанавливается в # и будет заменен соответствующей загружаемой строкой, как указано выше. Я хочу запустить загрузку файла вместе с тем же событием, которое вызвало запрос ajax, а не отдельным событием клика.

+0

ограниченной поддержки браузера. Вот только решение Chrome. http://stackoverflow.com/a/15832662/5496966 .. Вы также можете заменить тип приложения на «data: image/png» на 'data: application/octet-stream' .. он заставляет браузер загружать вместо переходя к значению href. – AA2992

+0

Также можно загрузить файл bin. Вам придётся дать ему имя и файл с любым способом, с которым вы работаете. – AA2992

+0

Awsome Ankith. Это действительно сработало. Есть все равно, чтобы сделать его мультибраузером. Просто упомяните об этом в правильном ответе, отметьте это правильно. Спасибо за помощь. –

ответ

2

Вы можете использовать атрибут download - не требуется JS.

<a id="myFile" href="data:image/png;base64,..." download>Download File</a> 

https://developer.mozilla.org/en/docs/Web/HTML/Element/a#attr-download

+0

Это не то, что я смотрю. Я добавил примечание к моему первоначальному запросу. Мой фактический запрос - загрузить файл с помощью запроса ajax. Ajax request ad Загрузить файл должен происходить с одним и тем же событием клика. –

+0

Я все еще думаю, что вы должны добавить атрибут загрузки (с именем также), и когда href был создан, вызовите 'myFile.click()', чтобы загрузить его автоматически при выполнении ajax. – Endless

+0

Исходное значение '#' so нажмите на страницу перезагрузки, что не то, что он хочет. У него есть сценарий, позволяющий изменить значение href при первом щелчке, что создает необходимость предотвратить детекцию. Поэтому он не может использовать атрибут загрузки. – AA2992

1

Просто создайте, нажмите и удалить новую ссылку в DOM после Ajax запроса завершена. Должно сработать.

Вот ссылка на JS fiddle example.

// execute this after the ajax request is complete 

var myFile = document.getElementById('myFile'); 
var dataURI = myFile.getAttribute('href'); 

myFile.addEventListener("click", function(event){ 
    event.preventDefault(); 
    // check if href value exists 
    if(dataURI.length) { 
    var fileName = 'image.png'; 
    var link = document.createElement("a"); 
    link.setAttribute("href", dataURI); 
    link.setAttribute("download", fileName);  
    document.body.appendChild(link); 
    link.click(); 
    document.body.removeChild(link); 
    delete link; 
    } 
}); 

Примечание: браузеры не поддерживают имя файла, установленный в атрибуте загрузки, если есть Cross Origin запросы.

+0

Нет необходимости конвертировать base64 url ​​в объект url – Endless

+0

Спасибо! Обновлено. Я смотрел, как с ними обращаются. Меня это смутило. – AA2992

1

Если включить FileSaver на вашей странице, то вы можете сделать что-то вроде

fetch(url).then(res => res.blob()).then(blob => saveAs(blob, 'filename.txt')) 
Смежные вопросы