簡體   English   中英

處理圖片以上傳產品

[英]Handling images for product upload

我正在為我的項目使用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行上執行更新以添加圖像鏈接,然后將文件重命名為我想要的文件。

是否有處理這種情況的最佳實踐?

在這種情況下,您應該將文件上傳與其他字段一樣對待。

基於您描述的方法:

  1. 用戶仍然填寫該字段(選擇要上傳的文件)
  2. 該字段仍由您的PHP代碼驗證和處理,有可能返回給用戶以修復其錯誤
  3. 驗證成功后,字段數據仍存儲在服務器端
    1. 在您的數據庫中創建新記錄
    2. 檢索新添加的行的ID( MySQLI / PDO
    3. 使用此ID將臨時文件復制到其新位置(如果需要,則創建文件夾)

在這種情況下,您需要做出的唯一決定就是將上傳的臨時文件復制到新位置時如何處理失敗,而做到這一點的最佳方法之一就是利用事務。

如果上載的臨時文件的副本失敗,則可以使用事務( codeigniter事務文檔 )輕松回滾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 然后,在發生任何故障時,該故障也將回滾。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM