【问题标题】:Handling images for product upload处理产品上传的图像
【发布时间】:2014-07-08 01:44:09
【问题描述】:

我正在为我的项目使用 CodeIgniter。

我有一个产品上传表单,用户将在其中提供标题、类别、描述等。该产品是数字下载的,因此他们也会上传。它是 PDF 或 .DOC。接下来,该表单使用户能够上传图片来代表他们的产品并帮助他们在网站上进行营销。提交后,表单会将大量内容存储到数据库中,包括作为主键的 auto_increment 上的项目 ID、产品图像的链接以及实际产品本身的链接(PDF 或 DOC)。用户只能为每个产品(或数据库中的每一行)拥有 1 个图像文件和 1 个产品文件。

我想创建一个简单的文件夹结构来处理上传。我在想这样的例子:

/Users/JohnDoe/Products/*/Product.pdf

/Users/JohnDoe/Products/*/Image.jpg

星号是项目 ID。

这是我无法弄清楚的问题。直到表单实际提交并通过验证,然后 MySQL auto_increment 计数器命中,才会生成项目 ID。在那之前我必须上传我的图片和产品,因为我也需要对它们进行表单验证。例如,我需要确保用户实际上是在上传 .PDF 文件而不是其他文件。

我是否应该继续提交表单,然后以我可以访问项目 ID 的方式对文件上传进行验证?如果文件上传验证失败,则删除新提交的项目数据。如果文件上传验证通过,请在 MySQL 行上更新以添加图像链接,然后将文件重命名为我想要的。

有处理这种情况的最佳实践吗?

【问题讨论】:

    标签: php mysql forms codeigniter


    【解决方案1】:

    在这种情况下,您应该将文件上传与另一个字段区别对待。

    基于您描述的方法:

    1. 该字段仍由用户填写(选择要上传的文件)
    2. 该字段仍由您的 PHP 代码验证和处理,可能会返回给用户以修复他们的错误
    3. 验证成功后,字段数据仍存储在服务器端
      1. 在您的数据库中创建新记录
      2. 获取新增行的ID(MySQLI/PDO
      3. 使用此 ID 将临时文件复制到新位置(如果需要,创建文件夹)

    在这种情况下,您需要做出的唯一决定是在将上传的临时文件复制到新位置时如何处理失败,最好的方法之一是利用事务。

    如果上传的临时文件的副本失败,您可以使用事务 (codeigniter transaction documentation) 轻松回滚您的 INSERT

    免责声明我没有测试过这段代码,只是为了给你一个关于流程的想法。

    $this->db->trans_begin();
    
    $data = array(
       'title' => 'My title' ,
       'name' => 'My Name' ,
       'date' => 'My date'
    );
    
    $this->db->insert('mytable', $data); 
    
    // COPY UPLOADED FILE HERE, USING $this->db->insert_id(); to get the ID.
    // Use a variable such as $file_copy_success to store true/false based on result of the copy
    
    if ($this->db->trans_status() === FALSE && $file_copy_success === FALSE)
    {
        $this->db->trans_rollback();
    }
    else
    {
        $this->db->trans_commit();
    }
    

    所以在这个例子中会发生以下情况

    1. 交易开始
    2. INSERT 已尝试
    3. insert_id 检索
    4. 将上传的临时文件复制到新家
    5. 在失败回滚时INSERT 查询。
    6. 成功后,提交INSERT查询

    如果您发现在插入的新行旁边有您需要的文件中的特定信息,请在文件副本和成功/失败测试之间运行UPDATE。然后在任何失败时,它也将被回滚。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-11-22
      • 2012-03-12
      • 2015-10-05
      • 1970-01-01
      • 1970-01-01
      • 2017-02-14
      • 1970-01-01
      相关资源
      最近更新 更多