【问题标题】:PHP MySQL: Writing file details to DB while using UploadifyPHP MySQL:使用 Uploadify 时将文件详细信息写入数据库
【发布时间】:2026-01-19 14:30:01
【问题描述】:

我正在使用 Uploadify 将文件(图像)上传到我的文件结构,然后捕获每个文件,给它一个随机数作为文件名,使用出色的 SimpleImage 脚本将其大小调整为大、中和小尺寸,保存那些到目录,丢弃原始图像,并将文件详细信息(随机数,原始名称,专辑ID等)写入数据库以供以后访问。

除了写入数据库部分之外,所有这些都可以顺利进行。我发现只有第一个文件的信息被传递到数据库,并且文件名的数字不正确。

简而言之,在多张图片上使用 Uploadify 时,如何(正确)将每个文件的信息写入数据库?

我当前的脚本:

*注意:AlbumID 由用户动态设置,并作为文件数据发布以上传。

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.';
}
}

【问题讨论】:

  • 你的数据库表结构是什么?
  • AlbumID int(11) FileName int(30) LegacyName varchar(250) FileExt varchar(11) IsDefault tinyint(1) Caption longtext (NULL) Created timestamp (NULL) Public tinyint(1)跨度>
  • @Dreadedsemicolon 顺便说一下,存储在数据库中的数字(而不是分配为新文件名的随机 10 位数字(加上专辑 ID))是 2147483647 - 32 位有符号整数的最大值。但是,相同的变量被存储在文件中没有问题:例如 14294985474-lrg.jpg

标签: php mysql uploadify


【解决方案1】:

向表中添加一个自动递增键,如果您确定您的值不会超出BIGINT 的大小,请将albumID 更改为BIGINT,但如果是,我建议您保存“ AlbumId”改为VARCHAR(30),因为它更像是一个名称而不是实际的数字键,特别是因为它看起来可以是任意长度。

我还认为,您应该使用time() 附加当前时间戳,而不是末尾的随机数,这样您就不会像具有随机数和用户输入的系统那样造成潜在的冲突。

顺便说一句,$_POST['albumId'] 通过直接用户输入.. 使您的数据库受到MySQL Injection 攻击。

【讨论】:

  • 我自己只是在回答这个问题 :) 我更改了 RandNumber() 函数给我一个 8 位数字而不是 10,然后将 $ran 转换为整数。似乎已经解决了问题。我研究了 BIGINT,但那个 zerofills(我相信),这不符合我的目的。 $_POST['albumID'] 仅以整数形式写入数据库。我觉得应该够了。我可能是错的?
  • 我认为 BIGINT 如果你告诉它,它只会填零。我仍然认为使用附加到文件的随机数是有问题的,除非您要进行数据库搜索以确保没有冲突。 ;)
  • 我试过了,因为你的论点是正确的,所以改为time() 并将 FileName 字段重组为 BIGINT(无符号)。奇怪的是,它抛出了和以前一样的问题——只解析了第一个文件,并且文件名再次存储为 2147483647。此时的问题一定出在我的表结构中,但我真的看不出在哪里......
  • ...实际上-从头开始-我看到它现在也只保存第一个文件(之前,无论如何都保存了所有文件)。
  • 最终得到以下工作解决方案。问题在于使用intval - 在我添加$albumID 之后,它已经达到极限。所以-$ran = microtime();$parts = explode(".",$ran);$ran = preg_replace( '/\s+/', '', $parts[1] );$ran = $albumID.$ran;
最近更新 更多