2013-11-14 31 views
2

本質上,我要做的就是取一個HTTP Post,並將該文件保存在第一個服務器上,然後將該文章轉發到第二個服務器,該服務器再次保存該文件然後以該文件作爲附件生成一封電子郵件。目前,我已經將它發送到第二臺服務器,並創建了電子郵件併發送出去,所以這不是問題。

但是,當我嘗試添加第一臺服務器時,無法發送它,或打印出有意義的結果。下面是代碼發送/接收腳本:

<?php 
$uploaddir = '/home/www/myfirstsite.com/3d/'; 
$uploadname = basename($_FILES['file']['name']); 
$uploadfile = $uploaddir . $uploadname; 


if (move_uploaded_file($_FILES['file']['tmp_name'], $uploadfile)) { 
     echo "OK\n"; 
} else { 
    echo "ERROR\n"; 
} 
echo "<br>"; 

$url = 'http://mysecondsite.com:12345/receive_scan.php'; 
//I use port 12345 because most of the important ports are being used already. 
$ch = curl_init(); 
curl_setopt($ch, CURLOPT_URL, $url); 
curl_setopt($ch, CURLOPT_POST,1); 
curl_setopt($ch, CURLOPT_POSTFIELDS, $_FILES); 
curl_setopt($ch, CURLOPT_FAILONERROR,true); 
$result='Result: '.curl_exec ($ch); 

echo $result; 
echo curlerrno($ch); 
echo curlerror($ch); 
curl_close ($ch); 

目前,當我發送一個HTTP POST請求,它打印出這一點:

OK 
Result: 

,我用它來發送HTTP張貼代碼要求是這樣的:

<html><body> 
<form enctype="multipart/form-data" action="http://myfirstsite.com/receive_scan.php" method="POST"> 
<input type="hidden" name="MAX_FILE_SIZE" value="100000" /> 
Choose a file to upload: <input name="file" type="file" /><br /> 
<input type="submit" value="Upload File" /> 
</form> 

接收第二服務器,上面這個代碼的工作,如果我只是更改網站上的代碼,是這樣的:

<?php 
$uploaddir = './scans/'; 
$uploadname = basename($_FILES['file']['name']); 
$uploadfile = $uploaddir . uploadname; 

echo "File Received\n"; 
if (move_uploaded_file($_FILES['file']['tmp_name'], $uploadfile)) { 
    echo "OK\n"; 
} else { 
    echo "ERROR\n"; 
} 
shell_exec("bash sendmail.bash ".$uploadfile." ".$uploadname); 
?> 

sendmail.bash只是一個使用msmtp發送電子郵件到我的電子郵件的腳本。

回答

0

$ _FILES和捲曲後的結構是不同的-I've大約3年前打這個問題,我花了3天左右來解決:

function arraysToBrackets($array, $prefix, $level=0){ 

    $resarr = array(); 
    foreach ($array as $field => $data){ 
     if (is_array($data)){ 
      $resarr = array_merge($resarr, arraysToBrackets($data, 
        ($prefix?$prefix.'['.$field.']':$field),$level+1)); 
     }else{ 
      if ($level > 0){ 
       $resarr[$prefix.'['.$field.']'] = $data; 
      }else{ 
       $resarr[$prefix.$field] = $data; 
      } 
     } 
    } 
    return $resarr; 
} 

$postThrough = arraysToBrackets($_POST); 

if ($_FILES){ 

    foreach ($_FILES as $file => $details){ 
     if (is_array($details['name'])){ 
      foreach ($_FILES[$file]['name'] as $file2 => $details2){ 
       if ($_FILES[$file]['tmp_name'][$file2]){ 
        $postThrough[$file.'['.$file2.']'] = '@'.$_FILES[$file]['tmp_name'][$file2]; 
       } 
      } 
     }else{ 
      if ($details['tmp_file']){ 
       $postThrough[$file] = '@'.$details['tmp_file']; 
      } 
     } 
    } 
}