2013-10-02 117 views
1

我有一個ASP.NET(4.5)網站。使圖像路徑唯一

下面的這個按鈕命令插入僱員名,employeelastname,employeephoto到圖像文件夾和imagepath到db。

我想讓圖像路徑自動uniquename +擴展;

string filepath = //"uniquename" + ext;

,這樣,僱員是獨一無二的,所以沒有混淆或重複的照片。

我該如何做到這一點?

謝謝。

protected void Button1_Click(object sender, EventArgs e) //Insert 
    { 

    if (FileUploadControl.HasFile) 
      { 
       string ext = Path.GetExtension(FileUploadControl.FileName); 

       if (ext == ".jpg" || ext == ".png" || ext == ".jpeg" || ext == ".gif") 
       { 
        try 
        { 
         cnn.Open(); 


         SqlCommand cmd = new SqlCommand("INSERT INTO Employees (EmployeeFirstName, EmployeeLastName, EmployeePhotoPath) VALUES (@item1,@item2,@img)", cnn); 
         cmd.Parameters.AddWithValue("@item1", TextBox1.Text); 
         cmd.Parameters.AddWithValue("@item2", TextBox2.Text); 

         string filepath = //"uniquename" + ext; 
         FileUploadControl.SaveAs(Server.MapPath("Images/") + filepath); 
         cmd.Parameters.AddWithValue("@img", filepath); 

         cmd.ExecuteNonQuery(); 

         cnn.Close(); 
         Label3.Text = "successfully inserted"; 
        } 

        catch (Exception ex) 
        { 
         Label3.Text = ex.Message; 
        } 

        temizle(); 
       } 

       else 
       { 
        Label3.Text = "selected file is not a photo"; 
       } 
      } 
      else 
      { 
       Label3.Text = "please upload employee photo"; 
      } 
     } 
    } 
+2

您只需先插入員工,獲取ID然後使用它 - 然後使用位置更新該行。 –

+0

如果EmployeeID是標識列,那麼在執行插入操作之前您無法捕獲該值 – Steve

+0

那麼您可以使用確切的日期時間和用戶姓氏 - 它永遠不會相同。除非你同時添加1000個用戶? –

回答

1

另一種選擇,如果你不想做INSERTSCOPE_IDENTITY途徑是使用GUID

嘗試構建自己的唯一ID(如通過名稱+時間或其他任何可以想到的組合)更有可能產生重複的GUID。

string filepath = Guid.NewGuid().ToString() + ext; 
+0

哇!工作完美!非常感謝! –

2

如果你需要的是文件名是唯一的,你不必在意自己的名字,一個簡單的解決方案是使用GUID爲文件名:

string filepath = Guid.NewGuid().ToString() + ext; 

它可能也是一個好主意,員工姓名添加到文件名,以便它會更容易識別文件只要看一眼他們的名字:

string filepath = string.Format("{0}-{1}-{2}{3}", 
           TextBox1.Text, 
           TextBox2.Text, 
           Guid.NewGuid().ToString(), 
           ext); 
+0

好主意。 –

+0

好主意。非常感謝。 –

+0

+1您的編輯...我發現這樣的東西是有用的! – MikeSmithDev

1

我將開始創建一個存儲過程來解使用該工作在數據庫中添加記錄來確定文件的名稱。該存儲過程返回新的ID,你可以在外面趕它作爲一個標量值

CREATE PROCEDURE EmployeeAdd 
(
    @firstN nvarchar(50), 
    @lastN nvarchar(50), 
    @ext nvarchar(10) 
) 
as 
BEGIN 
    DECLARE @newID int 
    INSERT INTO Employees (EmployeeFirstName, EmployeeLastName, EmployeePhotoPath) 
       VALUES (@firstN, @lastN, '') 
    SET @newID = SCOPE_IDENTITY() 
    DECLARE @newPath nvarchar(30) 
    SET @newPath = CONVERT(nvarchar(10), @newID) + '.' + @ext 
    UPDATE Employees SET EmployeePhotoPath = @newPath WHERE EmployeeID = @newID 
    SELECT @newID 
END 

......  
SqlCommand cmd = new SqlCommand("EmployeeAdd", cnn); 
cmd.Parameters.AddWithValue("@firstN", TextBox1.Text); 
cmd.Parameters.AddWithValue("@lastN", TextBox2.Text); 
cmd.Parameters.AddWithValue("@ext", ext); 
int result = Convert.ToInt32(cmd.ExecuteScalar()); 
FileUploadControl.SaveAs(Server.MapPath("Images/") + string.Format("{0}.{1}", result, ext)); 
.... 

不能測試所有剛纔,但我認爲這個想法是清楚的。

+0

謝謝你的幫助。但是您可以將其刪除,因爲我已經從其他答覆者那裏找到了解決方案。 –

+0

+ SPROC。我唯一擔心的是,如果EmployeeID是敏感的(IDK個人,我不喜歡公開身份證...但這可能只是我)。 @librarianjh其他答案仍然很好,因爲它可以幫助其他人解決同樣的問題。 – MikeSmithDev

+0

是的,這可能是一個問題,只是試圖保持原來的問題。另一方面,如果您需要直接在文件夾上進行任何類型的手動維護,則知道員工的ID以找到其照片可能會有所幫助 – Steve