Karşıya Dosya Yükleme (VB)
tarafından Scott Mitchell
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ı BinaryData
yeni 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
Ş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.
Şekil 2: Kullanıcı Denetimini ekleme SectionLevelTutorialListing.ascx
Default.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.sitemap
sonra, öğ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.
Ş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.
Ş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 Products
varchar(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.jpg
depolanabilir 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.jpg
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 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 varbinary
bir 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 MAX
image
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 BrochurePath
ekleyeceğiz.
3. Adım: Sütunu TabloyaCategories
EklemeBrochurePath
Şu anda Kategoriler tablosunda yalnızca dört sütun vardır: CategoryID
, CategoryName
, Description
ve 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).
Ş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 veBrochurePath
Sü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
, Description
ve 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 tablodakiCategoryID
tüm kayıtlarınCategories
,CategoryName
veDescription
alanlarını döndürür. Ana sorgu, otomatik olarak oluşturulanInsert
veUpdate
yöntemleri tarafından kullanılan sorgudur.GetCategoryByCategoryID(categoryID)
, kategorikimliğiCategoryID
eşit olanCategoryID
kategorinin ,CategoryName
veDescription
alanlarını döndürür.GetCategoriesAndNumberOfProducts()
- tablodakiCategoryID
tüm kayıtlarCategories
için ,CategoryName
veDescription
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ı DataColumn
CategoriesDataTable
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'leriPicture
BrochurePath``DataColumn
ekleme
bu iki sütunu öğesine CategoriesDataTable
ekleyerek 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ı Column1
yeni DataColumn
bir oluşturur. Bu sütunu olarak Picture
yeniden 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).
Şekil 6: Adlandırılmış System.Byte[]
Picture
DataType
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.String
BrochurePath
.
TableAdapter'danPicture
veBrochurePath
Değerlerini döndürme
bu ikisi DataColumn
öğesine CategoriesDataTable
eklendiğinde, güncelleştirmeye CategoriesTableAdapter
hazı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.
Ş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.
Şekil 8: SQL deyimlerini kullan Seçeneğini belirleyin (Tam boyutlu görüntüyü görüntülemek için tıklayın)
Ş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.
Ş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 CategoriesTableAdapter
ekledikten DataColumn
CategoriesDataTable
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.
Ş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 UploadTest
BinaryData
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 UploadDetails
ayarlayınID
.
Ş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.
Ş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 False
bir 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/fileName
burada fileName karşıya yüklenen dosyanın adıdır. Sanal ve fiziksel yollar ve kullanma Server.MapPath
hakkı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!
Şekil 14: Dosya EvolutionValley.jpg
Web Sunucusuna Yüklendi (Tam boyutlu görüntüyü görüntülemek için tıklayın)
Ş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.pdf
bir broşür yüklerse, dosya olarak ~/Brochure/Brochure.pdf
kaydedilir. 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.pdf
bir 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:
- Large-Value Veri Türlerini Kullanma
- FileUpload Denetimi Hızlı Başlangıçları
- ASP.NET 2.0 FileUpload Sunucusu Denetimi
- Dosya Karşıya Yüklemelerinin Koyu Tarafı
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.
Geri Bildirim
https://aka.ms/ContentUserFeedback.
Çok yakında: 2024 boyunca, içerik için geri bildirim mekanizması olarak GitHub Sorunları’nı kullanımdan kaldıracak ve yeni bir geri bildirim sistemiyle değiştireceğiz. Daha fazla bilgi için bkz.Gönderin ve geri bildirimi görüntüleyin