Karşıya Dosya Yükleme (VB)

tarafından Scott Mitchell

PDF’yi İndir

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

Giriş

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

İkili verilerle çalışmak yeni bir dizi zorluk ekler. İkili verilerin uygulamada nasıl depolandığına karar vermemiz gerekir. 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 bir kaydın ilişkili ikili verilerini indirmek için bir araç sağlamak veya görüntülemek için ek adımlar atılması gerekir. Bu öğreticide ve sonraki üç öğreticide bu zorlukların üstesinden nasıl geleceğimiz hakkında bilgi edineceğiz. Bu öğreticilerin sonunda, her kategoriyle bir resim ve PDF broşürü 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 dosyayı karşıya yüklemesini ve web sunucusunun dosya sistemine kaydetmesini sağlamayı keşfedeceğiz.

Not

Bir uygulamanın 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 ikili terminoloji verilerini kullanmayı seçtim.

1. Adım: İkili Veri Web Sayfalarıyla Çalışma 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 Data-Related Öğreticileri için ASP.NET Sayfaları Ekleme

Şekil 1: İkili Data-Related Öğreticileri 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 listelenecektir. 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 zaman ayırın. Sol taraftaki menüde artık İkili Verilerle Çalışma öğreticileri için öğeler yer alır.

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çindedir (bkz. Şekil 4). Her yaklaşımın kendi artıları ve dezavantajları vardır ve daha ayrıntılı bir tartışmayı kabul eder.

İ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)

Her ürünle bir resmi ilişkilendirmek için Northwind veritabanını genişletmek istediğimizi düşünün. Seçeneklerden biri, bu görüntü dosyalarını web sunucusunun dosya sisteminde depolamak ve yolu tabloya Products kaydetmektir. Bu yaklaşımla, türündeki Productsvarchar(200)tabloya bir ImagePath sütun ekleyebiliriz. Bir kullanıcı Chai için bir resim karşıya yüklediğinde, bu resim web sunucusunun konumundaki dosya sisteminde ~/Images/Tea.jpgdepolanabilir ve burada ~ uygulamanın fiziksel yolunu temsil eder. Diğer bir ifadeyle, web sitesi fiziksel yolda C:\Websites\Northwind\köke sahipse, ~/Images/Tea.jpg ile eşdeğer C:\Websites\Northwind\Images\Tea.jpgolacaktı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 uygulamanın Images klasörüne yerleştirileceğine karar verirsek veya Tea.jpg kullanabiliriz~/Images/Tea.jpg.

İkili verileri dosya sisteminde depolamanın temel avantajları şunlardır:

  • Birazdan göreceğimiz gibi uygulama kolaylığı, doğrudan veritabanında depolanan ikili verileri depolamak ve almak, dosya sistemi aracılığıyla verilerle çalışırkenkinden biraz daha fazla kod içerir. Ayrıca, bir kullanıcının ikili verileri görüntüleyebilmesi veya indirebilmesi için bu verilerin URL'sini alması gerekir. Veriler web sunucusunun dosya sisteminde bulunuyorsa, URL basittir. Ancak veriler veritabanında depolanıyorsa, veritabanındaki verileri 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 isteriz.
  • İ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.

İkili verileri dosya sisteminde 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 karışık hale gelir. Ayrıca, veritabanını yedeklerken, dosya sistemindeki ilişkili ikili verilerin de yedeklendiğinden emin olmamız gerekir. Veritabanını başka bir siteye veya sunucuya taşımak benzer zorluklara yol açar.

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 uzunluklu veri türlerinde olduğu gibi, bu sütunda tutulabilecek ikili verilerin maksimum uzunluğunu belirtebilirsiniz. Örneğin, en fazla 5.000 bayt ayırmak için kullanın varbinary(5000); varbinary(MAX) maksimum 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ı eşleştirmedir. 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.

Not

Microsoft SQL Server 2000 ve önceki sürümlerde 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'te 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'nin gelecekteki bir sürümünde kaldırılacağını duyurduimage.

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

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

3. Adım: Sütunu TabloyaCategoriesEklemeBrochurePath

Ş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 sağ tıklayın Categories 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.

Adlı BrochurePath ve izin veren NULL tabloya Categories yeni varchar(200) 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 Categories Sütun Ekleme BrochurePath (Tam boyutlu görüntüyü görüntülemek için tıklayın)

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

CategoriesDataTable Veri Erişim Katmanındaki (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, CategoriesDataTable yalnızca ilk üç sütun vardı; NumberOfProducts sütun , Ayrıntılar Veri Listesi ile Ana Kayıtların Madde İşaretli Listesini Kullanarak Ana/Ayrıntı öğreticisine eklendi.

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 Categories , CategoryNameve Description alanlarını döndürür. Ana sorgu, otomatik olarak oluşturulan Insert ve Update yöntemleri tarafından kullanılan sorgudur.
  • GetCategoryByCategoryID(categoryID), kategorikimliğiCategoryID eşit olan CategoryID kategorinin , CategoryNameve Description alanlarını döndürür.
  • GetCategoriesAndNumberOfProducts()- tablodaki CategoryIDtüm kayıtlar Categories için , CategoryNameve Description 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 Picture veya sütunları döndürmediğini Categories ve bu alanlar için s sağlamadığını DataColumnCategoriesDataTable göz önünde BrochurePath bulundurun. Resim ve BrochurePath özelliklerle çalışmak için önce bunları CategoriesDataTable öğesine eklememiz ve ardından sınıfı bu sütunları döndürecek şekilde güncelleştirmemiz CategoriesTableAdapter 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ı Column1yeni DataColumn bir oluşturur. Bu sütunu olarak Pictureyeniden adlandırın. Özellikler penceresi s DataType özelliğini System.Byte[] olarak ayarlayın DataColumn (açılan listede bu bir seçenek değildir; bunu yazmanız gerekir).

DataType'ı System.Byte olan DataColumn Adlandırılmış Resmi Oluşturma[]

Şekil 6: Adlandırılmış System.Byte[]PictureDataType Olan Oluşturma DataColumn (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 DataType değeri () kullanarak adlandırınSystem.StringBrochurePath.

TableAdapter'danPictureveBrochurePathDeğerlerini döndürme

bu ikisi DataColumn öğesine CategoriesDataTableeklendiğinde, güncelleştirmeye CategoriesTableAdapterhazırız. Bu sütun değerlerinin her ikisi de ana TableAdapter sorgusunda döndürülebilir, ancak bu yöntem her GetCategories() çağrıldığında ikili verileri geri getirir. Bunun yerine, ana TableAdapter sorgusunu güncelleştirerek belirli BrochurePath bir kategori Picture sütununu döndüren ek bir veri alma yöntemi oluşturalım.

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 deyimleri kullanılırken, ana sorgudaki sütun listesi güncelleştirilirken TableAdapter'daki tüm SELECT sorgu yöntemleri için sütun listesi güncelleştirilir. Bu, yönteminin 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öntemine 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 sql deyimini, yeni saklı yordamı veya mevcut bir 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 SEÇ'i seçin

Şekil 9: Sorgu Kategoriler Tablosundan Bir Kayıt Döndüreceğinden, satırları döndüren SELECT'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 Döndürme desenleri için ve GetCategoryWithBinaryDataByCategoryID kullanınFillCategoryWithBinaryDataByCategoryID. 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ı bir şemayla veri 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üğünü belirtiyor. Ama istediğimiz bu, bu iletiyi göz ardı edebilirsiniz.

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

öğesine ve GetCategoryWithBinaryDataByCategoryID yöntemini CategoriesTableAdapterekledikten DataColumnCategoriesDataTable sonra, Türü Yazılan Veri Kümesi Tasarım Aracı bu sınıfların Şekil 11'deki ekran görüntüsüne benzemesi gerekir.

DataSet Tasarım Aracı Yeni Sütunları ve Yöntemi Içerir

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

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

DAL güncelleştirildikten sonra geriye kalan tek şey İş Mantığı Katmanı'nı (BLL) yeni CategoriesTableAdapter yönteme yönelik 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 Function GetCategoryWithBinaryDataByCategoryID(categoryID As Integer) _
    As Northwind.CategoriesDataTable
    
    Return Adapter.GetCategoryWithBinaryDataByCategoryID(categoryID)
End Function

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

İkili veriler toplanırken, bu veriler genellikle bir 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. Daha sonra karşıya yüklenen verilerin veri modeliyle tümleştirilmesi gerekir. Bu, dosyayı web sunucusunun dosya sistemine kaydetme ve veritabanındaki dosyanın yolunu 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 s 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.

Karşıya dosya yüklemeyi göstermek için klasördeki sayfayı FileUpload.aspx açın, Araç Kutusundan bir FileUpload denetimini Tasarım Aracı sürükleyin ve control s ID özelliğini olarak UploadTestBinaryData ayarlayın. Ardından, sırasıyla ve Text özelliklerini ayarlayıp ID 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 UploadDetailsayarlayınID.

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österilir. 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 açar. 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 örnekte, bir ~/Brochures klasör oluşturalım ve karşıya yüklenen dosyayı buraya kaydedelim. İlk olarak klasörü kök dizinin alt klasörü olarak siteye ekleyin Brochures . Ardından, s Click olayı için UploadButton bir olay işleyicisi oluşturun ve aşağıdaki kodu ekleyin:

Protected Sub UploadButton_Click(sender As Object, e As EventArgs) _
    Handles UploadButton.Click
    
    If UploadTest.HasFile = False Then
        ' 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
        Dim filePath As String = _
            Server.MapPath("~/Brochures/" & UploadTest.FileName)
        UploadTest.SaveAs(filePath)
    End If
End Sub

FileUpload denetimi, karşıya yüklenen verilerle çalışmaya yönelik çeşitli özellikler sağlar. Örneğin,HasFile özelliği bir dosyanın kullanıcı tarafından karşıya yüklenip yüklenmediğini gösterirken FileBytes özelliği, 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'e kaydeder. filePath, sanalyol (C:\Websites\Brochures\SomeFile.pdf) yerine fiziksel bir yol (/Brochures/SomeFile.pdf) olmalıdır. 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 Server.MapPathhakkında daha fazla bilgi için bkz. Server.MapPath Methos.

Olay işleyicisini Click tamamladıktan sonra, sayfayı tarayıcıda test etmek için biraz zaman ayırın. 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 Kaydetmenin Incelikleri

Dosyaları web sunucusunun dosya sistemine kaydederken ele alınması gereken birkaç incelik vardır. İlk olarak, güvenlik sorunu var. Bir 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ı altı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 zorluğu da dosyaları adlandırma etrafında döner. Şu anda sayfamız karşıya yüklenen tüm dosyaları istemcinin ~/Brochures bilgisayarındaki dosyayla aynı adı kullanarak dizine kaydeder. Kullanıcı A adlı Brochure.pdfbir broşür yüklerse, dosya olarak ~/Brochure/Brochure.pdfkaydedilir. Ancak daha sonra B kullanıcısı aynı dosya adına (Brochure.pdf) sahip olan farklı bir broşür dosyasını karşıya yüklerse ne olur? Şu anda sahip olduğumuz kodla, Kullanıcı A'nın dosyasının üzerine Kullanıcı B'nin yüklenmesiyle birlikte 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 kendi dosyasını kaydetmez ve bunun yerine B Kullanıcısını dosyayı yeniden adlandırması ve yeniden denemesi konusunda bilgilendiren 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şkilendirildiği varsayılarak) değer olabilecek benzersiz bir dosya adı kullanarak kaydetmektir. Sonraki öğreticide bu seçenekleri daha ayrıntılı bir şekilde 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 miktarlarda 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 Web.configöğesi aracılığıyla <httpRuntime> 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 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 devam ettiğini onaylamadan sabırla beklemesi gerekir. Bu, birkaç saniye içinde karşıya yüklenebilen daha küçük dosyalarla çalışırken çok fazla sorun oluşturmaz, ancak karşıya yüklenmesi dakikalar sürebilecek daha büyük dosyalarla uğraşırken 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 araştırmanız 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ışmaktadır. Son kitabı Sams Teach Yourself ASP.NET 24 Saat içinde 2.0. Adresine adresinden veya adresinden ulaşabileceğiniz http://ScottOnWriting.NETblogu aracılığıyla ulaşabilirsinizmitchell@4GuysFromRolla.com.

Ö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, bana bir satır mitchell@4GuysFromRolla.combırakın.