2013-05-16 79 views
4

我有两个域,例如site1.locsite2.loc。在site1.loc我有一个PHP的表单文件是这样的:PHP - 使用CURL将图像文件上传到其他域

<?php 
$c_name = ""; 
$c_phone = ""; 

if($_SERVER['REQUEST_METHOD']=="POST"){ 

    $c_name = $_POST['c_name']; 
    $c_phone = $_POST['c_phone']; 
    $c_pic = $_FILES['c_pic']['name']; // Image file 

     // submit target URL 
     $url = 'http://site2.loc/handler.php'; 

     $fields = array(
      'field1'=>$c_name, 
      'field2'=>$c_phone, 
      'field3'=>$c_pic 
     ); 

     $postvars=''; 
     $sep=''; 
     foreach($fields as $key=>$value) 
     { 
      $postvars.= $sep.urlencode($key).'='.urlencode($value); 
      $sep='&'; 
     } 


     //open connection 
     $ch = curl_init(); 

     //set the url, number of POST vars, POST data 
     curl_setopt($ch,CURLOPT_URL,$url); 
     curl_setopt($ch,CURLOPT_POST,count($fields)); 
     curl_setopt($ch,CURLOPT_POSTFIELDS,$postvars); 

     //execute post 
     $result = curl_exec($ch); 

     if(curl_errno($ch)) { 
      echo 'Error: ' . curl_error($ch); 
     } 
     else { 
      echo $result; 
     } 

     //close connection 
     curl_close($ch); 

} 


echo ' 
<form action="" method="post" enctype="multipart/form-data"> 
    Name : <input type="text" name="c_name" value="'.$c_name.'" /> <br /> 
    Phone : <input type="text" name="c_phone" value="'.$c_phone.'" /> <br /> 
    Image : <input type="file" name="c_pic" /> <br /> 
    <input type="submit" /> 
</form> 
    '; 
?> 

handler.phpsite2.loc这样的:

<?php 
ob_start(); 
if (!isset($_SESSION)) { session_start(); } 

    // CONNECT TO DB 
    $db_con = mysql_connect("localhost", "root", "root");// or die("Could not connect to db."); 
    if(!mysql_select_db("site2",$db_con)) die("No database selected."); 

    // POST 
    if(isset($_POST)){ 
     $c_name = $_POST['field1']; 
     $c_phone = $_POST['field2'];  
     $c_pic = $_POST['field3']; 

     // UPLOAD FILE 
     /* UPLOAD IMAGE CODE HERE */ 

     // INSERT TO DB 
     if(mysql_query("INSERT INTO kontak (nama, telpon) VALUES ('$c_name','$c_phone')")){ 
      echo "INSERT SUCCESS"; 
     } else { 
      echo "INSERT FAILED"; 
     } 
    } 

?> 

运行此脚本以及用于存储数据到数据库,但不能上传图像文件。任何人都可以帮我修改上面的脚本来上传图片文件吗?

以前感谢。

回答

4

在这个答案没有代码,只有一个工作流程的例子,将绕过curl

  1. 用户发布一个形式上传的文件,以“现场1”,按正常。
  2. “网站1”处理表单和上传的文件。该文件被放置在可以通过网络访问的临时目录中。
  3. 在“站点1”上,一旦上传的文件被选中,就拨打file_get_contents('http://site2.loc/pullfile.php?f=filename&sec=checkcode')的电话。 pullfile.php的内容就是这样做的,将文件从“站点1”拉到“站点2”。
  4. file_get_contents()的退货可以检查从“站点2”pullfile.php错误返回和错误,处理它。没有错误,删除临时文件。
  5. &sec=checkcode可用于确认文件已成功上载到“站点2”。它可能是文件的MD5或其他你想出来的东西。

只是一个想法。

编辑:一些示例代码,以帮助使事情更清晰,也许:]

// ---- Site 1, formprocess.php ---- 

// Your form processing goes here, including 
// saving the uploaded file to a temp dir. 

// Once the uploaded file is checked for errors, 
// you need move it to a known temp folder called 
// 'tmp'. 

// this is the uploaded file name (which you would 
// have got from the processed form data in $_FILES 
// For this sample code, it is simple hard-coded. 
$site1File = 'test.jpg'; 

$site1FileMd5 = md5_file('./tmp/'.$site1File); 

// now make a remote request to "site 2" 
$site2Result = file_get_contents('http://'.SITE_2_URL.'/pullfile.php?f='.$site1File.'&md5='.$site1FileMd5); 

if ($site2Result == 'done') { 
    unlink('./tmp/'.$site1File); 
} else { 
    echo '<p> 
     Uploaded file failed to transfer to '.SITE_2_URL.' 
      - but will be dealt with later. 
     </p>'; 
} 

,这将是现场的 'pullfile.php' 2

// ----- Site 2, pullfile.php ----- 

// This script will pull a file from site 1 and 
// place it in '/uploaded' 

// used to cross-check the uploaded file 
$fileMd5 = $_GET['md5']; 
$fileName = basename($_GET['f']); 

// we need to pull the file from the './tmp/' dir on site 1 
$pulledFile = file_get_contents('http://'.SITE_1_URL.'/tmp/'.$fileName); 

// save that file to disk 
$result = file_put_contents('./uploaded/'.$fileName,$pulledFile); 
if (! $result) { 
    echo 'Error: problem writing file to disk'; 
    exit; 
} 

$pulledMd5 = md5_file('./uploaded/'.$fileName); 
if ($pulledMd5 != $fileMd5) { 
    echo 'Error: md5 mis-match'; 
    exit; 
} 

// At this point, everything should be right. 
// We pass back 'done' to site 1, so we know 
// everything went smooth. This way, a 'blank' 
// return can be treated as an error too. 
echo 'done'; 
exit; 
+1

为什么要绕过curl? – jabbink

+0

因为不需要,有些服务器不包含curl扩展 – Tigger

+0

这个问题特别说明了使用卷曲,所以我猜Fredy在他/她的服务器上有它。 – jabbink

3

CURLOPT_POSTFIELDS要在HTTP“POST” 操作中发布的完整数据。要发布文件,请使用@预先指定文件名,并使用完整的 路径。这可以作为urlencoded字符串传递,如 'para1 = va1 & para2 = val2 & ...'或以字段名称作为键和 字段数据作为值的数组。如果value是一个数组,则Content-Type标头 将被设置为multipart/form-data。

http://php.net/manual/en/function.curl-setopt.php

代码片段:

$postvars['file'] = '@full/path/to/file.jpg'; 

$ch = curl_init(); 
curl_setopt($ch, CURLOPT_URL, $url); 
curl_setopt($ch, CURLOPT_POST, count($fields)); 
curl_setopt($ch, CURLOPT_POSTFIELDS, $postvars); 
curl_exec($ch); 
+0

我还是不明白:( – Fredy

2

你正在做的是正确的,现在将无法工作,因为您的服务器不将文件发送到远程服务器,但本地文件名(该方法来自用户)。另外,要通过CURL传输文件,您需要在名称前添加一个“@”。

$c_pic = '@'. $_FILES['c_pic']['tmp_name'] 

然后远程脚本还必须获得由$ _FILES变量的文件,并与move_uploaded_filePHP.net

而且小费某处复制:检查$_FILES['c_pic']['error']在此之前,以防止上载垃圾的远程服务器。

+0

我已经试过了,但没有成功,如果没有别的办法,我会期待的。 – Fredy

相关问题