отдача файла с помощью PHP

_Дмитрий_

Новичок
Есть ссылка, в которой href указывает на реальный файл на сервере, но запрещенный для прямой скачки
<a class="JS_send" href='path_server/file.txt'>ссылка</a>

ajax-ом отправляю href на сервер
$(".JS_send").on('click', function(e){
var url = $(this).attr('href');
e.preventDefault();
$.ajax({
url: '/url',
type: 'POST',
dataType: 'JSON',
data: 'url='+url});
})

на сервере ловлю эту ссылку на файл в переменную $file и пытаюсь отправить этот файл для скачивания
PHP:
if (file_exists($file)) {
// сбрасываем буфер вывода PHP, чтобы избежать переполнения памяти выделенной под скрипт
        if (ob_get_level()) {
            ob_end_clean();
        }
        // заставляем браузер показать окно сохранения файла
        header('Content-Description: File Transfer');
        header('Content-Type: application/octet-stream');
        header('Content-Disposition: attachment; filename=' . basename($file));
        header('Content-Transfer-Encoding: binary');
        header('Expires: 0');
        header('Cache-Control: must-revalidate');
        header('Pragma: public');
        header('Content-Length: ' . filesize($file));
        // читаем файл и отправляем его пользователю
        readfile($file);
        exit;
    }

однако ни чего не происходит.
 
"скачки" от слова скачивать
запрет делаю в .htaccess, но не в этом суть

ловлю эту ссылку, из POST.
файл читается и я его содержимое могу вернуть в ответе ajax, но мне надо что бы это содержимое вывело окошко на сохранение

просто мне надо отдавать файл на "скачку" не перегружая страницу
 
Переделываем ссылку в что-то вида <a class="JS_send" href='downloadfile.php?id=xxx'>ссылка</a>

Далее все по накатанному через readfile и заголовки. Ясен пень, что как надо без перезагрузки. При чем тут ваще AJAX?
 
да с сылкой все нормально, файл читается, содержимое возвращается
AJAX при том чтоб без перезагрузки.

ладно счас набросаю примерчик, мож непонятно объясняю
 
У тебя и так нету перезагрузки страницы
 
мне надо из ссылки или неважно откуда например
<div rel="/public/backup/2013.08.01_19-14-14.zip">Скачать</div>

отправить это "/public/backup/2013.08.01_19-14-14.zip" на сервак
на серваке взять этот файл и выдать его в браузер но только чтоб было сообщение "сохранить или открыть", а не просто содержимое

счас получается вернуть только содержимое
 
пробовал и вот так
PHP:
function file_force_download_ngix($file) {
    if (file_exists($file)) {
        header('X-Accel-Redirect: ' . $file);
        header('Content-Type: application/octet-stream');
        header('Content-Disposition: attachment; filename=' . basename($file));
        exit;
    }
}

и вот так советовали
PHP:
function download($file) {
    $rFile = @fopen($file, 'r');
    $rOutput = fopen('php://output', 'w');
    if($rFile){
        header('Content-Disposition: attachment; filename='.basename($file));
        stream_copy_to_stream($rFile, $rOutput);
        exit();
    }
}
 
_Дмитрий_
Я уже написал тебе что надо сделать. У тебя ссылка на файл откуда берется? Из базы, файла, кеша или ты читаешь диск? Ну так вот, делаешь так, как я сказал выше. Можешь вместо id передать путь к файлу, и в файле уже считать его и отправить заголовки для скачивания.
 
да с файлом проблем нет, он читается, но отдается браузеру в виде содержимого
Заголовки ответа
HTTP/1.1 200 OK
Date: Fri, 02 Aug 2013 10:09:32 GMT
Server: Apache/2.2.22 (Win32) mod_ssl/2.2.22 OpenSSL/1.0.1c PHP/5.3.13
X-Powered-By: PHP/5.3.13
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Content-Disposition: attachment; filename=test.html
Content-Length: 1297
Keep-Alive: timeout=5, max=100
Connection: Keep-Alive
Content-Type: text/html; charset=utf-8

ОТВЕТ
<!DOCTYPE html>
<html>
<head>
<title></title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
</head>
<body>
..........
и так далее содержимое файла

а мне надо чтоб запрос на сохранение выскочил
 
заголовки вроде правильные, мне кажется, что browser смущается когда ему говорят
Код:
Content-Type: text/html; charset=utf-8
и конечно показывает содержимое а не сгружает его
 
провел эксперемент
файл test.php
PHP:
<?php
$content = 'Содержимое файла';
$filename = 'my_super_file.txt';
header ("Content-Type: application/octet-stream");
header ("Accept-Ranges: bytes");
header ("Content-Length: " . strlen($content));
header ("Content-Disposition: attachment; filename=" . $filename);

если вызвать из строки браузера - выводится окошко сохранить/открыть содержимое
если вызывать аяксом, то содержимое тупо возвращается в ответе, и не предлагает окошко сохранить/открыть
 
загаловки:
из строки браузера
HTTP/1.1 200 OK
Date: Fri, 02 Aug 2013 10:16:24 GMT
Server: Apache/2.2.22 (Win32) mod_ssl/2.2.22 OpenSSL/1.0.1c PHP/5.3.13
X-Powered-By: PHP/5.3.13
Accept-Ranges: bytes
Content-Length: 31
Content-Disposition: attachment; filename=my_super_file.txt
Keep-Alive: timeout=5, max=100
Connection: Keep-Alive
Content-Type: application/octet-stream


аяксом
Apache/2.2.22 (Win32) mod_ssl/2.2.22 OpenSSL/1.0.1c PHP/5.3.13
PHP/5.3.13
Thu, 19 Nov 1981 08:52:00 GMT
no-store, no-cache, must-revalidate, post-check=0, pre-check=0
no-cache
Accept-Ranges bytes
Content-Length 31
Content-Disposition attachment; filename=my_super_file.txt
Keep-Alive timeout=5, max=100
Connection Keep-Alive
Content-Type application/octet-stream
 
_Дмитрий_
ЗАБУДЬ УЖЕ ПРО АЯКС, он не нужен тебе. Нужна ссылка на файл и обработчик скачки.
 
та блин мне нужно пнуть скрипт скачки без перезагрузки странички
потому как ссылки генерятся при первом заходе на страничку, потом мне надо кликая по ним давать возможность скачать по ним содержимое, не перегружаю эту страничку

если я по ссылке укажу например href="download.php?url=/fkjdfkfdjfdlk/test.html" тот перейду на эту download.php и потеряю сгенеренные ссылки

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

Вот пример http://rghost.ru/47843376
 
не, не будем спорить :)
сделал примерчик, работает...


tets.html
<a href="download.php?file=download.php">Скачать</a>

download.php
PHP:
<?php
$file = $_GET['file'];
    if (ob_get_level()) {
        ob_end_clean();
    }
    header('Content-Description: File Transfer');
    header('Content-Type: application/octet-stream');
    header('Content-Disposition: attachment; filename=' . basename($file));
    header('Content-Transfer-Encoding: binary');
    header('Expires: 0');
    header('Cache-Control: must-revalidate');
    header('Pragma: public');
    header('Content-Length: ' . filesize($file));
    readfile($file);
exit;
 
Сверху