Передача файла с помощью PHP на другой сервер, возвращающий «Внутренняя ошибка сервера» - PullRequest
0 голосов
/ 20 октября 2011

У меня странная проблема с 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>";
*/

?>

1 Ответ

0 голосов
/ 20 октября 2011

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']);
}

Коды ошибок документированы здесь . Обратите внимание, что ваш код также не проверяет наличие конфликтов файлов - он автоматически перезаписывает любой существующий файл загруженным файлом.

...