Скачать внешний ресурс - переименовать файл

У меня есть сайт, где пользователям предлагается загружать файлы с внешних ресурсов. Поскольку имена внешних файлов хэшируются, и пользователь загружает несколько файлов, пользователям очень трудно узнать, какой загружаемый файл достигает того ресурса, который он запрашивал. Например, имя файла fdae442dafe42.zip может быть production-resources.zip.

Я ищу способы получить его, чтобы браузер загружал файл под другим именем. Ниже приведены некоторые из моих идей и почему они не сработают, но вы можете найти обходной путь.

Просто заметка, я не имею никакого контроля над внешним ресурсом. Я не смогу вносить изменения в заголовки или что-то еще. Мой сервис - это веб-сайт, который в основном предназначен для пользователей настольных компьютеров. Решения для Android и iOS не будут такими уж полезными.

 Атрибут загрузки

Этот метод некоторое время работал в Google Chrome и Firefox, но затем они начали следовать спецификации HTML5 W3. Внешний ресурс требует отправки заголовка Content-Disposition, в котором Google Chrome и Firefox ранее не проверяли.

Скачать PHP Proxy

Я знаю, что мог бы сделать так, чтобы PHP-скрипт сделал запрос к внешнему ресурсу, а затем доставил его конечному пользователю, изменив заголовки и имя в соответствии со своими потребностями. Проблема в том, что у сайта высокий трафик, и каждый пользователь загружает около 1-2 ГБ данных. Мои серверы не могут обрабатывать этот тип трафика, и обновление сервера, вероятно, будет слишком дорогостоящим.

Переименование файлов с помощью внешнего приложения

Я подумывал об использовании внешнего приложения (возможно, расширения Chrome/Firefox), которое переименует файлы после завершения загрузки. Но, учитывая, что достаточно большая аудитория - это посетители, посещающие один раз, попросить их загрузить приложение или расширение очень маловероятно.

Flash или Java Embedded Solutions

Я рассматриваю возможность использования встроенного файла Java или Flash, который будет обрабатывать загрузку файлов, но я не знаю достаточно ни об одной платформе. Из того, что я могу сказать, Flash не имеет большого контроля над файловой системой пользователя, так что это может быть проблемой. Java сможет выполнить эту задачу, но я действительно надеялся, что мне не придется использовать Java, поскольку он часто небезопасен и требует большой загрузки для его установки (такая же проблема, как и у идеи External Software).


Если у вас есть какие-либо идеи о том, что я мог бы сделать, чтобы решить эту проблему, они будут очень признательны. Я не ищу какой-либо код, просто идеи о том, как я смогу выполнить вышеуказанную задачу. Я хотел бы поблагодарить вас всех за ваше время и опыт.

Ответ 1

Что это за внешний ресурс, на который вы ссылаетесь?

Если это происходит с Amazon S3, он позволяет генерировать URL-адреса для загрузки и указывать Content-Disposition, которая должна присутствовать в ответе с их сервера после загрузки. Там вы можете закодировать, какое имя файла должен использовать браузер при сохранении файла.

Если это другой сервис, взгляните на его документацию, возможно, он имеет аналогичную функцию.

Ответ 2

Если вы прошли аутентификацию на целевом сервере через Access-Control-Allow-Origin, возможно, вам поможет сочетание этих двух методов:

Как установить пользовательские заголовки http при смене iframe src?

$.ajax({
    type: "GET", 
    url: "https://app.icontact.com/icp/a/",
    contentType: "application/json",
    beforeSend: function(xhr, settings){
            xhr.setRequestHeader("some_custom_header", "foo");},
    success: function(data){
        $("#output_iframe_id").attr('src',"data:text/html;charset=utf-8," + escape(data))
    }
});

JavaScript/jQuery для загрузки файла через POST с данными JSON

$.post('/create_binary_file.php', postData, function(retData) {
  $("body").append("<iframe src='" + retData.url+ "' style='display: none;' ></iframe>");
}); 

Ответ 3

Используйте атрибут "download" тега "a".

<a href="#" onclick="location.href='http://external.server/path/to/file'; return false;" download="name_you_want.ext">download</a>

Это должно работать с последними версиями Chrome и Firefox, но не с IE.