Як приточити файл на PHP Веб-програмування

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

Якщо ж говоримо про HTTP download, то в заголовку потрібно вказати Content-length, щоб файл не обривався раніше через поганий зв'язок .

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

Потрібно правильно згенерувати текст листа. Для цього потрібно додати заголовки:

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) .

$filename = "attached.txt"; $fd = fopen ($ filename, "r"); $ data = fread ( $ fd , filesize ( $ 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$межа\n\n" ;

$message = $header . "\nТест\n" . $multipart ;

$filename = "codes.gif" ; $fd = fopen ( $filename , "rb" ); $size = розмір файлу ( $filename ); $data = fread ($fd, $size); fclose ( $fd ); $boundary = "_" . md5 ( uniqid ( час ())); $header = "\nMIME-Version: 1.0\nContent-Type: multipart/mixed; boundary=\"$boundary\"\nContent-Transfer-Encoding: 7bit" ; $multipart = "Це повідомлення в кодуванні MIME\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 , "Тест" , $multipart , "Від: " . $mail_from . $header );

Потрібно притачити текстовий файл:

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

Ось приклад тіла повідомлення (всього параметра для функції пошти) з текстом і кількома файлами:

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