用PHP将文件传输到另一个服务器返回“内部服务器错误”


File transfer with PHP to another server returning "Internal Server Error"

我遇到了一些奇怪的PHP问题。我有一个PHP脚本,执行文件上传到我的服务器和他们,将其传输到远程服务器。代码在工作时是正确的。问题是它并不总是有效。大多数时候,它只是返回一个内部服务器错误。我的错误日志只是说它发生了一个错误404,但我不做任何"头"命令。它只是将一些HTML和Javascript回传给Iframe。当错误发生时,文件在远程服务器上被切断,所以我真的不知道错误发生在哪里。我猜这是我的服务器上的一些配置错误,因为我在MAMP中尝试了相同的脚本,它工作得很好,没有问题。谁能至少帮我一下,弄清楚它抛出的错误,让我知道从哪里开始?

我知道这有点简单,但我只是没有太多的经验与PHP我与其他语言。

下面是我的代码:

<?php
//Uploads a file
$target_path = "uploadedMp3/";
$target_path = $target_path . basename($_FILES['uploadedfile']['name']); 
$returnMessage = '';
if(move_uploaded_file($_FILES['uploadedfile']['tmp_name'], $target_path)) 
{
    //FTP the file to VM Link
    $ftp_ip         = MY_IP;
    $ftp_username = MY_USER_NAME;
    $ftp_password = MY_PASSWORD;
    if($ftp=ftp_connect($ftp_ip,21,3600))
    {
        if(ftp_login($ftp,$ftp_username,$ftp_password))
        {
            // Set to PASV mode
            ftp_pasv( $ftp, 1);

            ftp_chdir($ftp,"/mp3/");

            // Send the file
            //set_time_limit(-1);       // PHP won't timeout
            //ignore_user_abort(true);
            ini_set('upload_max_filesize', '50M'); 
            ini_set('post_max_size', '50M');  
            $upload = ftp_put($ftp, $_FILES['uploadedfile']['name'],$target_path ,  FTP_BINARY); 

            $returnMessage .= "0##The file has been uploaded";
        }
        else
        {
            $returnMessage .= "-1##Ocorreu um erro de conexão com o servidor remoto. Entre em contato com a Mobilevel para mais informações.(1)";
        }
        ftp_close($ftp);
    }
    else
    {
         $returnMessage .= "-1##Ocorreu um erro na conexão com o servidor remoto. Entre em contato com a Mobilevel para mais informações.(2)";
    }
} 
else
{
    $returnMessage .= "-1##Ocorreu um erro no Upload, tente novamente. Se o problema persistir entre em contato com a Mobilevel.";
}
unlink($target_path);
echo "<html><head>";
echo "<scr";
echo "ipt type='"text/javascript'">parent.uploadCallback('" . $returnMessage . "');</scr";
echo "ipt>";
echo "</head><body>";
echo "</body></html>";
/*
echo "<scr";
echo "ipt type='"text/javascript'">parent.uploadCallback('" . $returnMessage . "');</scr";
echo "ipt></html>";
*/
?>

500个内部错误被记录在服务器的错误日志中。去那里看看到底是什么爆炸了。

但是,请注意

        ini_set('upload_max_filesize', '50M'); 
        ini_set('post_max_size', '50M');  

在文件上传处理脚本中是无用的。在上传完成(或失败)之前,这些指令所在的脚本不会执行。当PHP实际将控制权交给脚本时,上传已经完成或失败了。

这些覆盖必须在.htaccess/httpd.conf级别的php_value指令中完成,或者在php.ini中完成。

你也没有检查上传是否成功。如果由于任何原因失败,则move_uploaded_file()命令将失败,因为没有文件可移动

至少,你的脚本应该这样开头:
if ($_FILES['uploadedfile']['error'] !== UPLOAD_ERR_OK) {
   die("Upload failed with error code " . $_FILES['uploadedfile']['error']);
}

错误代码记录在这里。请注意,您的代码也不会检查任何文件冲突-它将静默地用上传的文件覆盖任何现有文件。