2017-02-15 5 views
0

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

Вот маршрут я сделал:

$backendApp->post('/export', function ($request, $response, $args) { 
     $emails = $this->orginization->exportEmails(); 
     $exportFile = $this->file->writeEmailExport($emails, 'AllEmails.csv'); 

     $fh = fopen($exportFile, "r"); 
     $stream = new \Slim\Http\Stream($fh); 

     $response = $response->withHeader('Content-Type', 'application/octet-stream') 
      ->withHeader('Content-Description', 'File Transfer') 
      ->withHeader('Content-Disposition', 'attachment; filename="' . basename($exportFile) . '"') 
      ->withHeader('Content-Length', filesize($exportFile)) 
      ->withBody($stream); 

     return $response; 
    }); 

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

Это заголовки, которые присутствуют на ответ:

Cache-Control:no-store, no-cache, must-revalidate, post-check=0, pre-check=0 
Connection:close 
Content-Description:File Transfer 
Content-Disposition:attachment; filename="AllEmails.csv" 
Content-Length:267 
Content-Type:application/octet-stream 
Expires:Thu, 19 Nov 1981 08:52:00 GMT 
Host:localhost:8080 
Pragma:no-cache 
X-Powered-By:PHP/5.6.15 

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

+0

Мой код файла загрузки не использует тонкую фреймворк, а мой код составляет 3 года, поэтому, возможно, я не должен комментировать, но мне просто интересно - вы пытались использовать 'preg_replace (" ([^ \ w \ s \ d \ -_ ~,;: \ [\] \ (\].] | [\.] {2,}) ", '', $ exportFile)' и 'filter_var ($ dl_file, FILTER_SANITIZE_URL)' где ' $ dl_file' является результатом preg_replace, чтобы удалить любые недопустимые символы? Если вы получаете содержимое файла .... Я не совсем уверен, что это поможет, просто мысль. – Inkdot

ответ

1

Это связано с тем не менее вы вызываете это как работает этот код:

$app = new \Slim\App($config); 

$app->get("/", function ($request, $response, $args) { 

    $response->write(
     <<<EOT 
<form method="POST" action="/export"> 
<input type="submit" value="Download"> 
</form> 
EOT 
    ); 

    return $response; 
}); 

$app->post('/export', function ($request, $response, $args) { 
    $exportFile = __DIR__ . '/../test_file.txt'; 

    $fh = fopen($exportFile, "r"); 
    $stream = new \Slim\Http\Stream($fh); 

    $response = $response->withHeader('Content-Type', 'application/octet-stream') 
     ->withHeader('Content-Description', 'File Transfer') 
     ->withHeader('Content-Disposition', 'attachment; filename="' . basename($exportFile) . '"') 
     ->withHeader('Content-Length', filesize($exportFile)) 
     ->withBody($stream); 

    return $response; 
}); 

Вы говорите, что вы можете увидеть информацию на вкладке ответа. Означает ли это, что вы запускаете это через JavaScript? Если это так, то браузер отправит файл обратно в JS, а не пользователю. Если вы хотите, чтобы диалоговое окно загрузки файла появилось, укажите форму (как вы хотите POST) с кнопкой на ней, чтобы пользователь мог щелкнуть.

+0

Ahhh да ваш комментарий о вызове маршрута через Javascript был на месте. Спасибо – Xenology

Смежные вопросы