Как изменить имя файла при загрузке с помощью JavaScript? - PullRequest
8 голосов
/ 23 сентября 2011

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

Example URL:
"http://website.com/video.mp4"

Example of what I want the filename to be saved as during download:
"The_title_renamed_with_javascript.mp4"

Ответы [ 6 ]

5 голосов
/ 16 января 2013

Это на самом деле возможно с JavaScript, хотя поддержка браузера будет нестабильной. Вы можете использовать XHR2 для загрузки файла с сервера в браузер в качестве BLOB-объекта, создания URL-адреса для BLOB-объекта, создания якоря со свойством href, для которого установлено значение этого URL-адреса, для свойства загрузки задайте любое имя файла, а затем нажмите на ссылку. Это работает в Google Chrome, но я не подтвердил поддержку в других браузерах.

window.URL = window.URL || window.webkitURL;

var xhr = new XMLHttpRequest(),
      a = document.createElement('a'), file;

xhr.open('GET', 'someFile', true);
xhr.responseType = 'blob';
xhr.onload = function () {
    file = new Blob([xhr.response], { type : 'application/octet-stream' });
    a.href = window.URL.createObjectURL(file);
    a.download = 'someName.gif';  // Set to whatever file name you want
    // Now just click the link you created
    // Note that you may have to append the a element to the body somewhere
    // for this to work in Firefox
    a.click();
};
xhr.send();
2 голосов
/ 23 сентября 2011

Имя файла для загрузки задается в заголовке ( посмотрите на «Content-Disposition» ), которое создается на стороне сервера.

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

2 голосов
/ 23 сентября 2011

Вы не можете сделать это с помощью клиентского JavaScript, вам нужно установить заголовок ответа ...

.NET

Response.AddHeader("Content-Disposition", "inline;filename=myname.txt")

Или PHP

header('Content-Disposition: inline;filename=myname.txt')

Также доступно на других серверных языках по вашему выбору.

1 голос
/ 23 сентября 2011

Вы можете , вероятно, сделать это с помощью пользовательского скрипта Chrome , но этого нельзя сделать (пока) с помощью JavaScript Greasemonkey (Firefox).

Методы обхода (от простого к сложному):

  1. Добавьте ссылки с помощью Greasemonkey, но используйте отличное DownThemAll! дополнение для загрузки и переименования видео.

  2. Загрузите видео как есть и используйте пакетный файл, shell-скрипт, программу Python и т. Д., Чтобы переименовать их.

  3. Используйте функцию Greasemonkey GM_xmlhttpRequest() Doc для отправки файлов в ваше собственное веб-приложение на сервере, которым вы управляете.
    Этот сервер может быть вашим собственным ПК с XAMPP (или аналогичным).

  4. Напишите свое собственное дополнение Firefox вместо скрипта Greasemonkey. Надстройки имеют необходимые привилегии, а Greasemonkey - нет.

0 голосов
/ 22 мая 2015

На тот случай, если вы ищете такое решение для загружаемого расширения chrome, вам следует обратиться к API chrome.downloads, для этого требуется дополнительное разрешение («загрузки») и позволяет указать имя файла. https://developer.chrome.com/extensions/downloads

Однако есть проблема, с которой я сейчас сталкиваюсь. Расширение Chrome, которое я рефакторинг, имеет 600 тыс. Пользователей и добавление нового разрешения отключит расширение для всех из них. Так что для меня это решение не требуется, но если вы разрабатываете новое расширение, вам определенно следует его использовать.

0 голосов
/ 23 сентября 2011

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

...