0

Uploadifyを使用してファイル(画像)をファイル構造にアップロードしてから、各ファイルをキャッチし、ファイル名としてランダムな番号を付け、優れたSimpleImageスクリプトを使用してサイズを変更し、大、中、小のサイズに保存します。ディレクトリ、元の画像を破棄し、後でアクセスできるようにファイルの詳細(ランダム番号、元の名前、アルバムIDなど)をデータベースに書き込みます。

これらはすべて、DB部分への書き込みを除いて問題なく機能しています。最初のファイルの情報のみがDBに渡され、ファイル名として間違った番号が使用されていることがわかりました。

つまり、複数の画像でUploadifyを使用している場合、各ファイルの情報をデータベースに(正しく)書き込むにはどうすればよいですか?

私の現在のスクリプト:

*注:AlbumIDはユーザーによって動的に設定され、uploadifyのファイルデータとして投稿されます。

require_once '../../functions.php';
require_once '../../conn.php';

//defaults
$uploadify_path = '/contents/uploads/gallery/';
$albumID = $_POST['AlbumID'];

//Define a destination
$targetPath = $_SERVER['DOCUMENT_ROOT'] . $_POST['path']; // Relative to the root

if (!empty($_FILES)) {
$tempFile = $_FILES['Filedata']['tmp_name'];
$targetFile = $targetPath . $_FILES['Filedata']['name'];
include($_SERVER['DOCUMENT_ROOT'].'/includes/SimpleImage.php');

// Validate the file type
$fileTypes = array('jpg','jpeg','gif','png'); // File extensions
$fileParts = pathinfo($_FILES['Filedata']['name']);

if (in_array($fileParts['extension'],$fileTypes)) {
    $ran = $albumID.RandNumber(10);
    $location=$targetPath.$ran;

    $LegacyName = $fileParts['filename'];
    $FileExt = $fileParts['extension'];

    if(is_numeric($albumID)) {
        $q = "INSERT INTO gallery_meta (AlbumID, FileName, LegacyName, FileExt, IsDefault, Public)
                VALUES ('$albumID','$ran','$LegacyName','$FileExt','0','1')";
        $r= mysql_query($q);
        mysql_free_result($r);
    }

    move_uploaded_file($tempFile,$targetFile);

    list($width, $height, $type, $attr) = getimagesize($targetFile);

    $image = new SimpleImage();
    $image->load($targetFile);

    if( $height >= 901 ) {
        $image->resizeToHeight(900);
        $image->save($location.'-lrg.'.$FileExt);
        $image->resizeToHeight(550);
        $image->save($location.'-med.'.$FileExt);
        $image->resizeToHeight(200);
        $image->save($location.'-sm.'.$FileExt);
        unlink($targetFile);
    }
    elseif(( $height  >= 551 )&&( $height <= 900 )) {
        $image->save($location.'-lrg.'.$FileExt);
        $image->resizeToHeight(550);
        $image->save($location.'-med.'.$FileExt);
        $image->resizeToHeight(200);
        $image->save($location.'-sm.'.$FileExt);
        unlink($targetFile);
    }
    elseif(( $height >= 201 )&&( $height <= 550 )) {
        $image->save($location.'-lrg.'.$FileExt);
        $image->save($location.'-med.'.$FileExt);
        $image->resizeToHeight(200);
        $image->save($location.'-sm.'.$FileExt);
        unlink($targetFile);
    }
    if( $height  <= 200 ) {
        $image->save($location.'-lrg.'.$FileExt);
        $image->save($location.'-med.'.$FileExt);
        $image->save($location.'-sm.'.$FileExt);
        unlink($targetFile);
    }

    echo '1';
} else {
    echo 'Invalid file type.';
}
}
4

1 に答える 1

0

テーブルに自動インクリメントキーを追加し、BIGINT値がのサイズをオーバーフローしないことが確実な場合は、albumIDをaに変更しますが、値がオーバーフローする場合は、代わりにBIGINT「AlbumId」を保存することをお勧めします。VARCHAR(30)特に任意の長さにすることができるように見えるので、実際の数字キーよりも名前の。

また、最後に乱数の代わりに、を使用して現在のタイムスタンプを追加する必要があるとtime()思います。これにより、乱数とユーザー入力を使用するシステムのように衝突の可能性が生じないようになります。

また、偶然にも$_POST['albumId']、ユーザーが直接入力することにより、データベースがMySQLインジェクション攻撃にさらされたままになります。

于 2012-07-15T14:58:32.367 に答える