IMHO.WS

IMHO.WS (http://www.imho.ws/index.php)
-   Веб-программирование (http://www.imho.ws/forumdisplay.php?f=29)
-   -   Как приаттачить файл на PHP? (http://www.imho.ws/showthread.php?t=17297)

sanchos 07.12.2002 01:06

Как приаттачить файл на PHP?
 
Сабж
Блин, мучался, мучался.... нифига :( Все время файло бьет на куски и он доходит не полностью.
Помогите плиз разобраться. Заранее спасибо :)

infernal 07.12.2002 02:36

найди библиотеку для mime-types
там все очень хорошо написано

AA666 07.12.2002 03:14

В смысле приаттачить, download or upload? С диска или в мускл?

Stasik 07.12.2002 10:46

в mime... в base64 энкодишь и пошёл :)

RaZEr 07.12.2002 20:41

Если речь идет о HTTP upload'е, то нередко файлы бьются из-за отсутствия атрибута тэга form: ENCTYPE="multipart/form-data" .

Если же говорим о HTTP download, то в заголовке нужно указать Content-length, чтобы файл не обрывался раньше времени из-за плохой связи .

Вообще TCP/IP следит за целостностью передаваемой информации и можно с уверенностью утверждать, что если и бьется файл, то на одной из сторон .

sanchos 08.12.2002 22:52

Имеется ввиду приаатачить файл к письму для отправки. Как мне это правильно сделать?

RaZEr 08.12.2002 23:29

Нужно сгенерировать правильно текст писма . Для этого нужно добавить заголовки:

Content-Type: multipart/mixed; boundary="разделитель"

"разделитель" - это простая строка . Лучше всего ренерировать произвольные строки (md5,uniqid,srand и т.д.)

Далее в тело письма добавляем строки:

разделитель
Content-Type: application/octet-stream; name="любое_имя_файла"
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename="любое_имя_файла"
\n\n
сам файл (кодированный base64)
разделитель

PS: Чтобы кодировать файл base64 его необходимо открыть fopen и затем кусками по 64 символа (байта) кодировать в base64 (base64_encode) .

sanchos 09.12.2002 01:22

PHP код:

$filename "attached.txt";
$fd fopen($filename"r");
$data fread($fdfilesize($filename));
fclose($fd);
$boundary "b" md5(uniqid(time()));
$header "Content-Type: multipart/mixed; boundary = $boundary\n\n";
$data chunk_split(base64_encode($data));
$multipart "$boundary\n\n";
$multipart .= "Content-Type: application/octet-stream; name=\"$filename\"\n";
$multipart .= "Content-Transfer-Encoding: base64\n";
$multipart .=  "Content-Disposition: attachment; filename=\"$filename\"\n\n";
$multipart .= "$data\n\n$boundary\n\n";

$message $header "\nTest\n" $multipart

В $message правильно все постороил?

AA666 09.12.2002 02:21

PHP код:

$filename "codes.gif";
$fd fopen($filename"rb");
$size filesize($filename);
$data fread($fd$size);
fclose($fd);
$boundary "_" md5(uniqid(time()));
$header "\nMIME-Version: 1.0\nContent-Type: multipart/mixed; boundary=\"$boundary\"\nContent-Transfer-Encoding: 7bit";
$multipart "This is a MIME Encoded Message\n\n";
$multipart .= "--$boundary\n";
$multipart .= "Content-Type: image.gif\n";
$multipart .= "Content-Disposition: attachment; filename=\"$filename\"\n";
$multipart .= "Content-Transfer-Encoding: base64\n\n";
$multipart .= chunk_split(base64_encode($data));
$multipart .= "--$boundary--\n";

@
mail($mail_to"Test"$multipart"From: ".$mail_from.$header); 

только что проверил - работает

sanchos 09.12.2002 21:48

Да, работает и у меня. Спасибо. :)
Теперь еще пару вопросиков:
- Какие Content-Type существуют для каких спецификаций файла?
- Как приаттачить не один, а несколько файлов?
Спасибо :)

AA666 09.12.2002 22:31

- http://www.utoronto.ca/webdocs/HTMLd.../mimetype.html
- в цикле:
$multipart .= "--$boundary\n";
........
$multipart .= chunk_split(base64_encode($data));

sanchos 09.12.2002 22:51

По-поводу content-type спасибо :) Я уже лучше доки нашел.
А вот насчет цикла... Разве еще в $header ничего добавлять не надо? Если можно, то поподробнее :)
Да, и еще: как вместе с приаттаченным фалом мне текст письма послать?
Пасиб за внимание :)

RaZEr 10.12.2002 02:33

Нужно приатачить текстовый файл:

-=разделитель=-
Content-Type: text/plain; charset="koi8-r"
Content-Transfer-Encoding: 8bit
\n\n
сам_текст
-=разделитель=-

Вот пример тела сообщения (всмысле параметра для функции mail) с текстом и несколькими файлами:


-=разделитель=-
Content-Type: text/plain; charset="koi8-r"
Content-Transfer-Encoding: 8bit
\n\n
сам_текст
-=разделитель=-
Content-Type: application/octet-stream; name="имя_файла1".
Content-Transfer-Encoding: base64.
Content-Disposition: attachment; filename="имя_файла1"
\n\n
тело первого файла, кодированное base64
-=разделитель=-
Content-Type: application/octet-stream; name="имя_файла2".
Content-Transfer-Encoding: base64.
Content-Disposition: attachment; filename="имя_файла2"
\n\n
тело второго файла, кодированное base64
-=разделитель=-

sanchos 10.12.2002 21:17

Спасибо, это понятно. А про Header? Его оставляем прежним? Разделитель для кодированных файлов один и тот же?

AA666 10.12.2002 22:09

Header тот же

sanchos 10.12.2002 22:42

Все, вроде, работает :) Спасибо всем :)

sanchos 11.12.2002 01:36

Блин! Опять нифига :((
PHP код:

$filename "1.gif";
$fd fopen($filename"rb");
$size filesize($filename);
$data fread($fd$size);
fclose($fd);
$boundary "_" md5(uniqid(time()));
$header "\nMIME-Version: 1.0\nContent-Type: multipart/mixed; boundary=\"$boundary\"\nContent-Transfer-Encoding: 7bit\n";
$multipart "This is a MIME Encoded Message\n\n";
$multipart .= "--$boundary\n";
$multipart .= "Content-Type: text/plain; charset=\"koi8-r\"\nContent-Transfer-Encoding: 8bit\n\n";
$multipart .= "Hello, world!!!\n";
$multipart .= "--$boundary\n";
$multipart .= "Content-Type: $filename\n";
$multipart .= "Content-Disposition: attachment; filename=\"$filename\"\n";
$multipart .= "Content-Transfer-Encoding: base64\n\n";
$multipart .= chunk_split(base64_encode($data));
$multipart .= "--$boundary--\n";
$filename "2.gif";
$fd fopen($filename"rb");
$size filesize($filename);
$data fread($fd$size);
fclose($fd);
$multipart .= "Content-Type: $filename\n";
$multipart .= "Content-Disposition: attachment; filename=\"$filename\"\n";
$multipart .= "Content-Transfer-Encoding: base64\n\n";
$multipart .= chunk_split(base64_encode($data));
$multipart .= "--$boundary--\n";
mail("трум-пум-пум""Test"$multipart"From:" "тра-ля-ля" $header); 

В результате получаю письмо:
- с текстом все нормально
- файл только один - первый
- второй файл называется как первый, но показывает не изображение, а херню кодированную :(

Если кому не лень, разберитесь, плиз :( Я уже устал...

AA666 11.12.2002 03:13

Поменяй в середине $multipart .= "--$boundary--\n"; на $multipart .= "--$boundary\n";
два дефиса в конце должно быть только у самого последнего разделителя.

sanchos 11.12.2002 22:13

:) Просто скопировал не ту строчку.
Да, теперь приходит два файла, но с ними еще два... Они называются также, но в них просто полная белиберда какая-то :( Как с этим бороться?

RaZEr 12.12.2002 02:29

Честно говоря, не видя поправленного кода сложно что-либо говорить, но сразу бросается в глаза:
PHP код:

$multipart .= "Content-Type: $filename\n"

... если ты атачишь GIF, то нужно писать "image/gif", а не имя файла .

sanchos 12.12.2002 02:50

Ох я и идиот :) Думал, что в принципе от этого ничего не изменится... Ошибался :)

Теперь все работает :)))

RaZEr, AA666, Огромное Вам спасибо!


Часовой пояс GMT +4, время: 17:12.

Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.