Aracılığıyla paylaş


Karşıya Dosya Yükleme (C#)

tarafından Scott Mitchell

PDF'i indirin

Kullanıcıların web sitenize ikili dosyaları (Word veya PDF belgeleri gibi) yüklemesine nasıl izin vereceğinizi ve burada sunucunun dosya sisteminde veya veritabanında depolanabileceklerini öğrenin.

Giriş

Şimdiye kadar incelediğimiz tüm öğreticiler yalnızca metin verileriyle çalıştı. Ancak, birçok uygulamada hem metin hem de ikili verileri yakalayan veri modelleri vardır. Çevrimiçi bir tanışma sitesi, kullanıcıların profilleriyle ilişkilendirmek için bir resim yüklemesine izin verebilir. İşe alma web sitesi, kullanıcıların özgeçmişlerini Microsoft Word veya PDF belgesi olarak yüklemesine izin verebilir.

İkili verilerle çalışmak yeni bir dizi zorluk ekler. İkili verilerin uygulamada nasıl depolandığına karar vermeliyiz. Yeni kayıt eklemek için kullanılan arabirimin, kullanıcının bilgisayarından dosya yüklemesine izin verecek şekilde güncelleştirilmiş olması ve kaydın ilişkili ikili verilerini indirmeye yönelik bir araç sağlamak veya görüntülemek için ek adımlar atılması gerekir. Bu öğreticide ve sonraki üç öğreticide bu zorlukları nasıl aşabileceğinizi keşfedeceğiz. Bu öğreticilerin sonunda, bir resim ve PDF broşürü ile her kategoriyi ilişkilendiren tam işlevsel bir uygulama oluşturacağız. Bu özel öğreticide ikili verileri depolamak için farklı tekniklere göz atacak ve kullanıcıların bilgisayarlarından bir dosya yüklemesini ve web sunucusunun dosya sistemine kaydetmesini sağlamayı keşfedeceğiz.

Not

Bir uygulama veri modelinin parçası olan ikili veriler bazen İkili Büyük OBject kısaltması olan BLOB olarak adlandırılır. Bu öğreticilerde BLOB terimi eş anlamlı olmasına rağmen terminoloji ikili verilerini kullanmayı seçtim.

1. Adım: İkili VeriLerle Çalışma Web Sayfaları Oluşturma

İkili veriler için destek eklemeyle ilgili zorlukları keşfetmeye başlamadan önce, web sitesi projemizde bu öğretici ve sonraki üç için ihtiyacımız olacak ASP.NET sayfalarını oluşturmak için biraz zaman ayıralım. adlı BinaryDatayeni bir klasör ekleyerek başlayın. Ardından, aşağıdaki ASP.NET sayfaları bu klasöre ekleyerek her sayfayı ana sayfayla ilişkilendirdiğinizden Site.master emin olun:

  • Default.aspx
  • FileUpload.aspx
  • DisplayOrDownloadData.aspx
  • UploadInDetailsView.aspx
  • UpdatingAndDeleting.aspx

İkili Verilerle İlgili Öğreticiler için ASP.NET Sayfaları Ekleme

Şekil 1: İkili Verilerle İlgili Öğreticiler için ASP.NET Sayfaları Ekleme

Diğer klasörlerde olduğu gibi klasöründe Default.aspx de BinaryData kendi bölümündeki öğreticiler listelenir. Kullanıcı Denetimi'nin SectionLevelTutorialListing.ascx bu işlevi sağladığını hatırlayın. Bu nedenle, bu Kullanıcı Denetimini Default.aspx Çözüm Gezgini sayfanın Tasarım görünümüne sürükleyerek öğesine ekleyin.

SectionLevelTutorialListing.ascx Kullanıcı Denetimini Default.aspx ekleme

Şekil 2: Kullanıcı Denetimini ekleme SectionLevelTutorialListing.ascxDefault.aspx (Tam boyutlu görüntüyü görüntülemek için tıklayın)

Son olarak, bu sayfaları dosyaya Web.sitemap girdi olarak ekleyin. Özellikle, GridView'ı <siteMapNode>Geliştirme'nin ardından aşağıdaki işaretlemeyi ekleyin:

<siteMapNode 
    title="Working with Binary Data" 
    url="~/BinaryData/Default.aspx" 
    description="Extend the data model to include collecting binary data.">
    
    <siteMapNode 
        title="Uploading Files" 
        url="~/BinaryData/FileUpload.aspx" 
        description="Examine the different ways to store binary data on the 
                     web server and see how to accept uploaded files from users 
                     with the FileUpload control." />
    <siteMapNode 
        title="Display or Download Binary Data" 
        url="~/BinaryData/DisplayOrDownloadData.aspx" 
        description="Let users view or download the captured binary data." />
    <siteMapNode 
        title="Adding New Binary Data" 
        url="~/BinaryData/UploadInDetailsView.aspx" 
        description="Learn how to augment the inserting interface to 
                     include a FileUpload control." />
    <siteMapNode 
        title="Updating and Deleting Existing Binary Data" 
        url="~/BinaryData/UpdatingAndDeleting.aspx" 
        description="Learn how to update and delete existing binary data." />
</siteMapNode>

güncelleştirdikten Web.sitemapsonra, öğreticiler web sitesini bir tarayıcı üzerinden görüntülemek için biraz bekleyin. Soldaki menü artık İkili Verilerle Çalışma öğreticilerine yönelik öğeleri içerir.

Site Haritası artık İkili Verilerle Çalışma Öğreticileri için Girdiler Içeriyor

Şekil 3: Site Haritası artık İkili Verilerle Çalışma Öğreticileri için Girdiler Içeriyor

2. Adım: İkili Verilerin Nerede Depolandığına Karar Verme

Uygulamanın veri modeliyle ilişkili ikili veriler iki yerden birinde depolanabilir: web sunucusunun dosya sisteminde veritabanında depolanan dosyaya başvuru ile; veya doğrudan veritabanının içinde (bkz. Şekil 4). Her yaklaşımın kendi artıları ve dezavantajları vardır ve daha ayrıntılı bir tartışmayı esas alır.

İkili Veriler Dosya Sisteminde veya Doğrudan Veritabanında Depolanabilir

Şekil 4: İkili Veriler Dosya Sisteminde veya Doğrudan Veritabanında Depolanabilir (Tam boyutlu görüntüyü görüntülemek için tıklayın)

Bir resmi her ürünle ilişkilendirmek için Northwind veritabanını genişletmek istediğimizi düşünün. Bir seçenek, bu görüntü dosyalarını web sunucusunun dosya sisteminde depolamak ve yolu tabloya Products kaydetmektir. Bu yaklaşımla, türündeki ImagePathProductstabloya bir varchar(200) sütun ekleyebiliriz. Kullanıcı Chai için bir resim yüklediğinde, bu resim web sunucusunun konumundaki dosya sisteminde ~/Images/Tea.jpgdepolanabilir ve burada ~ uygulamanın fiziksel yolunu temsil eder. Yani, web sitesinin kökü fiziksel yoldaysa C:\Websites\Northwind\, ~/Images/Tea.jpg ile C:\Websites\Northwind\Images\Tea.jpgeşdeğer olacaktır. Görüntü dosyasını karşıya yükledikten sonra, tablodaki Products Chai kaydını, sütununun ImagePath yeni görüntünün yoluna başvurması için güncelleştirdik. Tüm ürün görüntülerinin uygulama ~/Images/Tea.jpg klasörüne yerleştirileceğine karar verirsek veya Tea.jpg kullanabilirizImages.

İkili verileri dosya sisteminde depolamanın başlıca avantajları şunlardır:

  • Kısa süre içinde göreceğimiz gibi uygulama kolaylığı, doğrudan veritabanında depolanan ikili verilerin depolanması ve alınması, dosya sistemi aracılığıyla verilerle çalışmaktan biraz daha fazla kod içerir. Buna ek olarak, kullanıcının ikili verileri görüntülemesi veya indirmesi için bu verilerin URL'sini sunması gerekir. Veriler web sunucusunun dosya sisteminde bulunuyorsa, URL basittir. Ancak veriler veritabanında depolanıyorsa, verileri veritabanından alacak ve döndürecek bir web sayfası oluşturulmalıdır.
  • İkili verilere daha geniş erişim İkili verilerin veritabanından veri çekemeyen diğer hizmetler veya uygulamalar tarafından erişilebilir olması gerekebilir. Örneğin, her ürünle ilişkili görüntülerin FTP aracılığıyla kullanıcılara da sunulması gerekebilir; bu durumda ikili verileri dosya sisteminde depolamak isteyebiliriz.
  • İkili veriler dosya sisteminde depolanıyorsa, veritabanı sunucusu ile web sunucusu arasındaki talep ve ağ tıkanıklığı, ikili verilerin doğrudan veritabanında depolanmasından daha az olacaktır.

dosya sisteminde ikili verileri depolamanın temel dezavantajı, verileri veritabanından ayırmasıdır. Tablodan Products bir kayıt silinirse, web sunucusunun dosya sistemindeki ilişkili dosya otomatik olarak silinmez. Dosyayı silmek için ek kod yazmamız gerekir, aksi takdirde dosya sistemi kullanılmayan, yalnız bırakılmış dosyalarla karmaşık hale gelir. Ayrıca, veritabanını yedeklerken, dosya sisteminde ilişkili ikili verilerin de yedeklendiğinden emin olmamız gerekir. Veritabanını başka bir siteye veya sunucuya taşımak benzer zorluklara neden olabilir.

Alternatif olarak, ikili veriler türünde varbinarybir sütun oluşturularak doğrudan bir Microsoft SQL Server 2005 veritabanında depolanabilir. Diğer değişken uzunluğu veri türlerinde olduğu gibi, bu sütunda tutulabilecek ikili verilerin uzunluk üst sınırını belirtebilirsiniz. Örneğin, en fazla 5.000 bayt ayırmak için kullanın varbinary(5000); varbinary(MAX) en yüksek depolama boyutuna (yaklaşık 2 GB) izin verir.

İkili verileri doğrudan veritabanında depolamanın temel avantajı, ikili veriler ile veritabanı kaydı arasındaki sıkı bağlantıdır. Bu, yedeklemeler veya veritabanını farklı bir siteye veya sunucuya taşıma gibi veritabanı yönetim görevlerini büyük ölçüde basitleştirir. Ayrıca, bir kaydın silinmesi ilgili ikili verileri otomatik olarak siler. İkili verileri veritabanında depolamanın daha küçük avantajları da vardır. Daha ayrıntılı bir tartışma için bkz . ASP.NET 2.0 Kullanarak İkili Dosyaları Doğrudan Veritabanında Depolama.

Not

Microsoft SQL Server 2000 ve önceki sürümlerinde veri varbinary türünün en fazla 8.000 bayt sınırı vardı. En fazla 2 GB ikili veri image depolamak için bunun yerine veri türünün kullanılması gerekir. Ancak SQL Server 2005'in eklenmesiyle MAXimage veri türü kullanım dışı bırakılmıştır. Geriye dönük uyumluluk için hala desteklenmektedir ancak Microsoft, veri türünün SQL Server'ın gelecekteki bir sürümünde kaldırılacağını duyurdu image .

Eski bir veri modeliyle çalışıyorsanız veri türünü görebilirsiniz image . Northwind veritabanı Categories tablosunda, kategoriye ait bir Picture görüntü dosyasının ikili verilerini depolamak için kullanılabilecek bir sütun vardır. Northwind veritabanının kökleri Microsoft Access'te ve SQL Server'ın önceki sürümlerinde olduğundan, bu sütun türündedir image.

Bu öğretici ve sonraki üç öğretici için her iki yaklaşımı da kullanacağız. Tabloda Categories , kategori için bir Picture görüntünün ikili içeriğini depolamak için zaten bir sütun var. Web sunucusunun dosya sisteminde pdf dosyasının yolunu depolamak için, kategoriye baskı kalitesi ve şık bir genel bakış sağlamak için kullanılabilecek ek bir sütun BrochurePathekleyeceğiz.

3. Adım: Sütunu TabloyaBrochurePathEklemeCategories

Şu anda Kategoriler tablosunda yalnızca dört sütun vardır: CategoryID, CategoryName, Descriptionve Picture. Bu alanlara ek olarak, kategori broşürü (varsa) işaret edecek yeni bir tane eklememiz gerekir. Bu sütunu eklemek için Sunucu Gezgini'ne gidin, Tablolar'da detaya gidin, tabloya Categories sağ tıklayın ve Tablo Tanımını Aç'ı seçin (bkz. Şekil 5). Sunucu Gezgini'ni görmüyorsanız, Görünüm menüsünden Sunucu Gezgini seçeneğini belirleyerek veya Ctrl+Alt+S tuşlarına basarak açın.

Tabloya varchar(200) adlı Categories ve izin veren BrochurePath yeni NULL bir sütun ekleyin ve Kaydet simgesine tıklayın (veya Ctrl+S tuşlarına basın).

Kategoriler Tablosuna Broşür Yolu Sütunu Ekleme

Şekil 5: Tabloya BrochurePath Sütun Ekleme Categories (Tam boyutlu görüntüyü görüntülemek için tıklayın)

4. Adım: Mimariyi vePictureSütunlarınıBrochurePathKullanacak Şekilde Güncelleştirme

CategoriesDataTable Veri Erişim Katmanı'nda (DAL) şu anda tanımlanmış dört DataColumn sn vardır: CategoryID, CategoryName, Descriptionve NumberOfProducts. Bu DataTable'ı başlangıçta Veri Erişim Katmanı Oluşturma öğreticisinde tasarlarken, yalnızca ilk üç sütun vardı; CategoriesDataTable sütun, Ayrıntılar Veri ListesiNumberOfProducts.

Veri Erişim Katmanı Oluşturma bölümünde açıklandığı gibi, Yazılan Veri Kümesindeki DataTable'lar iş nesnelerini oluşturur. TableAdapters, veritabanıyla iletişim kurmak ve iş nesnelerini sorgu sonuçlarıyla doldurmaktan sorumludur. , CategoriesDataTable üç veri alma yöntemine sahip olan ile doldurulur CategoriesTableAdapter:

  • GetCategories()TableAdapter ana sorgusunu yürütür ve tablodaki CategoryIDtüm kayıtların CategoryName , Descriptionve Categories alanlarını döndürür. Ana sorgu, otomatik olarak oluşturulan Insert ve Update yöntemleri tarafından kullanılan sorgudur.
  • GetCategoryByCategoryID(categoryID)categoryID değerine CategoryIDeşit olan CategoryName kategorinin , Descriptionve CategoryID alanlarını döndürür.
  • GetCategoriesAndNumberOfProducts()- tablodaki CategoryIDtüm kayıtlar CategoryName için , Descriptionve Categories alanlarını döndürür. Ayrıca, her kategoriyle ilişkili ürün sayısını döndürmek için bir alt sorgu kullanır.

Bu sorgulardan hiçbirinin tablo veya CategoriesPicture sütunları döndürmediğini BrochurePath ve bu alanlar için s sağlamadığını CategoriesDataTableDataColumn fark edin. Resim ve BrochurePath özelliklerle çalışmak için önce bunları CategoriesDataTable öğesine eklememiz ve sonra bu sütunları döndürmek CategoriesTableAdapter için sınıfını güncelleştirmemiz gerekir.

ve'leriPictureBrochurePath``DataColumn ekleme

bu iki sütunu öğesine CategoriesDataTableekleyerek başlayın. S üst bilgisine CategoriesDataTable sağ tıklayın, bağlam menüsünden Ekle'yi seçin ve ardından Sütun seçeneğini belirleyin. Bu, DataTable'da adlı DataColumnyeni Column1 bir oluşturur. Bu sütunu olarak Pictureyeniden adlandırın. Özellikler penceresi s DataColumn özelliğini DataType olarak ayarlayın System.Byte[] (bu, açılan listede bir seçenek değildir; bunu yazmanız gerekir).

DataType'ı System.Byte olan DataColumn Adlı Resim Oluşturma[]

Şekil 6: Olan Bir DataColumn Adlandırılmış PictureDataTypeSystem.Byte[] Oluşturma (Tam boyutlu görüntüyü görüntülemek için tıklayın)

DataTable'a başka bir DataColumn ad ekleyerek varsayılan BrochurePath değeri ()DataType kullanarak adlandırınSystem.String.

PictureTableAdapter'dan veBrochurePathDeğerlerini döndürme

bu ikisi DataColumn öğesine CategoriesDataTableeklendikten sonra güncelleştirmeye CategoriesTableAdapterhazırız. Bu sütun değerlerinin her ikisini de ana TableAdapter sorgusunda döndürebilirdik, ancak bu yöntem her GetCategories() çağrıldığında ikili verileri geri getirir. Bunun yerine, geri getirmek BrochurePath ve belirli bir kategori Picture sütununu döndüren ek bir veri alma yöntemi oluşturmak için ana TableAdapter sorgusunu güncelleştirelim.

Ana TableAdapter sorgusunu güncelleştirmek için s üst bilgisine CategoriesTableAdapter sağ tıklayın ve bağlam menüsünden Yapılandır seçeneğini belirleyin. Bu, bir dizi geçmiş öğreticide gördüğümüz Tablo Bağdaştırıcısı Yapılandırma Sihirbazı'nı getirir. Sorguyu güncelleştirerek öğesini geri getirin ve Son'a BrochurePath tıklayın.

SELECT Deyimindeki Sütun Listesini Ayrıca BroşürYolu Döndürecek Şekilde Güncelleştirin

Şekil 7: Deyimdeki SELECT Sütun Listesini De Döndürecek BrochurePath Şekilde Güncelleştirin (Tam boyutlu görüntüyü görüntülemek için tıklayın)

TableAdapter için geçici SQL deyimlerini kullanırken, ana sorgudaki sütun listesini güncelleştirmek TableAdapter'daki tüm SELECT sorgu yöntemleri için sütun listesini güncelleştirir. Bu, yöntemin GetCategoryByCategoryID(categoryID) sütunu döndürecek BrochurePath şekilde güncelleştirildiği anlamına gelir. Bu, istediğimiz gibi olabilir. Ancak, yöntemdeki GetCategoriesAndNumberOfProducts() sütun listesini de güncelleştirerek her kategori için ürün sayısını döndüren alt sorguyu kaldırmıştır! Bu nedenle, bu yöntemin SELECT sorgusunu güncelleştirmemiz gerekir. Yönteme GetCategoriesAndNumberOfProducts() sağ tıklayın, Yapılandır'ı seçin ve sorguyu özgün değerine geri döndürin SELECT :

SELECT CategoryID, CategoryName, Description, 
       (SELECT COUNT(*) 
            FROM Products p 
            WHERE p.CategoryID = c.CategoryID) 
       as NumberOfProducts
FROM Categories c

Ardından, belirli bir kategorinin Picture sütun değerini döndüren yeni bir TableAdapter yöntemi oluşturun. S üst bilgisine CategoriesTableAdapter sağ tıklayın ve TableAdapter Sorgu Yapılandırma Sihirbazı'nı başlatmak için Sorgu Ekle seçeneğini belirleyin. Bu sihirbazın ilk adımı, geçici bir SQL deyimi, yeni bir saklı yordam veya mevcut bir sql deyimi kullanarak verileri sorgulamak isteyip istemediğinizi sorar. SQL deyimlerini kullan'ı seçin ve İleri'ye tıklayın. Bir satır döndüreceğimizden, ikinci adımdaki Satırları döndüren SEÇ seçeneğini belirleyin.

SQL deyimlerini kullan Seçeneğini belirleyin

Şekil 8: SQL deyimlerini kullan Seçeneğini belirleyin (Tam boyutlu görüntüyü görüntülemek için tıklayın)

Sorgu Kategoriler Tablosundan Bir Kayıt Döndüreceğinden, satırları döndüren SELECT'i seçin

Şekil 9: Sorgu Kategoriler Tablosundan Bir Kayıt Döndüreceğinden, satırları döndüren SEÇ'i seçin (Tam boyutlu görüntüyü görüntülemek için tıklayın)

Üçüncü adımda aşağıdaki SQL sorgusunu girin ve İleri'ye tıklayın:

SELECT     CategoryID, CategoryName, Description, BrochurePath, Picture
FROM       Categories
WHERE      CategoryID = @CategoryID

Son adım, yeni yöntemin adını seçmektir. Sırasıyla Bir DataTable Doldurma ve DataTable desenleri döndürme için ve FillCategoryWithBinaryDataByCategoryID kullanınGetCategoryWithBinaryDataByCategoryID. Sihirbazı tamamlamak için Son’a tıklayın.

TableAdapter Yöntemlerinin Adlarını Seçin

Şekil 10: TableAdapter Yöntemlerinin Adlarını Seçin (Tam boyutlu görüntüyü görüntülemek için tıklayın)

Not

Tablo Bağdaştırıcısı Sorgu Yapılandırma Sihirbazı'nı tamamladıktan sonra, yeni komut metninin ana sorgunun şemasından farklı şemaya sahip verileri döndürdüğünü bildiren bir iletişim kutusu görebilirsiniz. Kısacası, sihirbaz TableAdapter ana sorgusunun GetCategories() yeni oluşturduğumuz şemadan farklı bir şema döndürdüğüne dikkat ediyor. Ama istediğimiz bu, dolayısıyla bu iletiyi göz ardı edebilirsiniz.

Ayrıca, geçici SQL deyimleri kullanıyorsanız ve tableAdapter ana sorgusunu daha sonraki bir noktada değiştirmek için sihirbazı kullanıyorsanız, yöntemin GetCategoryWithBinaryDataByCategoryIDSELECT deyiminin sütun listesini yalnızca ana sorgudaki sütunları içerecek şekilde değiştireceğini unutmayın (yani, sorgudan sütunu kaldırır Picture ). Sütunu döndürmek Picture için sütun listesini el ile güncelleştirmeniz gerekir. Bu adımda daha önce yöntemiyle GetCategoriesAndNumberOfProducts() yaptığımız gibi.

öğesine ve DataColumn yöntemine CategoriesDataTableGetCategoryWithBinaryDataByCategoryID iki CategoriesTableAdapter s eklendikten sonra, Typed DataSet Designer'daki bu sınıflar Şekil 11'deki ekran görüntüsü gibi görünmelidir.

DataSet Tasarımcısı Yeni Sütunları ve Yöntemi içerir

Şekil 11: DataSet Tasarımcısı Yeni Sütunları ve Yöntemi içerir

İş Mantığı Katmanını Güncelleştirme (BLL)

DAL güncelleştirildikten sonra geriye kalan tek şey İş Mantığı Katmanı'nı (BLL) yeni CategoriesTableAdapter yöntem için bir yöntem içerecek şekilde artırmaktır. CategoriesBLL sınıfına aşağıdaki yöntemi ekleyin:

[System.ComponentModel.DataObjectMethodAttribute
    (System.ComponentModel.DataObjectMethodType.Select, false)] 
public Northwind.CategoriesDataTable 
    GetCategoryWithBinaryDataByCategoryID(int categoryID)
{
    return Adapter.GetCategoryWithBinaryDataByCategoryID(categoryID);
}

5. Adım: İstemciden Web Sunucusuna Dosya Yükleme

İkili veriler toplanırken, bu veriler genellikle son kullanıcı tarafından sağlanır. Bu bilgileri yakalamak için kullanıcının bilgisayarından web sunucusuna dosya yükleyebilmesi gerekir. Ardından karşıya yüklenen verilerin veri modeliyle tümleştirilmesi gerekir. Bu, dosyayı web sunucusunun dosya sistemine kaydetme ve veritabanındaki dosyaya bir yol ekleme veya ikili içeriği doğrudan veritabanına yazma anlamına gelebilir. Bu adımda, bir kullanıcının bilgisayarlarından sunucuya dosya yüklemesine nasıl izin verebileceğimizi inceleyeceğiz. Sonraki öğreticide, karşıya yüklenen dosyayı veri modeliyle tümleştirmeye dikkat edeceğiz.

ASP.NET 2.0'ın yeni FileUpload Web denetimi , kullanıcıların bilgisayarlarından web sunucusuna dosya göndermeleri için bir mekanizma sağlar. FileUpload denetimi, özniteliği dosya olarak ayarlanmış bir <input> öğe type olarak işlenir ve tarayıcılar Gözat düğmesiyle metin kutusu olarak görüntülenir. Gözat düğmesine tıklanması, kullanıcının dosya seçebileceği bir iletişim kutusu açar. Form geri gönderildiğinde, seçilen dosyanın içeriği geri göndermeyle birlikte gönderilir. Sunucu tarafında, karşıya yüklenen dosya hakkındaki bilgilere FileUpload denetiminin özellikleri aracılığıyla erişilebilir.

Dosyaları karşıya yüklemeyi göstermek için klasördeki sayfayı FileUpload.aspx açın, Araç Kutusu'ndan BinaryData Bir FileUpload denetimini Tasarımcı'ya sürükleyin ve denetim s ID özelliğini olarak UploadTestayarlayın. Ardından, sırasıyla ve ID özelliklerini ayarlayıp Text Seçili Dosyayı Karşıya Yükle'ye UploadButton bir Düğme Web denetimi ekleyin. Son olarak, Button öğesinin altına bir Label Web denetimi yerleştirin, özelliğini temizleyin Text ve özelliğini olarak IDayarlayınUploadDetails.

ASP.NET Sayfasına FileUpload Denetimi Ekleme

Şekil 12: ASP.NET Sayfasına DosyaYükleme Denetimi Ekleme (Tam boyutlu görüntüyü görüntülemek için tıklayın)

Şekil 13'te tarayıcı üzerinden görüntülendiğinde bu sayfa gösterilmektedir. Gözat düğmesine tıklanması, kullanıcının bilgisayarından bir dosya seçmesine olanak sağlayan bir dosya seçimi iletişim kutusu getirir. Bir dosya seçildikten sonra, Seçili Dosyayı Karşıya Yükle düğmesine tıklanması, seçili dosyanın ikili içeriğini web sunucusuna gönderen bir geri göndermeye neden olur.

Kullanıcı Bilgisayarından Sunucuya Yüklenecek Dosyayı Seçebilir

Şekil 13: Kullanıcı Bilgisayarından Sunucuya Yüklenecek Dosyayı Seçebilir (Tam boyutlu görüntüyü görüntülemek için tıklayın)

Geri göndermede, karşıya yüklenen dosya dosya sistemine kaydedilebilir veya ikili verileri doğrudan bir Stream aracılığıyla üzerinde çalışılabilir. Bu örnek için bir ~/Brochures klasör oluşturalım ve karşıya yüklenen dosyayı oraya kaydedelim. Klasörü siteye kök dizinin alt klasörü olarak ekleyerek Brochures başlayın. Ardından, s UploadButton olayı için Click bir olay işleyicisi oluşturun ve aşağıdaki kodu ekleyin:

protected void UploadButton_Click(object sender, EventArgs e)
{
    if (UploadTest.HasFile == false)
    {
        // No file uploaded!
        UploadDetails.Text = "Please first select a file to upload...";            
    }
    else
    {
        // Display the uploaded file's details
        UploadDetails.Text = string.Format(
                @"Uploaded file: {0}<br />
                  File size (in bytes): {1:N0}<br />
                  Content-type: {2}", 
                  UploadTest.FileName, 
                  UploadTest.FileBytes.Length,
                  UploadTest.PostedFile.ContentType);
        // Save the file
        string filePath = 
            Server.MapPath("~/Brochures/" + UploadTest.FileName);
        UploadTest.SaveAs(filePath);
    }
}

FileUpload denetimi, karşıya yüklenen verilerle çalışmak için çeşitli özellikler sağlar. Örneğin, HasFile özelliği bir dosyanın kullanıcı tarafından karşıya yüklenip yüklenmediğini belirtirken FileBytes , özelliği de yüklenen ikili verilere bayt dizisi olarak erişim sağlar. Olay işleyicisi Click , bir dosyanın karşıya yüklendiğinden emin olarak başlar. Bir dosya karşıya yüklendiyse, Etiket karşıya yüklenen dosyanın adını, boyutunu bayt cinsinden ve içerik türünü gösterir.

Not

Kullanıcının bir dosyayı karşıya yüklediğinden emin olmak için özelliğini denetleyebilir HasFile ve varsa falsebir uyarı görüntüleyebilirsiniz veya bunun yerine RequiredFieldValidator denetimini kullanabilirsiniz.

FileUpload s SaveAs(filePath) , karşıya yüklenen dosyayı belirtilen filePath dosyasına kaydeder. filePath, sanal . Server.MapPath(virtPath) yöntemi bir sanal yol alır ve buna karşılık gelen fiziksel yolunu döndürür. Burada sanal yol , ~/Brochures/fileNameburada fileName karşıya yüklenen dosyanın adıdır. Sanal ve fiziksel yollar ve kullanma hakkında daha fazla bilgi için bkzServer.MapPath.

Olay işleyicisini Click tamamladıktan sonra, sayfayı tarayıcıda test etmek için biraz bekleyin. Gözat düğmesine tıklayın, sabit sürücünüzden bir dosya seçin ve ardından Seçili Dosyayı Karşıya Yükle düğmesine tıklayın. Geri gönderme, seçili dosyanın içeriğini web sunucusuna gönderir ve ardından dosya hakkındaki bilgileri klasöre ~/Brochures kaydetmeden önce görüntüler. Dosyayı karşıya yükledikten sonra Visual Studio'ya dönün ve Çözüm Gezgini Yenile düğmesine tıklayın. Az önce karşıya yüklediğiniz dosyayı ~/Broşürler klasöründe görmeniz gerekir!

Dosya EvolutionValley.jpg Web Sunucusuna Yüklendi

Şekil 14: Dosya EvolutionValley.jpg Web Sunucusuna Yüklendi (Tam boyutlu görüntüyü görüntülemek için tıklayın)

EvolutionValley.jpg ~/Broşürler Klasörüne Kaydedildi

Şekil 15: EvolutionValley.jpg Klasöre ~/Brochures Kaydedildi

Karşıya Yüklenen Dosyaları Dosya Sistemine Kaydetme ile ilgili incelikler

Dosyaları web sunucusunun dosya sistemine kaydederken ele alınması gereken birkaç incelik vardır. İlk olarak, güvenlik sorunu var. Dosyayı dosya sistemine kaydetmek için, ASP.NET sayfasının yürütülmekte olduğu güvenlik bağlamı Yazma izinlerine sahip olmalıdır. ASP.NET Geliştirme Web Sunucusu, geçerli kullanıcı hesabınızın bağlamında çalışır. Web sunucusu olarak Microsoft Internet Information Services (IIS) kullanıyorsanız, güvenlik bağlamı IIS sürümüne ve yapılandırmasına bağlıdır.

Dosyaları dosya sistemine kaydetmenin bir diğer sınaması da dosyaların adlandırılmasıyla ilgilidir. Şu anda sayfamız, istemci bilgisayarındaki dosyayla aynı adı kullanarak karşıya yüklenen tüm dosyaları ~/Brochures dizine kaydeder. Kullanıcı A adlı Brochure.pdfbir broşür yüklerse, dosya olarak ~/Brochure/Brochure.pdfkaydedilir. Peki ya daha sonra Kullanıcı B aynı dosya adına (Brochure.pdf) sahip olan farklı bir broşür dosyasını karşıya yüklerse? Şu anda sahip olduğumuz kodla, Kullanıcı B'nin karşıya yüklemesi ile Kullanıcı A dosyasının üzerine yazılır.

Dosya adı çakışmalarını çözmek için bir dizi teknik vardır. Bir seçenek, aynı ada sahip bir dosya zaten varsa karşıya yüklemeyi yasaklama seçeneğidir. Bu yaklaşımla, Kullanıcı B adlı Brochure.pdfbir dosyayı karşıya yüklemeyi denediğinde sistem dosyasını kaydetmez ve bunun yerine B Kullanıcısına dosyayı yeniden adlandırması ve yeniden denemesi konusunda bilgi veren bir ileti görüntüler. Başka bir yaklaşım, dosyayı genel olarak benzersiz bir tanımlayıcı (GUID) veya ilgili veritabanı kaydının birincil anahtar sütunlarından (karşıya yüklemenin veri modelindeki belirli bir satırla ilişkili olduğu varsayılarak) değer olabilecek benzersiz bir dosya adı kullanarak kaydetmektir. Sonraki öğreticide bu seçenekleri daha ayrıntılı olarak inceleyeceğiz.

Çok Büyük Miktarlardaki İkili Verilerle İlgili Zorluklar

Bu öğreticilerde, yakalanan ikili verilerin boyutunun mütevazı olduğu varsayılır. Birkaç megabayt veya daha büyük olan çok büyük miktarda ikili veri dosyasıyla çalışmak, bu öğreticilerin kapsamını aşan yeni zorluklara yol açar. Örneğin, varsayılan olarak ASP.NET 4 MB'tan fazla karşıya yüklemeleri reddeder, ancak bu, içindeki <httpRuntime>öğesi aracılığıyla Web.config yapılandırılabilir. IIS kendi dosya karşıya yükleme boyutu sınırlamalarını da uygular. Ayrıca, büyük dosyaları karşıya yüklemek için geçen süre varsayılan 110 saniyeyi aşabilir ASP.NET istek için bekler. Büyük dosyalarla çalışırken ortaya çıkan bellek ve performans sorunları da vardır.

FileUpload denetimi büyük dosya yüklemeleri için pratik değildir. Dosyanın içeriği sunucuya gönderildiğinden, son kullanıcının karşıya yükleme işleminin ilerlediğini onaylamadan sabırla beklemesi gerekir. Bu, birkaç saniye içinde karşıya yüklenebilen daha küçük dosyalarla ilgilenirken çok fazla sorun oluşturmaz, ancak karşıya yüklenmesi dakikalar sürebilecek daha büyük dosyalarla ilgilenirken sorun olabilir. Büyük yüklemeleri işlemek için daha uygun olan çeşitli üçüncü taraf dosya yükleme denetimleri vardır ve bu satıcıların çoğu çok daha şık bir kullanıcı deneyimi sunan ilerleme göstergeleri ve ActiveX karşıya yükleme yöneticileri sağlar.

Uygulamanızın büyük dosyaları işlemesi gerekiyorsa, zorlukları dikkatle incelemeniz ve özel ihtiyaçlarınıza uygun çözümler bulmanız gerekir.

Özet

İkili verileri yakalaması gereken bir uygulama oluşturmak çeşitli zorluklara neden olabilir. Bu öğreticide ilk ikisini inceledik: ikili verilerin nerede depolandığına karar verme ve kullanıcının bir web sayfası aracılığıyla ikili içeriği karşıya yüklemesine izin verme. Sonraki üç öğreticide, karşıya yüklenen verilerin veritabanındaki bir kayıtla nasıl ilişkilendirileceği ve ikili verilerin metin veri alanlarıyla birlikte nasıl görüntüleneceğini göreceğiz.

Mutlu Programlama!

Daha Fazla Bilgi

Bu öğreticide ele alınan konular hakkında daha fazla bilgi için aşağıdaki kaynaklara bakın:

Yazar hakkında

Yedi ASP/ASP.NET kitabının yazarı ve 4GuysFromRolla.com kurucusu Scott Mitchell, 1998'den beri Microsoft Web teknolojileriyle çalışmaktadır. Scott bağımsız bir danışman, eğitmen ve yazar olarak çalışır. Son kitabı Sams Teach Yourself ASP.NET 24 Hours 2.0'dır. Ona adresinden mitchell@4GuysFromRolla.comulaşabilirsiniz.

Özel Teşekkürler

Bu öğretici serisi birçok yararlı gözden geçiren tarafından gözden geçirildi. Bu öğreticinin baş gözden geçirenleri Teresa Murphy ve Bernadette Leigh oldu. Yaklaşan MSDN makalelerimi gözden geçirmek istiyor musunuz? Öyleyse, mitchell@4GuysFromRolla.com'a bir mesaj bırakın.