none
Asp.Net Dosya Güncelleme RRS feed

  • Soru

  • Soru1: Aşağıdaki gibi dosya yükleyip Images1 nesnesiyle gösteriyorum. Bir sorun yok. Fakat dosya yükledikten sonra tekrardan bir dosya yüklendiğinde bir önceki dosya Images klasöründe kalıyor silinmiyor. Ben istiyorum ki Images klasöründe sadece en son yüklenmiş dosya kalsın bir öncekini bir döngü halinde silsin.

    Soru 2: Yüklenen dosyaların karışmaması için onlara nasıl farklı random isimler verebilirim? Teşekkürler.

    protected void btnkaydet_Click(object sender, EventArgs e) { if(FileUpload1.HasFile) { string filename = Path.GetFileName(FileUpload1.FileName); FileUpload1.SaveAs(Server.MapPath("~/Images/") + filename);

    Image1.ImageUrl = "~/Images/" + filename; } }


    29 Ocak 2014 Çarşamba 14:10

Yanıtlar

  • Şimdi databasede tuttuğunuz kayıtlara ait tabloya ilişkili ikinci bir tablo olmalı, ben olsam resimlerin byte'larınıda bu tabloda tutarım. Edit ve remove işlerinde birde dosyaları yönetmek zorunda kalmazdım. Ayrıca dosya isimleri klasör izinleri vs vs ile uğraşmazdım, hemde database yedeğini alınca resimleri de yedeklemiş olurdum. Yanlız bu durum database dosyasının büyümesine neden olur, database kotanız varsa uygun bir çözüm olmayabilir.

    Mevcut yapınızdan devam edecekseniz;

    Öncelikle her fileUpload için ayrı ayrı handler oluşturmanıza da gerek yok foreach ile yapabilirsiniz;

    foreach(var item in panel1.Controls)
    {
        if(item is FileUpload)
        {
            var fu = (FileUpload)item;
            if(fu.HasFile)
            {
               //kayıt işlemi
            }
        }
    }

    şeklinde. Dosya isimlerini de kayıtların Id si olarak belirleyebilirsin


    e-mail: onay[nokta]yalciner[at]hotmail[nokta]com
    MCC

    30 Ocak 2014 Perşembe 09:46
    Moderatör

Tüm Yanıtlar

  • 1. Soru   Döngü kullanarak değilde veritabanından güncelleme için bilgileri çektiğinde sonuçda o resmin url'sini image kontrolune atıyorsun misal : image1.ImageUrl=dr["resimyolu"].ToString şeklinde.

    Yapmanız gereken verileri getirirken resimyolunu birde global bir değişkene atamanız. misal: string resimyolu=dr["resimyolu"].ToString şeklinde  

    daha sonra gerekli güncelleme işlemini yaptığınızda resim isminin değişip değişmediği ile alakalı bir metod yazıp kontrol ettirmeniz gerekiyor. Eğer değişti ise değişkene atadığınız resimyolundaki resmi aşağıdaki kodu kullanarak sildirebilirsiniz.

    System.IO.File.Delete(Server.MapPath(resimyolu));

    2. Soru  resim kayıt esnasında resmin ismini değişmeniz Random bir değişken kullanarak mümkün tabiki 

     Random rnd = new Random();

     int adlandir= rnd.Next(1, 50000);

     FileUpload1.SaveAs(Server.MapPath("~\Images") + "\" + adlandir.ToString() + FileUpload1.FileName);

    yukarıdaki kod ile mevcut resim isminizin önüne random değişkenden gelen değeri atayarak resimlerinizin karışmasını engelleyebilirsiniz.

     

    • Düzenleyen Berrinn 29 Ocak 2014 Çarşamba 15:00
    • Yanıt Olarak İşaretleyen Erce İpek 29 Ocak 2014 Çarşamba 18:53
    • Yanıt İşaretini Geri Alan Erce İpek 29 Ocak 2014 Çarşamba 19:25
    29 Ocak 2014 Çarşamba 14:51
  • Bunun için ilk önce klasörü temizleyin yeni dosyayı sonra koyun;

    protected void btnkaydet_Click(object sender, EventArgs e)
    {
        if(FileUpload1.HasFile)
        {
          //klasördeki tüm dosyaları siler
          Directory.GetFiles(Server.MapPath("~/Images/"), "*.*").ToList().ForEach(p=> File.Delete(p));
    
           string filename = Path.GetFileName(FileUpload1.FileName);
           FileUpload1.SaveAs(Path.Combine(Server.MapPath("~/Images/") , filename));
    
           Image1.ImageUrl = "~/Images/" + filename;
        }
    }

    Rastgele dosya isimleri için;

    Path.GetRandomFileName();

    kullanabilirsiniz.


    e-mail: onay[nokta]yalciner[at]hotmail[nokta]com
    MCC

    • Yanıt Olarak Öneren Barış SarıtaşModerator 29 Ocak 2014 Çarşamba 15:05
    • Yanıt Olarak İşaretleyen Erce İpek 29 Ocak 2014 Çarşamba 16:43
    • Yanıt İşaretini Geri Alan Erce İpek 29 Ocak 2014 Çarşamba 19:25
    • Yanıt Önerisini Geri Alan Erce İpek 31 Ocak 2014 Cuma 19:43
    29 Ocak 2014 Çarşamba 14:56
    Moderatör
  • Önay Bey;

    Soru 1:Vermiş olduğunuz tüm klasörü temizleme satırını değiştirmem gerekiyor. Önceki yüklenmiş dosyaları silmesek. Mesela Id 37 olan kayda dosya yükledik.bu dosyayı güncellemek istedigimde varolan dosyayı silsin yenisiyle değiştirsin yani. Ve önceki 36 kayda dokunmasın onlar klasörde dursun yani. 

    Soru 2: Random isim verme olayında takıldığım bir konu var. Bu tabloya yıllık yaklaşık 400-500 bin kayıt ekleniyor. Birkaç dosya ismine aynı ismi vermesi de muhtemel bir durum olabilir mi?

    Soru 3: Dosyaları varbinary olarak veritabanına kaydediyordum fakat dosya boyutları 100 mb civarında. Bunların birkaçını aynı sayfada göstermeye calısınca server kaldırmıyor hata veriyordu. Klasöre kaydedince sizce aynı server sorununu yaşar mıyım?



    • Düzenleyen Erce İpek 29 Ocak 2014 Çarşamba 17:19
    29 Ocak 2014 Çarşamba 16:14
  • Madem database ile ilişkili database id sini dosya ismi olarak kaydedin

    e-mail: onay[nokta]yalciner[at]hotmail[nokta]com
    MCC

    29 Ocak 2014 Çarşamba 17:33
    Moderatör
  • Klasördeki dosyayı yenisiyle nasıl değiştirebilirim? o kayıta ait tek bir dosya olmalı.bu şekilde baska dosya yükleyince eskisini de tutuyo.

    protected void Button1_Click(object sender, EventArgs e) { if (FileUpload1.HasFile) { string Id = Request.QueryString["Id"]; string resimadi = Path.GetRandomFileName(); FileUpload1.SaveAs(Path.Combine(Server.MapPath("~/Uploads/"), resimadi)); SqlConnection baglanti = fonksiyon.baglan(); SqlCommand cmd = new SqlCommand("update Resimler set resimyolu1=@resimyolu1 Where Id=" + Id, baglanti); cmd.Parameters.Add("resimyolu1", resimadi); cmd.ExecuteNonQuery();

    baglanti.Close(); Image1.ImageUrl = "~/Uploads/" + resimadi; } }




    • Düzenleyen Erce İpek 29 Ocak 2014 Çarşamba 18:42
    29 Ocak 2014 Çarşamba 18:40
  • Şimdi ben dağıldım, dosyayı klasörde mi tutuyorsunuz yoksa database de mi? Ya da şöyle yapalım siz bize yapmak istediğiniz şeyi söyleyin bizde biliyorsak tavsiyede bulunalım.

    e-mail: onay[nokta]yalciner[at]hotmail[nokta]com
    MCC

    30 Ocak 2014 Perşembe 07:33
    Moderatör
  • Konu dağıldı pardon. Kayıtlarıma ait dosyaları  Images klasöründe tutuyorum. Dosyalarını yüklemek istediğim kaydın Idsini dosya yükleme sayfasına gönderiyorum. Yükleme sayfasında Idyi alıyorum. Bu sayfada 5 adet fileupload nesnesi var.5 adet dosya yüklenecek. Benim istediğim şu; mesela fileupload1 ile resmi yükledim fakat yanlış yüklediğimi farkettim, tekrardan yükleme yaptığımda yanlış yüklediğimle yeni yüklediğimi değiştirsin. yanlış yüklenmişi de boş yere klasörde tutmasın. Kodlarım aşağıda. İlginiz için teşekkür ederim

     protected void btnkaydet1_Click(object sender, EventArgs e)
        {
            if (FileUpload1.HasFile)
            {
                String Id = Request.QueryString["Id"];
                string resimadi1 = Path.GetRandomFileName();
                SqlConnection baglanti = klas.baglan();
                FileUpload1.SaveAs(Path.Combine(Server.MapPath("~/Images/"), resimadi1));
                SqlCommand cmd = new SqlCommand("UPDATE Resimler set resim1=@resim1 where Id=" + Id, baglanti);
                cmd.Parameters.Add("resim1", resimadi1);
                cmd.ExecuteNonQuery();
                baglanti.Close();
                Image1.ImageUrl = "~/Images/" + resimadi1;
            }
        }
        protected void btnkaydet2_Click(object sender, EventArgs e)
        {
            if (FileUpload2.HasFile)
            {
                String Id = Request.QueryString["Id"];
                string resimadi2 = Path.GetRandomFileName();
                SqlConnection baglanti = klas.baglan();
                FileUpload1.SaveAs(Path.Combine(Server.MapPath("~/Images/"), resimadi2));
                SqlCommand cmd = new SqlCommand("UPDATE Resimler set resim2=@resim2 where Id=" + Id, baglanti);
                cmd.Parameters.Add("resim2", resimadi2);
                cmd.ExecuteNonQuery();
                baglanti.Close();
                Image1.ImageUrl = "~/Images/" + resimadi2;
            }
        }
        .
        .
        .
        .

    30 Ocak 2014 Perşembe 08:12
  • Şimdi databasede tuttuğunuz kayıtlara ait tabloya ilişkili ikinci bir tablo olmalı, ben olsam resimlerin byte'larınıda bu tabloda tutarım. Edit ve remove işlerinde birde dosyaları yönetmek zorunda kalmazdım. Ayrıca dosya isimleri klasör izinleri vs vs ile uğraşmazdım, hemde database yedeğini alınca resimleri de yedeklemiş olurdum. Yanlız bu durum database dosyasının büyümesine neden olur, database kotanız varsa uygun bir çözüm olmayabilir.

    Mevcut yapınızdan devam edecekseniz;

    Öncelikle her fileUpload için ayrı ayrı handler oluşturmanıza da gerek yok foreach ile yapabilirsiniz;

    foreach(var item in panel1.Controls)
    {
        if(item is FileUpload)
        {
            var fu = (FileUpload)item;
            if(fu.HasFile)
            {
               //kayıt işlemi
            }
        }
    }

    şeklinde. Dosya isimlerini de kayıtların Id si olarak belirleyebilirsin


    e-mail: onay[nokta]yalciner[at]hotmail[nokta]com
    MCC

    30 Ocak 2014 Perşembe 09:46
    Moderatör
  • Olmadı fakat yine de teşekkürler yardımlarınız için.

    30 Ocak 2014 Perşembe 10:15