What I'm trying to do is send both an image and text on one http request. I've tried multipart/mixed using boundaries. ob_start(); header('Content-Type: multipart/mixed; boundary=unique-boundary-1'); header('--unique-boundary-1'); $filename = 'a.jpg'; header("Content-Type: image/jpeg", false); $im = imagecreatefromjpeg($filename); imagejpeg($im); imagedestroy($im); header('--unique-boundary-1'); header('Content-Type: text/html', false); echo <<<YYY <html><body> <center>Hello - This Mime part should display while, or following the file Download</center> </body></html> YYY; header('--unique-boundary-1--'); ob_end_flush(); Code (markup): Which doesn't work (in FF/IE/OP). Instead of getting the image displayed with text, I get the image file content because the Content-Type: text/html seems to over write the image content type header. I know it can be done with two http requests, but looking to do it from an href link. Please note, this is not for an email client, just a regular browser. Can it be done? Any help is appreciated. phplife
Have you read about the HTTP Accept field? I'm not sure but I think maybe a special parameter has to be sent in order for the client to receive multipart content. I'm not sure what the parameter is, though. Here's what my FF is sending on a regular html request: Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5 Is that good enough to accept multipart content? I don't know, but something to investigate. If this is the source of the problem then it's a client side issue and there probably isn't a way around it.
Here is simple script.... look at the $form array (); to understand how to set the values <?php function send_post ( $host, $form_data, &$code, &$string ) { $data = ''; $part = parse_url ( $host ); if ( empty ( $part['path'] ) ) { $part['path'] = '/'; } if ( ( $io = fsockopen ( $part['host'], 80, $code, $string, 5 ) ) !== false ) { $temp = "--_" . md5 ( uniqid ( microtime () ) ); $send = "POST " . $part['path'] . " HTTP/1.1\r\n"; $send .= "Host: $part['scheme'] . "://" . $part['host'] . "\r\n"; $send .= "Referer: " . $part['scheme'] . "://" . $part['host'] . $part['path'] . "\r\n"; $send .= "User-Agent: Mozilla/4.0 (compatible; MSIE 5.01; Windows NT)\r\n"; $send .= "Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,video/x-mng,image/png,mage/jpeg,image/gif;q=0.2,text/css,*/*;q=0.1\r\n"; $send .= "Accept-Encoding: gzip, deflate, compress;q=0.9\r\n"; $send .= "Accept-Language: en-us, en;q=0.50\r\n"; $send .= "Content-Type: multipart/form-data; boundary=" . $temp . "\r\n"; foreach ($form_data AS $k => $v ) { if ( $v['file'] ) { $data .= "--" . $temp . "\r\n"; $data .= "Content-Disposition: form-data; name=\"" . $v['input'] . "\"; filename=\"" . $v['name'] . "\"\r\n"; $data .= "Content-Type: " . $v['mime'] . "\r\n"; $data .= "Content-Transfer-Encoding: base64\r\n\r\n"; $data .= chunk_split ( base64_encode ( readfile ( $v['path'] ) ) ) . "\r\n"; } else { $data .= "--" . $temp . "\r\n"; $data .= "Content-Disposition: form-data; name=\"" . $v['input'] . "\"\r\n\r\n"; $data .= $v['value'] . "\r\n"; } } $data .= "--" . $temp . "--\r\n"; $send .= "Content-Length: " . strlen ( $data ) . "\r\n\r\n"; $send .= $data; $data = ''; fputs ( $io, $send ); unset ( $form_data, $k, $send, $temp, $v ); while ( ! feof ( $io ) ) { $data .= fgets ( $io, 4096 ); } fclose ( $io ); unset ( $io ); } else { $data = false; } unset ( $part ); return $data; } // uri, to post data to $uri = 'http://localhost/upload.php'; // error code container $code = 0; // error string container $string = ''; // the form data array $form = array ( /* input type text */ 0 => array ( 'file' => false, 'name' => '', 'mime' => '', 'path' => '', 'input' => 'name', 'value' => 'printf' ), /* input type text */ 1 => array ( 'file' => false, /* this is not a file input */ 'name' => '', 'path' => '', 'mime' => '', 'input' => 'zipcode', /* the name of the form input */ 'value' => '02112' /* the value of the form input */ ), /* input type file */ 2 => array ( 'file' => true, /* this is a file input */ 'name' => '28-funny-warning.jpg', /* the file you are posting */ 'path' => 'f:/www/docs/28-funny-warning.jpg', /* the local system path to file */ 'mime' => 'image/jpeg', /* the file mime type */ 'input' => 'upload', /* the name of the form input */ 'value' => '' /* the value of the form input (always empty for file inputs) */ ) ); /* run it */ $out = send_post ( $url, $form, $code, $string ); if ( is_bool ( $out ) ) { echo "Error: (" . $code . "), " . $string . "\r\n"; } else { echo nl2br ( $out ); } ?> PHP:
thanks dataman, will give it a go, since my initial approach of using multipart just won't work across all browsers, especially IE. phplife