五十四:添加新記錄時包含一個文件上傳選項_第1頁
五十四:添加新記錄時包含一個文件上傳選項_第2頁
五十四:添加新記錄時包含一個文件上傳選項_第3頁
五十四:添加新記錄時包含一個文件上傳選項_第4頁
五十四:添加新記錄時包含一個文件上傳選項_第5頁
已閱讀5頁,還剩15頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、在ASP.NET 2.0中操作數(shù)據(jù)之五十四:添加新記錄時包含一個文件上傳選項作者:heker2007 字體:增加 減小 類型:轉(zhuǎn)載 時間:2016-05-17 我要評論上篇文章主要介紹了,ASP.NET 2.0中如何顯示二進制數(shù)據(jù),本文主要介紹如何將圖片上傳,轉(zhuǎn)換成二進制數(shù)據(jù)保存在數(shù)據(jù)庫中。導(dǎo)言:在前面2節(jié)教程,我們探討了如何使用FileUpload控件從客戶端向服務(wù)器上傳文件,以及如何在數(shù)據(jù)Web控件里顯示二進制數(shù)據(jù)。在本節(jié),我們將創(chuàng)建一個web頁面以添加新的種類。除了為類的name和description屬性添加TextBoxes控件外,我們還要在頁面上添加2個File

2、Upload控件一個用來上傳新類的圖片,另一個用來上傳類的小說明冊子。上傳的圖片將直接存儲在新記錄的Picture列。與此相反,小冊子將存儲在/Brochures 文件夾,同時將文件路徑存儲在新記錄的BrochurePath列。在創(chuàng)建頁面之前,我們需要更新體系結(jié)構(gòu)。由于CategoriesTableAdapter的主查詢并不返回Picture列,因此自動生產(chǎn)的Insert方法只包含了CategoryName, Description和BrochurePath列。我們需要在TableAdapter里創(chuàng)建新的方法以包括Categories的4個列。同時業(yè)務(wù)邏輯層的的CategoriesBLL類也需

3、要更新。第1步:在CategoriesTableAdapter添加一個InsertWithPicture方法在前面的教程創(chuàng)建一個數(shù)據(jù)訪問層里我們創(chuàng)建了CategoriesTableAdapter,并設(shè)置其自動生成了基于主查詢的INSERT, UPDATE和DELETE命令。此外,我們設(shè)置該TableAdapter啟用DB Direct方法,它將創(chuàng)建Insert, Update和Delete方法。這些方法執(zhí)行自動生成的INSERT, UPDATE和DELETE命令,自然而然的,其接受的輸入?yún)?shù)基于主查詢所返回的那些列。在教程使用FileUpload上傳文件里,我們擴展了 CategoriesTa

4、bleAdapter的主查詢以包含BrochurePath列。因為CategoriesTableAdapter的主查詢并為引用Picture,在添加新記錄或更新記錄時不能涉及Picture值。為了獲取Picture信息,我們要么在TableAdapter里創(chuàng)建一個新方法以插入Picture的二進制數(shù)據(jù);要么定制自動生成的INSERT命令。但定制自動生成的INSERT命令有一個風險,即定制的INSERT命令有可能被向?qū)Ц采w。比如,假設(shè)我們定制INSERT命令使用Picture列,更新TableAdapter的Insert方法,使之多包含一個對應(yīng)picture二進制數(shù)據(jù)的參數(shù)。然后在業(yè)務(wù)邏輯層創(chuàng)建

5、一個方法使用該 DAL方法,再在表現(xiàn)層調(diào)用該業(yè)務(wù)邏輯層方法。現(xiàn)在一切工作正常,但當下一次在TableAdapter設(shè)置向?qū)Ю镌O(shè)置TableAdapter完成后,我們定制的INSERT命令馬上就會被向?qū)е貙?,回歸到定制前的狀態(tài)。其結(jié)果是我們的代碼將無法編譯!注意:如果使用存儲過程而不用SQL語句的話,就不存在這個問題。在以后的教程里,我們將探討在數(shù)據(jù)訪問層用存儲過程替代SQL語句。為避免這個頭痛的問題,我們?yōu)門ableAdapter添加新的方法,而不定制自動生成的SQL命令。我們?yōu)樘砑拥姆椒麨镮nsertWithPicture,它接受 CategoryName, Description, B

6、rochurePath和Picture值;執(zhí)行INSERT命令將上述值添加進一條記錄。在CategoriesTableAdapter的頂部點右鍵,選擇“添加查詢”。進入TableAdapter 查詢設(shè)置向?qū)?,首先詢問我們TableAdapter查詢?nèi)绾卧L問數(shù)據(jù)庫,選擇“使用SQL語句”,點Next,因為我們要為表Categories添加新記錄,選“INSERT”,點Next。圖1:選“INSERT”選項現(xiàn)在,我們需要指定INSERT SQL語句。向?qū)ё詣拥厣梢粋€基于主查詢的INSERT語句。此時,它只插入CategoryName, Description和BrochurePath值。對其更新

7、,包括Picture列和參數(shù)Picture ,如下:?1234INSERT INTO Categories (CategoryName, Description, BrochurePath, Picture)VALUES (CategoryName, Description, BrochurePath, Picture)最后,向?qū)б覀優(yōu)榉椒?,取名為InsertWithPicture,點Finish。圖2:為新方法命名為InsertWithPicture 第2步:更新業(yè)務(wù)邏輯層由于一般來說表現(xiàn)層將引用業(yè)務(wù)邏輯層,而不是繞過它直接引用數(shù)據(jù)訪問層,我們需要創(chuàng)建一個

8、業(yè)務(wù)邏輯層方法,以調(diào)用剛才創(chuàng)建的數(shù)據(jù)訪問層方法(InsertWithPicture),本節(jié),我們在CategoriesBLL里創(chuàng)建一個名為InsertWithPicture方法,它接受3個字符串和一個byte數(shù)組,字符串參數(shù)對應(yīng)name, description和brochure文件地址;byte數(shù)組對應(yīng)于圖片的二進制內(nèi)容。就像下面的代碼所顯示的那樣,BLL方法調(diào)用相應(yīng)DAL方法:?1234567System.ComponentModel.DataObjectMethodAttribute (System.ComponentModel.DataObjectMethodType.Ins

9、ert, false)public void InsertWithPicture(string categoryName, string description, string brochurePath, byte picture) Adapter.InsertWithPicture(categoryName, description, brochurePath, picture);注意:在為BLL添加InsertWithPicture方法前,確保已經(jīng)保存了數(shù)據(jù)集(Typed DataSet ),因為CategoriesTableAdapter類的代碼是基于Typed Da

10、taSet自動生成的。如果最開始沒有把對Typed DataSet所進行的修改保存的話,Adapter屬性將不認同InsertWithPicture方法。第3步:列出現(xiàn)有的種類及其二進制數(shù)據(jù)本教程我們將創(chuàng)建一個頁面,允許用戶添加新的類,包含其圖片和說明小冊子。在上一節(jié),我們用一個包含TemplateField和ImageField的GridView控件來展示每個類的名稱、描述,并包含一個下載說明小冊子的鏈接。在本教程,我們實現(xiàn)相同的功能,創(chuàng)建一個頁面,即展示現(xiàn)有的類,還可以添加新的類。打開BinaryData文件夾的DisplayOrDownload.aspx頁面,切換到源模式,復(fù)制GridV

11、iew和ObjectDataSource控件的聲明代碼,粘貼在UploadInDetailsView.aspx頁面的<asp:Content>元素里。同時不要忘記將后臺代碼類的GenerateBrochureLink方法拷貝到UploadInDetailsView.aspx的后臺代碼類里。圖3:將DisplayOrDownload.aspx頁面的聲明代碼拷貝到頁面UploadInDetailsView.aspx完成以后,在瀏覽器里查看該頁面,確保一切正常。GridView控件里列出了8個類,每個類包含一張圖片以及一個下載說明小冊子的鏈接。圖4:你應(yīng)該看到每個類及其相應(yīng)二進制數(shù)據(jù)第4

12、步:設(shè)置CategoriesDataSource以支持添加功能那個ID為Categories的GridView控件所使用的名為CategoriesDataSource的 ObjectDataSource控件目前還不支持添加數(shù)據(jù)。為實現(xiàn)該功能,我們要設(shè)置該控件的Insert方法引用類CategoriesBLL的某個方法。具體的講,我們要用到在第2步里添加的InsertWithPicture方法。在ObjectDataSource控件的智能標簽里,點“設(shè)置數(shù)據(jù)源”。照原樣一直點到“Define Data Methods”界面。再點INSERT標簽,從下拉列表里選方法“InsertWithPictu

13、re”,點Finish完成設(shè)置。圖5:設(shè)置ObjectDataSource控件使用InsertWithPicture方法注意:當完成設(shè)置后,Visual Studio會問你是否“刷新Fields and Keys”,選擇No,因為如果選Yes的話,將重新構(gòu)造data Web controls fields,那樣將重寫所有我們已經(jīng)定制好的列(field)。完成設(shè)置后,ObjectDataSource控件將會為InsertMethod屬性賦值,同時包含一個<InsertParameters>,如下面的聲明代碼所示:?12345678910<asp:ObjectDataSource

14、 ID="CategoriesDataSource" runat="server" OldValuesParameterFormatString="original_0" SelectMethod="GetCategories" TypeName="CategoriesBLL" InsertMethod="InsertWithPicture"> <InsertParameters> <asp:Parameter

15、Name="categoryName" Type="String" /> <asp:Parameter Name="description" Type="String" /> <asp:Parameter Name="brochurePath" Type="String" /> <asp:Parameter Name="picture" Type="Object" /&g

16、t; </InsertParameters></asp:ObjectDataSource>第5步:創(chuàng)建一個插入界面在教程16概述插入、更新和刪除數(shù)據(jù)里我們談到,當DetailsView控件的數(shù)據(jù)源控件支持添加功能時,便可以啟用DetailsView內(nèi)置的添加界面。讓我們在頁面上添加一個DetailsView控件,置于GridView控件之上,并處于添加模式。當在DetailsView控件里添加一個新種類時,其下的GridView控件將自動發(fā)生刷新,并將剛添加的類顯示出來。從工具箱拖一個DetailsView控件到頁面,置于GridView之上,設(shè)其ID為New

17、Category,清空其Height和Width屬性。 其智能標簽里,設(shè)置它綁定到名為CategoriesDataSource的數(shù)據(jù)源,并啟用“插入”功能。圖6:將DetailsView控件綁定到CategoriesDataSource,并啟用插入功能。為使DetailsView呈現(xiàn)為插入界面,設(shè)其DefaultMode屬性為Insert我們注意到,盡管DetailsView控件有5個BoundFieldsCategoryID, CategoryName, Description, NumberOfProducts和BrochurePath,但插入界面并不包含CategoryID,因為Cate

18、goryID列的InsertVisible屬性為false。為什么會顯示這4個列呢?因為ObjectDataSource調(diào)用的GetCategories()方法返回的就是這些列。當添加新類時,我們不希望用戶為NumberOfProducts列指定值,此外,我們還希望讓用戶為新類上傳圖片和相關(guān)的PDF小冊子。在DetailsView里將NumberOfProducts列完成刪除,再分別CategoryName列和BrochurePath列的HeaderText屬性設(shè)置為“Category”和“Brochure”。將BrochurePath 轉(zhuǎn)換為TemplateField,再添加一個Templa

19、teField,設(shè)其HeaderText屬性為“Picture”,把它放置在BrochurePath列和CommandField列之間。圖7:將DetailsView控件綁定到CategoriesDataSource,并啟用插入功能(注:圖片說明有誤)當你在“編輯列”對話框里將BrochurePath BoundField 轉(zhuǎn)換為一個TemplateField后,該TemplateField將包含3個模板:ItemTemplate,EditItemTemplate和InsertItemTemplate,由于我們只需要InsertItemTemplate模板,將另外2個模板刪除。如此,你的Det

20、ailsView控件的聲明代碼看起來應(yīng)該像下面的這樣:?123456789101112131415161718192021<asp:DetailsView ID="NewCategory" runat="server" AutoGenerateRows="False" DataKeyNames="CategoryID" DataSourceID="CategoriesDataSource" DefaultMode="Insert"> 

21、<Fields> <asp:BoundField DataField="CategoryID" HeaderText="CategoryID"  InsertVisible="False" ReadOnly="True"  SortExpression="CategoryID" /> <asp:BoundField DataField="CategoryName" HeaderText=

22、"Category"  SortExpression="CategoryName" /> <asp:BoundField DataField="Description" HeaderText="Description"  SortExpression="Description" /> <asp:TemplateField HeaderText="Brochure" SortExpression

23、="BrochurePath">  <InsertItemTemplate>  <asp:TextBox ID="TextBox1" runat="server"   Text='<%# Bind("BrochurePath") %>'></asp:TextBox>  </InsertItemTemplate> </asp:Tem

24、plateField> <asp:TemplateField HeaderText="Picture"></asp:TemplateField> <asp:CommandField ShowInsertButton="True" /> </Fields></asp:DetailsView>為Brochure和Picture Fields添加FileUpload控件當前,BrochurePath TemplateField的InsertItemTemplate模

25、板包含一個TextBox,而Picture TemplateField并不包含任何的模板,我們?yōu)檫@2個TemplateField的InsertItemTemplate模板模板添加FileUpload控件。從DetailsView控件的智能標簽選擇“編輯模板”,從下拉列表選擇BrochurePath TemplateField的InsertItemTemplate模板,將模板里的TextBox刪除,從工具箱拖一個FileUpload控件到頁面,設(shè)其ID為BrochureUpload。類似的,為Picture TemplateField的InsertItemTemplate模板添加一個ID為Pic

26、tureUpload的FileUpload控件。圖8:在InsertItemTemplate模板里添加一個FileUpload控件完成添加后,這2個TemplateField的聲明代碼應(yīng)該和下面的差不多:?12345678910<asp:TemplateField HeaderText="Brochure" SortExpression="BrochurePath"> <InsertItemTemplate> <asp:FileUpload ID="BrochureUpload" ru

27、nat="server" /> </InsertItemTemplate></asp:TemplateField><asp:TemplateField HeaderText="Picture"> <InsertItemTemplate> <asp:FileUpload ID="PictureUpload" runat="server" /> </InsertItemTemplate></asp

28、:TemplateField>當用戶添加一個新類時,我們希望確保上傳的圖片和說明小冊子是恰當?shù)奈募愋?。對說明小冊子,必須是PDF類型;對圖片,我們需要用戶上傳一個image文件。那是不是image文件必須是某個特定的類型呢,比如GIF或JPG?考慮到其它不同類型的文件,我們需要擴展表Categories的列以包含這些類型的文件,同時我們可以在頁面DisplayCategoryPicture.aspx里通過Response.ContentType將這些文件發(fā)送到客戶端。由于表Categories現(xiàn)在并沒有這樣的列,我們只有限制用戶上傳指定為某種類型的image文件。表Categories

29、里現(xiàn)有的images為位圖,不過使用JPG類型或許更恰當。當用戶上傳的文件類型不正確時,我們將取消插入操作,并顯示一個提示信息。在DetailsView控件下添加一個Label Web控件,設(shè)ID為UploadWarning,清除Text屬性,設(shè)CssClass屬性為“Warning”, 再將Visible和EnableViewState屬性都設(shè)為false。Warning CSS定義在Styles.css里,作用是將文字顯示為粗斜體,紅色大號字。注意:最理想的情況是將CategoryName和Description BoundFields都轉(zhuǎn)換為TemplateFields,達到定制插入界面

30、的目的。比如,對Description插入界面來說,使用一個允許分行的文本框或許更好;對CategoryName插入界面,因為CategoryName不允許為NULL值,我們應(yīng)該添加一個RequiredFieldValidator控件,以確保輸入類的名稱。這些步驟都留給讀者做練習,更深入的探討請參考前面的教程之20定制數(shù)據(jù)修改界面第6步:將上傳的小冊子保存在服務(wù)器的文件系統(tǒng)但用戶鍵入相關(guān)的類別信息,點Insert按鈕后,發(fā)生頁面回傳,接著發(fā)生一連串的插入流程。首先,DetailsView控件的ItemInserting event事件發(fā)生;接著,調(diào)用ObjectDataSource控件的Ins

31、ert()方法,它將導(dǎo)致Categories表添加新記錄;最后,發(fā)生DetailsView控件的ItemInserted event事件。在調(diào)用ObjectDataSource控件的Insert()方法以前,我們必須確保用戶已經(jīng)上傳了恰當?shù)奈募⒈4嬖诜?wù)器的文件系統(tǒng)。為此,我們?yōu)镈etailsView控件的ItemInserting事件創(chuàng)建一個事件處理器,添加如下的代碼:?1234567891011121314151617/ Reference the FileUpload controlFileUpload BrochureUpload = (FileUpload)NewCate

32、gory.FindControl("BrochureUpload"); if (BrochureUpload.HasFile) / Make sure that a PDF has been uploaded if (string.Compare(System.IO.Path.GetExtension (BrochureUpload.FileName), ".pdf", true) != 0)  UploadWarning.Text =  "Only PDF doc

33、uments may be used for a category's brochure." UploadWarning.Visible = true; e.Cancel = true; return; 代碼首先引用DetailsView控件模板里名為BrochureUpload的FileUpload控件,如果已經(jīng)上傳了文件,就檢查FileUpload控件的extension是否為“.PDF”, 如果不是則取消插入操作并退出。注意:通過檢查文件的擴展名(extension)來確保用戶上傳的為PDF文件的做法并不是萬全之策。比如,可能用戶

34、的確上傳的是PDF文件,只不過其擴展名為.Brochure;或者用戶提供的并不是PDF文件,卻使用.pdf的擴展名。保險的做法是通過編程對文件內(nèi)容做最后一次檢查。如此一來,雖然徹底,但稍嫌過頭(overkill)。在絕大多數(shù)情況下,檢查文件擴展名就已經(jīng)足夠了。就像在教程使用FileUpload上傳文件里討論的那樣,將文件保存在文件系統(tǒng)里時要特別小心,以免覆蓋別人上傳的文件。本節(jié),我們嘗試對上傳文件使用一個已經(jīng)使用的名字,在名字末尾添加一個數(shù)字,以示區(qū)別。舉例,如果在文件夾/Brochures里存在一個名為Meats.pdf的文件,上傳文件時我們?nèi)∶麨镸eats-1.pdf,如果文件夾里恰好也存

35、在一個Meats-1.pdf文件,我們就取名為Meats-2.pdf,以此類推,直到文件名唯一為止。下面的代碼使用File.Exists(path)方法來判斷是否已經(jīng)存在同名文件,如果存在,就重新命名,直到名字唯一為止:?12345678910111213const string BrochureDirectory = "/Brochures/"string brochurePath = BrochureDirectory + BrochureUpload.FileName;string fileNameWithoutExtension = System.IO.P

36、ath.GetFileNameWithoutExtension(BrochureUpload.FileName); int iteration = 1; while (System.IO.File.Exists(Server.MapPath(brochurePath) brochurePath = string.Concat(BrochureDirectory, fileNameWithoutExtension, "-", iteration, ".pdf"); iteration+;一旦找到唯一的文件名

37、后,立即將文件保存在文件系統(tǒng),同時更新ObjectDataSource控件的InsertParameter參數(shù)brochurePath的值,以便將文件名寫入數(shù)據(jù)庫。就像在教程使用FileUpload上傳文件里看到的一樣,可以使用FileUpload控件的SaveAs(path)方法來保存文件。使用e.Values集合來更新ObjectDataSource控件的參數(shù)brochurePath。?123/ Save the file to disk and set the value of the brochurePath parameterBrochureUpload.SaveAs(Server.

38、MapPath(brochurePath);e.Values"brochurePath" = brochurePath;第7步:將上傳的圖片保存到數(shù)據(jù)庫為了把上傳的圖片保存在新添加的記錄里,我們需要在DetailsView控件的ItemInserting事件里,用上傳的數(shù)據(jù)對ObjectDataSource控件的picture參數(shù)賦值。然而,在此之前,我們需要確保上傳的文件為JPG而不是其它的什么格式。就象在第6步中探討的一樣,我們用文件的擴展名來檢查其類型。雖然Categories表允許Picture列為NULL值,但所有的種類都應(yīng)該有一張圖片。在本頁面,我們強制用戶添加

39、記錄時提供圖片。下面的代碼確保已經(jīng)上傳圖片,且為恰當?shù)念愋汀?1234567891011121314151617181920212223242526/ Reference the FileUpload controlsFileUpload PictureUpload = (FileUpload)NewCategory.FindControl("PictureUpload");if (PictureUpload.HasFile) / Make sure that a JPG has been uploaded if (string.Compare(Syst

40、em.IO.Path.GetExtension(PictureUpload.FileName),  ".jpg", true) != 0 && string.Compare(System.IO.Path.GetExtension(PictureUpload.FileName),  ".jpeg", true) != 0)  UploadWarning.Text =  "Only JPG documents may be used for a

41、 category's picture." UploadWarning.Visible = true; e.Cancel = true; return; else / No picture uploaded! UploadWarning.Text = "You must provide a picture for the new category." UploadWarning.Visible = true; e.Cancel = true; return;

42、這些代碼應(yīng)放在第6步中的代碼前面,如果上傳的文件有問題,事件處理器在文件保存到文件系統(tǒng)前就結(jié)束了。假設(shè)上傳的文件沒有問題,然后我們用下面的代碼將上傳文件的數(shù)據(jù)分配給參數(shù)picture:?12/ Set the value of the picture parametere.Values"picture" = PictureUpload.FileBytes;完整的ItemInserting事件處理器下面是ItemInserting事件處理器的完整代碼:?12345678910111213141516171819202122232425262728293031323334353

43、63738394041424344454647484950515253545556575859606162636465666768protected void NewCategory_ItemInserting(object sender, DetailsViewInsertEventArgs e) / Reference the FileUpload controls FileUpload PictureUpload = (FileUpload)NewCategory.FindControl("PictureUpload"); if (Pic

44、tureUpload.HasFile)  / Make sure that a JPG has been uploaded if (string.Compare(System.IO.Path.GetExtension(PictureUpload.FileName),  ".jpg", true) != 0 &&  string.Compare(System.IO.Path.GetExtension(PictureUpload.FileName),  ".jpe

45、g", true) != 0)   UploadWarning.Text =  "Only JPG documents may be used for a category's picture."  UploadWarning.Visible = true;  e.Cancel = true;  return;   else  / No picture uploaded! UploadWa

46、rning.Text =  "You must provide a picture for the new category." UploadWarning.Visible = true; e.Cancel = true; return;   / Set the value of the picture parameter e.Values"picture" = PictureUpload.FileBytes;    

47、0;/ Reference the FileUpload controls FileUpload BrochureUpload = (FileUpload)NewCategory.FindControl("BrochureUpload"); if (BrochureUpload.HasFile)  / Make sure that a PDF has been uploaded if (string.Compare(System.IO.Path.GetExtension(BrochureUpload.FileNam

48、e),  ".pdf", true) != 0)   UploadWarning.Text =  "Only PDF documents may be used for a category's brochure."  UploadWarning.Visible = true;  e.Cancel = true;  return;   const string BrochureDirect

49、ory = "/Brochures/" string brochurePath = BrochureDirectory + BrochureUpload.FileName; string fileNameWithoutExtension =  System.IO.Path.GetFileNameWithoutExtension(BrochureUpload.FileName);  int iteration = 1;  while (System.IO.File.Exists(Server.Ma

50、pPath(brochurePath)   brochurePath = string.Concat(BrochureDirectory, fileNameWithoutExtension,  "-", iteration, ".pdf");  iteration+;   / Save the file to disk and set the value of the brochurePath parameter BrochureUpload.S

51、aveAs(Server.MapPath(brochurePath); e.Values"brochurePath" = brochurePath; 第8步:更新DisplayCategoryPicture.aspx頁面讓我們花幾分鐘測試我們在上幾步創(chuàng)建的插入界面和ItemInserting事件處理器。在瀏覽器查看UploadInDetailsView.aspx頁面 ,嘗試添加一個類,忽略picture或指定一個非JPG的圖片或非PDF的小冊子。以上任何一種情況下,都會顯示一個錯誤信息,并取消插入操作。圖9:當上傳的文件不對時將顯示一個警告信息確認頁面要

52、求上傳一張圖片,且不接受非PDF或非JPG文件。添加一個包含JPG格式圖片的新類別,將Brochure列置空,點擊Insert按鈕后,頁面回傳,將為Categories表添加一個新記錄,同時上傳的圖片數(shù)據(jù)直接存儲進數(shù)據(jù)庫。GridView控件更新后,將新添加的類顯示出來。但是,就像圖10所示的那樣,類的圖片沒有正確的顯示出來。圖10:新類的圖片沒有顯示出來圖片沒有顯示出來的原因是因為用來返回特定類的圖片的頁面DisplayCategoryPicture.aspx被設(shè)置為處理帶OLE報頭的位圖。當Picture列的數(shù)據(jù)被返回到客戶端前已經(jīng)把那78字節(jié)的報頭剝離掉。而且上傳的JPG文件并沒有OLE

53、報頭,因此,必需的字節(jié)已經(jīng)從圖片的二進制數(shù)據(jù)移除了。由于現(xiàn)在表Categories里既有JPG文件又有帶OLE報頭的位圖,我們需要對頁面DisplayCategoryPicture.aspx做調(diào)整,使它對原來的8個類剝離OLE報頭,而不對新添加的類進行剝離。在后面的教程,我們探討如何更新現(xiàn)有記錄的image文件,并將所有以前的類的圖片調(diào)整為JPG格式。現(xiàn)在,我們在頁面DisplayCategoryPicture.aspx 里用下面的代碼將原來的8個類的OLE報頭剝離。?123456789101112131415161718192021222324252627282930313233343536

54、3738protected void Page_Load(object sender, EventArgs e) int categoryID = Convert.ToInt32(Request.QueryString"CategoryID");  / Get information about the specified category CategoriesBLL categoryAPI = new CategoriesBLL(); Northwind.CategoriesDataTable categories =&#

55、160;categoryAPI.GetCategoryWithBinaryDataByCategoryID(categoryID); Northwind.CategoriesRow category = categories0;  if (categoryID <= 8)  / For older categories, we must strip the OLE header. images are bitmaps  / Output HTTP headers providing information about

56、the binary data Response.ContentType = "image/bmp"  / Output the binary data / But first we need to strip out the OLE header const int OleHeaderLength = 78; int strippedImageLength = category.Picture.Length - OleHeaderLength; byte strippedImageData = new bytestrippedImageLength; Array.Copy(category.Picture

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論