• Главная
  • Карта сайта
Не найдено

Відкриття посилання "на скачування" і відстеження статус завантаження файлу браузером.

Новачок на форумі

php?do=newpm&u=8833>php?do=finduser&u=8833>

Реєстрація: 04.09.2010

Повідомлень: 3


Відкриття посилання "на скачування" і відстеження статус завантаження файлу браузером.

Добрий час доби!
У мене виникли складності в процесі написання не великого JavaScript-а, а саме, є якийсь процес:
- користувач виділяє файли на web сторінці, JS обробляє це виділення, отримує ID елемента (для кожного файлу воно буде унікальним), збирає масив JS, перекладаю його цей об'єкт в формат JSON і відправляю дані на сервер (не великий PHP скрипт)
- сервер отримавши ці дані обробляє, вибирає потрібні файли по ID (повна інформація про файли зберігатися в БД). Упаковує вибрані файли в архів zip і переміщує в тимчасову public директорію для скачування, далі серверний сценарій відповідає назад в браузер в форматі JSON, в одному з параметрів якраз і буде посилання на цей архів.
Ось як це виглядає у мене:
function GetSelectedFiles (id) {if (id) {selectedIDs.length = 0; uncheckSelection (); selectedIDs.push (id); } If (selectedIDs.length> 0) {oSendingData.file_list = selectedIDs; $ .Post (php_download_link, JSON.stringify (oSendingData), onDownload, 'json'); } Else {printStatusbar ( "Виберіть файл (и) для скачніванія"); } // Якщо завантажуємо по іконки, то відчищаємо масив if (id) selectedIDs.length = 0; function onDownload (responce_json) {// Перевірка відповіді від сервера checkAuthAndError (responce_json); // Якщо отримали посилання на файл! window.location.href = responce_json.download_link; }; };
Власне в чому проблема, після того як скрипт отримав дані від сервера, я віддаю посилання на «тимчасовий» файл в браузер, що б звичайно користувач міг її завантажити, це відбувається ось в цьому рядку:
window.location.href = responce_json.download_link;
Так ось саме тут виникають дві які поняткі.
1) Якщо я даю посилання не в на .ZIP архів, а на файл .JPEG, то браузер чомусь відкриває цей лінк до ЦЬОМУ ж вікні і відображає картинку в браузері. Чи можливо якось змусити браузер відкривати посилання завжди з пропозицією для скачування?
2) Поки тимчасові файли лежать у тимчасовому каталозі і я їх видаляю періодичний в ручну, думав вішати на сервері скрипт на perl \ bash \ php під cron-му, який видаляв би файли через N-кількість часу, але це не зовсім хороший спосіб, з багатьох причин. Отже питання, чи можливо за допомогою JS відстежити, чи був скачав файл чи ні? Якби була можливість, то я б просто після скачування файлу відправляв би не великий запит на сервер з підтвердженням скачування файлу, і на сервері видаляв би його з тимчасового каталогу.
Допоможіть, плз може хто стикався з подібним завданням

Щоб браузер запропонував скачати фаил, а Ти не дав його, потрібно віддати його з http-заголовком

код:

Content-Disposition: attachment або

код:

Content-Disposition: attachment; filename = my_file.tar.gz У другому випадку браузер запропонує зберегти його саме з таким ім'ям.
Все це робиться на сервері, звичайно.

Новачок на форумі

php?do=newpm&u=8833>php?do=finduser&u=8833>

Реєстрація: 04.09.2010

Повідомлень: 3


Так, це я вже в гуглі вичитав, написав навіть вже не більшу функцію на php, яка робить правильні заголовки, але зверніть увагу, в моєму коді я роблю AJAX запит методом POST, із зазначенням формату даних JSON і функцією зворотного виклику. Тобто в даному прикладі якщо я на стороні сервера скажімо зроблю так:
header ( 'Pragma: public'); // required header ( 'Expires: 0'); // no cache header ( 'Cache-Control: must-revalidate, post-check = 0, pre-check = 0'); header ( 'Last-Modified:' .gmdate ( 'D, d MYH: i: s', filemtime ($ file_name)). 'GMT'); header ( 'Cache-Control: private', false); header ( "Content-Type: application / zip \ n"); header ( 'Content-Disposition: attachment; filename = "'. basename ($ file_name). '"'); header ( 'Content-Transfer-Encoding: binary'); header ( 'Content-Length:' .filesize ($ file_name)); header ( 'Connection: close'); readfile ($ file_name);
То в браузер чомусь цього не розуміє, хоча якщо я зроблю GET \ POST до серверного файлу в ручну, то браузер нормально розуміє цей HTTP заголовок.
Та й крім того в моєму випадку у відповіді від сервера (в форматі JSON), існує ще додаткова інформація крім як посилання на файл.
Хоча я тут зараз подумав, може бути дійсно зробити додаткову обробку даних з сервера, і окремий сценарій на сервері який брав би дані про файлі в GET-е віддавав їх на скачку (як-небудь в так: window.location = 'get_file.php ? filename = XXXX.zip ', тобто що б не використати AJAX виклик), після чого видаляв би.

У php є функція, яка відкриває файл і віддає його вміст клієнту (назва не пам'ятаю, але шукати слід поруч з fpassthru). Також, є функція з назвою на кшталт is_client_aborted, яка перевіряє, чи не вимкнено клієнт.
Відповідно, якщо після виведення вмісту покупець не відключився, то файл викачаний.
Соррі, конкретних імен функцій не назву - я з телефону.

Новачок на форумі

php?do=newpm&u=8833>php?do=finduser&u=8833>

Реєстрація: 04.09.2010

Повідомлень: 3


так я вище описав що якщо я роблю GET \ POST з AJAX, то що б я не робив в PHP (маю на увазі з заголовками), то файл не зрозуміло куди скачується (підозрюю де то в кеші браузера лежить), см. уважно мій код вище.
Вообщем вирішив проблему:
var sname = getParam ( "sname"); var sid = getParam (sname); var add_url = 'PHPSESSID =' + sid + '& sname =' + sname; var php_get_dl_link = '../php/json_get_file.php'; var php_download_file = '../php/download.php?' + Add_url; var oSendingData = new Object (); oSendingData.session_id = sid; oSendingData.session_name = sname; function GetSelectedFiles (id) {if (id) {selectedIDs.length = 0; uncheckSelection (); selectedIDs.push (id); } If (selectedIDs.length> 0) {oSendingData.file_list = selectedIDs; $ .Post (php_get_dl_link, JSON.stringify (oSendingData), onDownload, 'json'); } Else {printStatusbar ( "Виберіть файл (и) для скачування"); } // Якщо завантажуємо по іконки, то відчищаємо масив if (id) selectedIDs.length = 0; function onDownload (responce_json) {// Перевірка відповіді від сервера checkAuthAndError (responce_json); // Якщо отримали посилання на файл! window.location.href = php_download_file + '& dl_file =' + responce_json.download_link; }; };
json_get_file.php
// Тут йде обробка файлу, перевірка авторизації і так далі .... // Зберігаю шлях до тимчасового файлу, що б його ні хто інший не поцупив! $ _SESSION [ 'download_tmp_file'] = $ file_name; // .....
ну і потім сам download.php
<? Php ini_set ( 'display_errors', 1); error_reporting (E_ALL); ini_set ( 'session.use_cookies', 0); // Підключаю настройки include ( "./ include / g_settings.inc.php"); $ Sname = $ _GET [ 'sname']; $ Sid = $ _GET [ 'PHPSESSID']; $ Filename = $ _GET [ 'dl_file']; session_id ($ sid); session_name ($ sname); session_start (); // Запусках сесію // Перевіряємо що сесія активна! if (! isset ($ _ SESSION [ 'is_auth']) || $ _SESSION [ 'is_auth'] == 0) {// Якщо сесія не активна $ s_status = 0; session_unset (); session_destroy (); Header ( "Location: ../index.html"); exit (1); } // Якщо встановлена ​​змінна сесія з посиланням на скачку файлу if (isset ($ _ SESSION [ 'download_tmp_file'])) {// Перевіряємо що надійшов запит на скачку саме цього файлу! if ($ _ SESSION [ 'download_tmp_file'] == $ filename) {header ( 'Pragma: public'); // required header ( 'Expires: 0'); // no cache header ( 'Cache-Control: must-revalidate, post-check = 0, pre-check = 0'); header ( 'Last-Modified:' .gmdate ( 'D, d MYH: i: s', filemtime ($ filename)). 'GMT'); header ( 'Cache-Control: private', false); header ( "Content-Type: application / zip \ n"); header ( 'Content-Disposition: attachment; filename = "'. basename ($ filename). '"'); header ( 'Content-Transfer-Encoding: binary'); header ( 'Content-Length:' .filesize ($ filename)); header ( 'Connection: close'); // Віддаємо файл в браузер ob_clean (); flush (); if (readfile ($ filename)) {if (! unlink ($ filename)) // Видаляємо файл, якщо не вийшло то повідомляємо про помилки echo "<h1> Error on remove file! Please contact a system administrator! </ h1> "; // TODO: syslog else unset ($ _ SESSION [ 'download_tmp_file']); // Хоча все одно перезапише! } Else echo "<h1> Error on download file! Please contact a system administrator! </ H1>"; // TODO: syslog} else {echo "<h1> access denied !!! </ h1>"; // TODO: syslog}} else {echo "<h1> File not found !!! &lt;/ h1>"; // TODO: syslog}?>

Новачок на форумі

php?do=newpm&u=102>php?do=finduser&u=102>

Реєстрація: 19.02.2008

Повідомлень: 9,177


Не треба робити ajax-запит, якщо хочете завантажити файл.

Новачок на форумі

php?do=newpm&u=102>php?do=finduser&u=102>

Реєстрація: 19.02.2008

Повідомлень: 9,177


Просто location.href = 'savefile.php';




Чи можливо якось змусити браузер відкривати посилання завжди з пропозицією для скачування?
Отже питання, чи можливо за допомогою JS відстежити, чи був скачав файл чи ні?
Php ?
Php?
Lt;/ h1>"; // TODO: syslog}?
Провайдеры:
  • 08.09.2015

    Batyevka.NET предоставляет услуги доступа к сети Интернет на территории Соломенского района г. Киева.Наша миссия —... 
    Читать полностью

  • 08.09.2015
    IPNET

    Компания IPNET — это крупнейший оператор и технологический лидер на рынке телекоммуникаций Киева. Мы предоставляем... 
    Читать полностью

  • 08.09.2015
    Boryspil.Net

    Интернет-провайдер «Boryspil.net» начал свою работу в 2008 году и на данный момент является одним из крупнейших поставщиков... 
    Читать полностью

  • 08.09.2015
    4OKNET

    Наша компания работает в сфере телекоммуникационных услуг, а именно — предоставлении доступа в сеть интернет.Уже... 
    Читать полностью

  • 08.09.2015
    Телегруп

    ДП «Телегруп-Украина» – IT-компания с 15-летним опытом работы на рынке телекоммуникационных услуг, а также официальный... 
    Читать полностью

  • 08.09.2015
    Софтлинк

    Высокая скоростьМы являемся участником Украинского центра обмена трафиком (UA — IX) с включением 10 Гбит / сек... 
    Читать полностью