0

サーバーに画像をアップロードするためのスクリプトを作成しました。ユーザーは、アバターや作品のアップロードなどに使用できます。

これは functions.php の関数です

function save_image($image, $uploadedfile)
{

error_reporting(0);

$change="";
$abc="";


 define ("MAX_SIZE","40000");
 function getExtension($str) {
         $i = strrpos($str,".");
         if (!$i) { return ""; }
         $l = strlen($str) - $i;
         $ext = substr($str,$i+1,$l);
         return $ext;
 }

 $errors=0;


    if ($image) 
    {

        $filename = stripslashes($image);

        $extension = getExtension($filename);
        $extension = strtolower($extension);


 if (($extension != "jpg") && ($extension != "jpeg") && ($extension != "png") && ($extension != "gif")) 
        {

            $change='<div class="msgdiv">Unknown Image extension </div> ';
            $errors=1;
        }
        else
        {

 $size=filesize($uploadedfile);


if ($size > MAX_SIZE*1024)
{
    $change='<div class="msgdiv">You have exceeded the size limit!</div> ';
    $errors=1;
}


if($extension=="jpg" || $extension=="jpeg" )
{
$uploadedfile = $uploadedfile;
$src = imagecreatefromjpeg($uploadedfile);

}
else if($extension=="png")
{
$uploadedfile = $uploadedfile;
$src = imagecreatefrompng($uploadedfile);

}
else 
{
$src = imagecreatefromgif($uploadedfile);
}

echo $scr;

list($width,$height)=getimagesize($uploadedfile);


$newwidth=$width;
$newheight=$height;
$tmp=imagecreatetruecolor($newwidth,$newheight);


imagecopyresampled($tmp,$src,0,0,0,0,$newwidth,$newheight,$width,$height);


$filename = "images/vcard_images/". $image;



imagejpeg($tmp,$filename,100);

imagedestroy($src);
imagedestroy($tmp);
imagedestroy($tmp1);
}}


}

これで、ページ create.php に 6 つの作品をアップロードできるフォームができました。そのため、ハード ドライブから 6 つのファイルを選択し、[保存] をクリックします。次に、次のように関数を 6 回呼び出します。

$work1 = $_FILES["work1"]["name"];
save_image($_FILES["work1"]["name"], $_FILES['work1']['tmp_name']);

$work2 = $_FILES["work2"]["name"];
save_image($_FILES["work2"]["name"], $_FILES['work2']['tmp_name']);

$work3 = $_FILES["work3"]["name"];
save_image($_FILES["work3"]["name"], $_FILES['work3']['tmp_name']);

$work4 = $_FILES["work4"]["name"];
save_image($_FILES["work4"]["name"], $_FILES['work4']['tmp_name']);

$work5 = $_FILES["work5"]["name"];
save_image($_FILES["work5"]["name"], $_FILES['work5']['tmp_name']);

$work6 = $_FILES["work6"]["name"];
save_image($_FILES["work6"]["name"], $_FILES['work6']['tmp_name']);

しかし奇妙なことに、SAVE を押すと、ページが真っ白になってしまいます。そして、関数を1回だけ呼び出すと、次のようになります:

$work1 = $_FILES["work1"]["name"];
save_image($_FILES["work1"]["name"], $_FILES['work1']['tmp_name']);

それは完全に正常に動作します..

私が間違っているのかわかりません..

敬具

編集:

エラー報告は私にこれを教えてくれました:

Notice: Constant MAX_SIZE already defined in /Applications/XAMPP/xamppfiles/htdocs/vcard2/user/functions.php on line 11

Fatal error: Cannot redeclare getExtension() (previously declared in /Applications/XAMPP/xamppfiles/htdocs/vcard2/user/functions.php:12) in /Applications/XAMPP/xamppfiles/htdocs/vcard2/user/functions.php on line 12
4

5 に答える 5

2

入力エラーがあります: echo $src の代わりに echo $scr

于 2012-10-08T09:58:41.280 に答える
0

あなたのエラーは2つに分かれていますが、同じ理由で発生しています:

Notice: Constant MAX_SIZE already defined in /Applications/XAMPP/xamppfiles/htdocs/vcard2/user/functions.php on line 11

関数内に DEFINE を記述します。最初に実行すると正常に動作しますが、2 回目は既に定義されています。関数の外に DEFINE を移動しますsave_image

Fatal error: Cannot redeclare getExtension() (previously declared in /Applications/XAMPP/xamppfiles/htdocs/vcard2/user/functions.php:12) in /Applications/XAMPP/xamppfiles/htdocs/vcard2/user/functions.php on line 12

このエラーについても同様です。関数が関数 getExtention を実行する秒数が再クリアされます。関数を外側に移動するsave_imageと、期待どおりに機能するはずです。

于 2012-10-08T10:24:37.300 に答える
0

関数にdefineステートメントが含まれています。これは関数を呼び出すたびに実行されますがdefine、既存の定数を再定義しようとすると失敗します。

代わりに、このdefineステートメントを関数の外に配置します。

その関数についても同じ話getExtensionです。なぜ別の関数内でそれを行っているのか、私にはわかりません。しないでください。

于 2012-10-08T10:25:15.960 に答える
0

複数のファイルのアップロードとドラッグ アンド ドロップ システムを管理する HTML5 の FILE API をご覧になることをお勧めします。試してみたい場合は、次の 2 つの推奨スクリプトを使用します。

http://blueimp.github.com/jQuery-File-Upload/

https://github.com/weixiyen/jquery-filedrop

私はそれらの両方を試してみましたが、それらはいいです

于 2012-10-08T10:05:39.670 に答える
0

getExtension関数を関数の外に移動しsave_imageます。

PHP のネストされた関数は、関数の「プライベート」スコープにバインドされず、グローバル関数テーブルに入ります。また、(グローバル) 関数を redclare することはできません。

本当に関数をネストしたい場合は、宣言されていない場合にのみ宣言します。

if (!function_exists('getExtension')) { function getExtension(){...}}  

defineStatement も関数の外に移動するか、条件付きにすることを検討する必要があります。

if (!defined('MAX_SIZE')) { define('MAX_SIZE', 1024); }

issetまた、またはでRequestvars を確認することもできますempty。ループで:

foreach (range(1,7) as $num) { 
  if (!empty($_FILES['work'.$num]['tmp_name'])) { 
    save_image($_FILES["work".$num]["name"], $_FILES['work'.$num]['tmp_name']); 
  } 
}
于 2012-10-08T10:44:33.780 に答える