2015-04-21 2 views
0

Что касается загрузки файлов и определения заголовков, у меня возникли проблемы с назначением динамических filename для моих файлов. При использовании кода ниже:Каков правильный синтаксис для определения имени файла с переменными?

header("Content-Disposition: attachment; filename=test.csv"); 

test.csv создается файл для загрузки. Однако, если я использую это:

header('Content-Disposition: attachment; filename=' . $filename . '.csv'); 

Он генерирует .php файл вместо. Использование этого метода также не передает Content-Disposition или filename в заголовок.

Полный код:

session_start(); 
    $file =$_SESSION['csvf']; 
    $filename = $file."_".date("Y-m-d_H-i",time()); 
    header ("Content-type: text/csv"); 
    header("Content-Disposition: attachment; filename=test.csv"); 
    header('Expires: 0'); 
    header('Cache-Control: must-revalidate'); 
    header('Pragma: public'); 
    header('Content-Length: ' . filesize($file)); 
    print($file); 
    exit(); 

Что такое правильный синтаксис?

EDIT

Рабочий код после предложения

session_start(); 
$file = $_SESSION ['csvf']; 
$filename =date ("Y-m-d_H-i", time()); 
header ("Content-type: text/csv"); 
header ("Content-Disposition: attachment; filename=".$filename); 
header ('Expires: 0'); 
header ('Cache-Control: must-revalidate'); 
header ('Pragma: public'); 
header ('Content-Length: ' . filesize ($file)); 
print ($file) ; 
exit(); 
+2

'var_dump' переменная' $ filename' и посмотреть, что она содержит ... вы также можете ее обрезать для trailing '' 'или' '' –

+1

Где находится фактический файл? Я также вижу, re, используя 'filesize ($ file)' и в то же время используя '$ file' для' $ filename', это не имеет для меня никакого смысла, просим пояснить. –

+0

@PedroLobito Ye, серьезная ошибка. Я удалил '$ file' из' $ filename'. – b0w3rb0w3r

ответ

0

Я не вижу путь к example.csv указан на вашем коде, вам необходимо дать полный путь до $file, то есть:

$mySession = $_SESSION['csvf']; 
//since $_SESSION['csvf'] contains the actual data you cannot use it for filename 
$filename = date("Y-m-d_H-i",time()).".csv"; 
//write $mySession contents to file. Make sure this folder is writable 
file_put_contents("/home/site/csvfolder/$filename", $mySession); 
$file = "/home/site/csvfolder/$filename"; 

if (file_exists($file)) { 
    header('Content-Description: File Transfer'); 
    header('Content-type: text/csv'); 
    header('Content-Disposition: attachment; filename='.$filename); 
    header('Expires: 0'); 
    header('Cache-Control: must-revalidate'); 
    header('Pragma: public'); 
    header('Content-Length: ' . filesize($file)); 
    readfile($file); 
    exit; 
} 
+0

Что делать, если моя '$ mySession' содержит данные, которые я хочу распечатать, в файл CSV? – b0w3rb0w3r

+0

Основываясь на вашем комментарии, я обновил свой ответ –

+0

Потому что вы просто не можете сбросить содержимое '$ mySession' в браузер и ожидать, что он поймет, что вы пытаетесь сделать. Если у вас есть сомнения, вы можете проверить [function.readfile.php] (http://php.net/manual/en/function.readfile.php) –

0

Попробуйте С ниже код, это работа для меня

$file =$_SESSION['csvf']; 
$filename = $file."_".date("Y-m-d_H-i",time()).".csv"; 
header ("Content-type: text/csv"); 
header("Content-Disposition: attachment; filename=".$filename); 
header('Expires: 0'); 
header('Cache-Control: must-revalidate'); 
header('Pragma: public'); 
header('Content-Length: ' . filesize($file)); 
print($file); 
exit(); 
+1

Зачем OP пытаться это сделать? где объяснение? –

+0

@PedroLobito, потому что он работает на него? :) –

+0

@PedroLobito, если вы умный PHP Coder, не нужно никаких объяснений этим простым изменениям. !! в любом случае спасибо за ваш комментарий. –

0

Пожалуйста, используйте Как так, я использую это для меня ,

 header("Content-Type: application/vnd.ms-excel; charset=utf-8"); 
     header("Content-Disposition: attachment; filename=".$fileName); 
     header("Expires: 0"); 
     header("Cache-Control: must-revalidate, post-check=0, pre-check=0"); 

Вместо application/vnd.ms-excel используйте формат файла.It для Microsoft Excel.

+0

Я использовал 'application/vnd.ms-excel' проблемы, поэтому я изменил на' text/csv'. – b0w3rb0w3r

+0

Да используйте текст/csv и попробуйте. –

+0

Я просто тестирую текст/csv и приложение/csv, оба работают. Вы можете использовать приведенный ниже код для справки. Если это работает, вы никогда не забудете его принять. :-)

0

Try с этим:

header('Content-Description: File Transfer'); 
header('Content-Type: application/octet-stream'); 
header('Content-Disposition: attachment; filename=test.csv'); 
header('Expires: 0'); 
header('Cache-Control: must-revalidate'); 
header('Pragma: public'); 
header('Content-Length: ' . filesize($file)); 
readfile($file); 
exit; 

Вы можете увидеть больше о загрузки файлов с PHP здесь:

http://php.net/manual/en/function.readfile.php

0

Ниже приведен фрагмент файла .zip с некоторыми описаниями некоторой информации, требуемой заголовком, возможно, хорошей практикой является получение информации и некоторые проверки перед написанием заголовков. Еще короче пример также включен,

// defines filename, type, path, size and a reference to file (handler) 
// to set as values for file header 
$filename = $survey_id . '.zip'; 

// define path to the file to be get file size on the next line 
$filepath = [path to file]. '/' . $filename; 

// used by 'Content-length' 
$filesize = filesize($filepath); 

// using fopen to get a file handler, 'r' for read, 'b' for binary (zip file) 
$file_pointer = fopen($filepath, 'rb'); 

// check if file exists 
if(is_file($filepath)) 
{ 
    // valid file? 
    if($filesize && $file_pointer) 
    { 
     // some required header information to describe file, see [docs][1] 
     header("Pragma: public"); 
     header("Expires: 0"); 
     header("Cache-Control: must-revalidate, post-check=0, pre-check=0"); 
     header("Cache-Control: public"); 
     header("Content-Description: zip file"); 
     header("Content-Type: application/zip"); 
     header("Content-Type: application/force-download"); 
     header("Content-Disposition: attachment; filename=" . $filename); 
     header("Content-Transfer-Encoding: binary"); 
     header("Content-length: " . $filesize); 
     fpassthru($file_pointer); 

     // close 
     fclose($file_pointer); 
    } 
} 

Кроме того, контроль readfile(), более короткий фрагмент ниже

<?php 
$file = 'monkey.gif'; 

if (file_exists($file)) { 
    header('Content-Description: File Transfer'); 
    header('Content-Type: application/octet-stream'); 
    header('Content-Disposition: attachment; filename='.basename($file)); 
    header('Expires: 0'); 
    header('Cache-Control: must-revalidate'); 
    header('Pragma: public'); 
    header('Content-Length: ' . filesize($file)); 
    readfile($file); 
    exit; 
} 

?>

Надеется, что это помогает!