2013-10-02 4 views
1

У меня есть сайт ASP.NET (4.5).make imagepath unique

Эта команда кнопки ниже, которая вставляет employeeeename, useeelastname, useeephoto в папку изображений и путь изображения к db.

Я хочу, чтобы путь к изображению был автоматически uniquename + extension;

string filepath = //"uniquename" + ext;

так что, EmployeeID уникален, так что нет никакой путаницы или дублировать фотографии.

Как я могу это достичь?

спасибо.

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

Вам просто нужно сначала вставить сотрудника, получить идентификатор, а затем использовать его, а затем обновить строку с указанием местоположения. –

+0

Если EmployeeID является столбцом Identity, то вы не можете поймать это значение перед выполнением вставки – Steve

+0

Ну, вы можете использовать точное время и имя пользователя - было бы маловероятно, чтобы он всегда был таким же. Если вы не добавляете 1000 пользователей одновременно? –

ответ

1

Другой вариант, если вы не хотите, чтобы сделать маршрут INSERT и SCOPE_IDENTITY является использование GUID.

Попытка создать свои собственные уникальные идентификаторы (например, с помощью комбинации имен + раз или что-нибудь еще, что вы можете придумать), скорее всего, создаст дубликат, чем 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

Начну создания хранимой процедуры для снятия legate job, чтобы добавить запись в базу данных, определяющую имя файла. Хранимая процедура возвращает новый идентификатор, и вы можете поймать его вне как скаляр

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

+1 для SPROC. Моя единственная забота заключается в том, что если EmployeeID чувствителен (лично мне лично не нравится выставлять идентификаторы ... но это может быть только я). @librarianjh другие ответы по-прежнему хороши, так как могут помочь другим с одинаковой проблемой. – MikeSmithDev

+0

Да, это может быть проблемой, просто пытаясь остаться с исходным вопросом. С другой стороны, если вам нужно делать какое-либо ручное обслуживание непосредственно в папке, зная, что идентификатор сотрудника, чтобы найти его фотографию, может быть полезен – Steve

Смежные вопросы