Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Работа с файлами / FAQ по PHP


| Главная страница FAQ по PHP | Работа с графикой >>


Оглавление

  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едостатки:

  • этот путь годится, если Вы яляетесь администратором сервера;
  • изменения коснутся всех файлов, тип которых Вы переопределили, даже тех, которые HАДО открывать в броузере.

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

Hедостатки:

  • бОльшая нагрузка на сервер;
  • бОльшие требования к объему RAM на сервере.
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

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

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

  • $cd - путь к файлу,
  • $fn - имя файла
Код:
<?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

Главная страница FAQ по PHP | Наверх

Оставить комментарий

Комментарий:
можно использовать BB-коды
Максимальная длина комментария - 4000 символов.
 

Комментарии

1.
15K
05 января 2006 года
R1+erGR1n
1 / / 05.01.2006
+3 / -0
Мне нравитсяМне не нравится
25 марта 2008, 01:34:48
Да кстати вот еще, тоже пригодиться:

Код:
if ( ! function_exists ( 'mime_content_type ' ) )

{

   function mime_content_type ( $f )

   {

       return trim ( exec ('file -bi ' . escapeshellarg ( $f ) ) ) ;

   }

}



// We'll be outputting a PDF

header('Content-type: '.mime_content_type($filename));



// It will be called downloaded.pdf

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



// The PDF source is in original.pdf

readfile($filename);
2.
15K
05 января 2006 года
R1+erGR1n
1 / / 05.01.2006
+2 / -0
Мне нравитсяМне не нравится
25 марта 2008, 01:16:05
Идите учить мат часть.

Читай документацию лучше.

Код:
<?php

// We'll be outputting a PDF

header('Content-type: application/pdf');



// It will be called downloaded.pdf

header('Content-Disposition: attachment; filename="downloaded.pdf"');



// The PDF source is in original.pdf

readfile('original.pdf');

?>
3.
1.6K
02 апреля 2003 года
Jimmy
58 / / 02.04.2003
+4 / -0
Мне нравитсяМне не нравится
17 марта 2007, 11:57:43
Существует проблема скачки файла, если URL обрабатывается через ReWrite-mode
Пример:
Есть ссылка www.site.com/download/11

Всем ясно что download это совсем на папка, a 11 - это например ID услуги.

Обработчик этой ссылки пытается выдать контент файла, который реально лежит например в
/files/docs/redstars.doc

Так вот, хотя бы по простому примеру из абзаца "Как заставить браузер предлагать сохранять файл с нужным названием, а не download.php?" - НИЧЕГО не получится в MSIE!!!
Opera и FireFox - срабатывают нормально!
А дело всё в том, что MSIE пытается взять файл по ссылке www.site.com/download/11
И ни в какую не хочет воспринимать
header("Content-Disposition: attachment; filename=redstars.doc"); (из примера "Как корректно заставить броузер скачать и записать файл вместо открытия в окне с поддержкой докачки?")
а просто в тупую пытается сохранить имя файла 11 !!!!!
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог