Программирование на PHP
Часто задаваемые вопросы

  Главная   Учебник   Статьи   FAQ   Книги   Ссылки  

Работа с файлами

  1. Пытаюсь переслать картинку из файла, но она приходит частично, "бьется", что делать?
  2. Почему при работе с csv-файлами теряются некоторые заглавные русские буквы?
  3. При попытке отдать через header("Location: somefile") файл с расширением pdf, doc, txt, IE открывает их в окне браузера. Как этого избежать?
  4. Как заставить браузер предлагать сохранять файл с нужным названием, а не download.php?
  5. Как корректно заставить броузер скачать и записать файл вместо открытия в окне с поддержкой докачки? (пример скрипта)
  6. Как сделать аттачмент к е-мейлy пpи отпpавке его с помощью фyнкции mail?

Пытаюсь переслать картинку из файла, но она приходит частично, "бьется", что делать?

Бинарные файлы нужно открывать с ключем "b", иначе в некоторых случаях файл считается текстовым. Обычно такое происходит под Windows, но если в Вашей системе параметр "b" не требуется, то он будет игнорироваться, поэтому рекомендуется его все-таки употреблять. Пример:

<? 
  $fp = fopen("/home/rasmus/file.txt", "rb"); 
?> 
Andy Ice, 2:5012/8.13

Почему при работе с csv-файлами теряются некоторые заглавные русские буквы?

Потому что csv-файл должен удовлетворять одному, главному условию: текстовые поля должны быть ограничены кавычками, т.е. пример такого плана:

1, "Фамилия Имя Отчество", "Должность"

Andy Ice, 2:5012/8.13

При попытке отдать через header("Location: somefile") файл с расширением pdf, doc, txt, IE открывает их в окне браузера. Как этого избежать?

При отдаче файла через header("Location: somefile"), web сервер отдает еще Content-type этого файла, который узнается по расширению файла. Информация о соответствии content-а расширению берется web сервером из конфигурационного файла mime.types. Броузеры в зависимости от получаемого Content-type знают что дальше делать с этим файлом. При этом расширение файла броузеру ни о чем не говорит, и если web сервер отдаст, к примеру, файл best_music.mp3 с Content-type: application/msword, то, если в системе клиента установлен MS Word, этот файл будет открыт им.

Для решения проблемы описанной в вопросе существуют два способа:

1. Отредактировать файл mime.types поставив желаемым расширениям файлов (которые надо скачивать, а не открывать) в соответствие тип application/octet-stream.

Hедостатки:

2. Отдавать файл клиенту, не посредством header("Location: somefile"), а организовав собственную процедуру отдачи файла. При этом появляется возможность динамически менять Content-type, предоставив пользователю выбор, открыть ли файл в броузере или просто скачать, записав на диск.

Hедостатки:

Serge V. Tarasov

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

В msdn нашел:

<? 
    header("Content-Disposition: attachment; filename=work1.doc"); 
    $x = fread(fopen("test.doc", "rb"), filesize("test.doc")); 
    echo $x; 
?> 
Alexey Kolesnichenko

Как корректно заставить броузер скачать и записать файл вместо открытия в окне с поддержкой докачки? (пример скрипта)

Предполагается, что

<?php 
$filename = $cd."/".$fn; 
if (!file_exists($filename)) 
   { 
    header ("HTTP/1.0 404 Not Found"); 
    exit; 
   } 
$fsize = filesize($filename); 
$ftime = date("D, d M Y H:i:s T", filemtime($filename)); 
$fd = @fopen($filename, "rb"); 
if (!$fd){ 
  header ("HTTP/1.0 403 Forbidden"); 
  exit; 
} 
// Если запрашивающий агент поддерживает докачку 
if ($HTTP_SERVER_VARS["HTTP_RANGE"]) { 
  $range = $HTTP_SERVER_VARS["HTTP_RANGE"]; 
  $range = str_replace("bytes=", "", $range); 
  $range = str_replace("-", "", $range); 
  if ($range) {fseek($fd, $range);} 
} 
$content = fread($fd, filesize($filename)); 
fclose($fd); 
if ($range) { 
  header("HTTP/1.1 206 Partial Content"); 
} 
else { 
  header("HTTP/1.1 200 OK"); 
} 
header("Content-Disposition: attachment; filename=$fn"); 
header("Last-Modified: $ftime"); 
header("Accept-Ranges: bytes"); 
header("Content-Length: ".($fsize-$range)); 
header("Content-Range: bytes $range-".($fsize -1)."/".$fsize); 
header("Content-type: application/octet-stream"); 
print $content; 
exit; 

?> 
Serge V. Tarasov

Как сделать аттачмент к е-мейлy пpи отпpавке его с помощью фyнкции mail?

<? 
function XMail( $from, $to, $subj, $text, $filename) 
{ 
$f         = fopen($filename,"rb"); 
$un        = strtoupper(uniqid(time())); 
$head      = "From: $from\n"; 
$head     .= "To: $to\n"; 
$head     .= "Subject: $subj\n"; 
$head     .= "X-Mailer: PHPMail Tool\n"; 
$head     .= "Reply-To: $from\n"; 
$head     .= "Mime-Version: 1.0\n"; 
$head     .= "Content-Type:multipart/mixed;"; 
$head     .= "boundary=\"----------".$un."\"\n\n"; 
$zag       = "------------".$un."\nContent-Type:text/html;\n"; 
$zag      .= "Content-Transfer-Encoding: 8bit\n\n$text\n\n"; 
$zag      .= "------------".$un."\n"; 
$zag      .= "Content-Type: application/octet-stream;"; 
$zag      .= "name=\"".basename($filename)."\"\n"; 
$zag      .= "Content-Transfer-Encoding:base64\n"; 
$zag      .= "Content-Disposition:attachment;"; 
$zag      .= "filename=\"".basename($filename)."\"\n\n"; 
$zag      .= chunk_split(base64_encode(fread($f,filesize($filename))))."\n"; 

if (!@mail("$to", "$subj", $zag, $head)) 
return 0; 
else 
return 1; 
} 
?> 
Eugene Belyaev, 2:469/83.210
Hosted by uCoz