2013-10-02 84 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