2

基本的に、私がしなければならないことは、HTTP 投稿を取得し、ファイルを最初のサーバーに保存してから、その投稿を 2 番目のサーバーに転送してファイルを再度保存し、ファイルが添付された電子メールを生成することです。現在、投稿を2番目のサーバーに送信する場所で機能しており、メールを作成して送信するため、問題はありません.

ただし、そこに最初のサーバーを追加しようとすると、まったく送信できなかったり、意味のある結果を出力したりできません。送受信スクリプトのコードは次のとおりです。

<?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 ポスト リクエストを送信すると、次のように出力されます。

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>

受信する 2 番目のサーバーのコードは、サイトを変更した場合に上記のコードで動作します。これは次のとおりです。

<?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 を使用して自分のメールアドレスにメールを送信する単なるスクリプトです。

4

1 に答える 1

0

$_FILES と curl ポストの構造が異なります - 私は約 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'];
            }
        }
    }
}
于 2013-11-14T23:18:01.993 に答える