Использую 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/>
}