Send 2 Different Content Types in 1 Http Request - How?

Discussion in 'PHP' started by phplife, May 6, 2008.

  1. #1
    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
     
    phplife, May 6, 2008 IP
  2. LogicFlux

    LogicFlux Peon

    Messages:
    2,925
    Likes Received:
    102
    Best Answers:
    0
    Trophy Points:
    0
    #2
    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.
     
    LogicFlux, May 6, 2008 IP
  3. phplife

    phplife Peon

    Messages:
    36
    Likes Received:
    1
    Best Answers:
    0
    Trophy Points:
    0
    #3
    Thanks for the suggestion, looked into it and tested. Unfortunately for me it didn't work.

    phplife
     
    phplife, May 6, 2008 IP
  4. dataman

    dataman Peon

    Messages:
    94
    Likes Received:
    8
    Best Answers:
    0
    Trophy Points:
    0
    #4
    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:
     
    dataman, May 6, 2008 IP
  5. phplife

    phplife Peon

    Messages:
    36
    Likes Received:
    1
    Best Answers:
    0
    Trophy Points:
    0
    #5
    thanks dataman, will give it a go, since my initial approach of using multipart just won't work across all browsers, especially IE.

    phplife
     
    phplife, May 12, 2008 IP