Задать вопрос

Nginx и раздача файлов?

Использую nginx на сервере для контролируемой раздачи файлов (wiki.nginx.org/XSendfile)

Встала задача узнать скачал ли пользователь файл полностью или нет (прервалось скачивание например или просто отменил скачивания), а как сделать — понятия не имею. Есть предложения у хабрасообщества (вариант с раздачей скриптом на php/python/perl/etc не принимается)?


upd: post_action (например abarmotik.livejournal.com/7496.html)
# Здесь обрабатывается запрос на скачивание файла.<br/>
 # урл имеет вид <a href="http://example.com/download/-encrypted-file-id-">example.com/download/-encrypted-file-id-</a><br/>
 location /download {<br/>
 set $limit_rate 10k;<br/>
 limit_conn lim 1;<br/>
<br/>
# передаем запрос бэк-енду на расшифровку. В ответе ожидаем хедер X-Accel-Redirect <br/>
 proxy_pass <a href="http://127.0.0.1">127.0.0.1</a>:8888/nginxds/linkDecoder?domain=$host&path=$request_uri;<br/>
 proxy_set_header X-Real-IP $remote_addr;<br/>
 <br/>
 add_header Content-Length $content_length;<br/>
 add_header Content-Disposition attachment;<br/>
 }<br/>
<br/>
# В этот локейшн переходим по хедеру X-Accel-Redirect от бэк-енда (см. предыдущий локейшн)<br/>
 # Предполагается, что все раздаваемые файлы лежат в папке /storage<br/>
 location /storage {<br/>
 set $postURI $uri;<br/>
 set $postIP $remote_addr;<br/>
 set $postHOST $host;<br/>
 <br/>
 post_action @postDownload;<br/>
<br/>
root /;<br/>
 internal;<br/>
 }<br/>
<br/>
# по завершению скачивания файла передаем на бэк-енд переменные установленные<br/>
 # в предыдущем локейшыне и отданный объем (в байтах)<br/>
 location @postDownload {<br/>
 proxy_pass <a href="http://127.0.0.1">127.0.0.1</a>:8888/nginxds/postDownload?domain=$postHOST&uri=$postURI;<br/>
 proxy_set_header X-Real-IP $postIP;<br/>
 proxy_set_header BytesSent $body_bytes_sent;<br/>
 }
  • Вопрос задан
  • 7701 просмотр
Подписаться 17 Оценить 7 комментариев
Пригласить эксперта
Ответы на вопрос 1
alekciy
@alekciy
Вёбных дел мастер
С ходу — посмотреть логи.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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