【问题标题】:Rename file using its id from database使用数据库中的 id 重命名文件
【发布时间】:2015-11-02 18:34:32
【问题描述】:

我正在使用原始名称上传图像文件。我将文件路径等上传到数据库,每个图像在数据库中都有一个唯一的 ID。直到这里一切正常。

现在,我想为上传的图像文件提供数据库表中的唯一 ID 作为名称。 (例如,如果图像 id 为 1,我希望文件被称为 1.jpg 等等。)我无法让它工作。

我不工作的方法:

数据库表

 TABLE `images`
 `image_id` INT(11) unsigned NOT NULL AUTO_INCREMENT,
 `user_id` INT(11) unsigned NOT NULL COMMENT 'FOREIGN KEY referencing the user_id of the user, who uploaded the images',
 `image_name` VARCHAR(64) NOT NULL,
 `image_path` VARCHAR(64) NOT NULL,
 `image_upload_timestamp` TIMESTAMP NOT NULL ON UPDATE CURRENT_TIMESTAMP,
 PRIMARY KEY (`image_id`);

使用原始名称(工作)将图像写入数据库的脚本:

$database = DatabaseFactory::getFactory()->getConnection();

$sql = "INSERT INTO images VALUES ('', :user_id, :image_name, :image_path, :image_upload_timestamp)";
$query = $database->prepare($sql);

$query->execute(array(':user_id' => Session::get('user_id'), 
                      ':image_name' => $file_name, 
                      ':image_path' => $file_destination, 
                      ':image_upload_timestamp' => time()));

ImageModel::renameImage($image_id);

renameImage 方法(不起作用!)

public static function renameImage($image_id)
    {   
        $database = DatabaseFactory::getFactory()->getConnection();

        $query = $database->prepare("SELECT * FROM images WHERE image_id = :image_id AND user_id = :user_id");
        $query->execute(array(':image_id' => $image_id, ':user_id' => Session::get('user_id')));

        $img_id = $query->fetch();

        // Convert array to string
        $file_name = $img_id->image_id;

        $image_name = $file_name . '.jpg';


        $sql = "UPDATE images SET image_name = :image_name WHERE :image_id = $image_id";
        $sth = $database->prepare($sql);

        $sth->execute(array(':image_name' => $image_name));
    }



我对此真的很陌生,非常感谢任何帮助!非常感谢!

【问题讨论】:

  • 您遇到错误了吗?
  • 不,文件以原始名称上传,就像 renameImage 方法不存在一样。

标签: php mysql sql file-upload


【解决方案1】:

你也不需要在这个函数中剩下的东西。该函数只改变了数据库中的图片名称,而不是上传的图片名称。

public static function renameImage($image_id)
    {   
        $database = DatabaseFactory::getFactory()->getConnection();
        $file_name = $img_id->image_id;
        $image_name = $image_id. '.jpg';
        $sql = "UPDATE images SET image_name = :image_name WHERE image_id = :image_id";
        $sth = $database->prepare($sql);

        $sth->execute(array(':image_name' => $image_name,
                                ':image_id' =>  $img_id ));
    }

【讨论】:

  • 谢谢!不幸的是,这并没有解决问题。我有同样的结果。
  • 这个函数只处理DB。它不会更改上传的图像文件的名称。要更改上传图片名称,您必须重命名文件名,请遵循此php.net/manual/en/function.rename.php
  • 我没有意识到这一点,尽管这很明显。谢谢!但是,它不会更改数据库中的名称。
  • 是的!要更改数据库中的名称,您可以按照我上面写的函数。
  • 我试过了。不幸的是,它不起作用。我想我没有从任何地方获取 image_id。非常感谢您到目前为止的帮助!
【解决方案2】:

好的,您显示的代码中与文件没有任何关系,假设您正在其他地方进行文件上传,您只需要使用http://php.net/manual/en/function.rename.php

rename($img_id->image_path.$img_id->image_path, $img_id->image_path.$image_name);

$sql = "UPDATE images SET image_name = :image_name WHERE image_id = :image_id";
$sth = $database->prepare($sql);

$sth->execute(array(':image_name' => $image_name,
                    ':image_id' =>  $img_id ));

【讨论】:

  • 还是一样的结果。图片以原始名称上传。
  • 你说“图片是用它们的原始名称上传的”你是在说你服务器中的文件吗?
猜你喜欢
  • 2016-05-20
  • 1970-01-01
  • 2020-07-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-21
  • 1970-01-01
  • 2018-03-28
相关资源
最近更新 更多