flex結合asp.net上傳深入詳細解說
Flex/Flash, Flex2, Flex3 GgNET 01月 23rd. 2008, 10:41am
Flex(或者說AS3.0, 下同) 結合 ASP.NET 上傳的例子在網上搜尋一下就可以找到. 但, 在ASP.NET裡面是如何獲知 Flex 傳遞過來的資料呢? 在Html頁裡面, 有Form標籤, 通常在Form標籤裡面都會有諸如 <input id=”myFile” type=”file” runat=”server”/> 這行代碼的, 通過那個 id 名, 我們拿來就用: myFile.PostedFile.ContentLength(上傳檔案的大小, 單位是位元組數)、myFile.PostedFile.FileName(用戶端上傳檔案的完全路徑) …… 因為 myFile.PostedFile 已經是 HttpPostedFile 對象了. 但, 用 Flex 提交給 ASP.NET 的話, 如何擷取 和 如何使用 所提交的 HttpPostedFile 對象呢? 結合官方的解釋, 結合 PHP 的例子, 我終於有頭緒了. 如果您已經懂了, 看完這篇文後請多多指點^_^, 我部落格是: www.RiaHome.cn
(本文假設您已經對 Flex 和 ASP.NET 有一定的基礎, 現在只拿核心代碼來解說, 下面有完整的源檔案下載的) [ 我部落格-http://www.RiaHome.cn ]
假設我們已經建立了一個 FileReference 對象( private var file:FileReference = new FileReference(); )並且為 FileReference 對象添加好需要的接聽程式(如偵聽 Event.SELECT、IOErrorEvent.IO_ERROR事件等等), 那麼在使用者已經選擇好要上傳的檔案後, 我們需要做的事就是它上傳到遠程伺服器端指令碼(這裡是 ASP.NET), 那麼我們執行: file.upload(new URLRequest(”upFile.aspx”)); 預設情況下, Flex 會使用 POST 方法上傳的.
官方文檔裡提供的一個 HTTP POST 請求範例(請留意不同顏色的高亮的地方):
POST /handler.asp HTTP/1.1
Accept: text/*
Content-Type: multipart/form-data;
boundary=———-Ij5ae0ae0KM7GI3KM7ei4cH2ei4gL6
User-Agent: Shockwave Flash
Host: www.mydomain.com
Content-Length: 421
Connection: Keep-Alive
Cache-Control: no-cache
————Ij5ae0ae0KM7GI3KM7ei4cH2ei4gL6
Content-Disposition: form-data; name=”Filename”
sushi.jpg
————Ij5ae0ae0KM7GI3KM7ei4cH2ei4gL6
Content-Disposition: form-data; name=”Filedata“; filename=”sushi.jpg”
Content-Type: application/octet-stream
Test File
————Ij5ae0ae0KM7GI3KM7ei4cH2ei4gL6
Content-Disposition: form-data; name=”Upload”
Submit Query
————Ij5ae0ae0KM7GI3KM7ei4cH2ei4gL6
(actual file data,,,)
在上面的 HTTP POST 請求範例裡, 你會發現name=”Filedata“; filename=”sushi.jpg” 這些的. 其中 Filedata就是 System.Web.HttpPostedFile 對象, filename 變數就是上傳檔案的名字了(下面會在 ASP.NET 裡接收這個變數的). 如果我們能擷取這個System.Web.HttpPostedFile 對象, 那麼我們就可以知道上傳檔案的大小(ContentLength屬性)、類型(ContentType屬性)、用戶端上傳檔案的完全路徑(FileName屬性)等等. 那麼在 ASP.NET 裡怎樣擷取和使用 Filedata 呢?
請看看在網上找到的 ASP.NET 的代碼(請留意高亮部分):
<script language=”C#” runat=”server”>
string uploadFolder = “upLoadedFiles”; // 存放上傳檔案的伺服器上的檔案夾
private void Page_Load(object sender, System.EventArgs e){
/*
下面那句就是接收 Flex 提交過來的 System.Web.HttpFileCollection
對象. 至於為什麼會是” Request.Files ”, 我也不清楚. 是規定? 還是什麼呢? 我看了用 PHP 的, 也是 FILES 的. 不知道為什麼, 有望高手指點!
*/
HttpFileCollection files = Request.Files;
if (files.Count == 0){
Response.Write(”請勿直接存取本檔案“);
Response.End();
}
string path = Server.MapPath(uploadFolder);
// 只取第 1 個檔案
HttpPostedFile file = files[0];
if (file != null && file.ContentLength > 0){
// Request.Form["filename"] 這一句就是獲得上傳檔案的名稱.
string savePath = path + “/” + Request.Form["filename"];
file.SaveAs(savePath);
}
/*
下面這些是我另加上去的, 測試之用. 下面這些輸出的資料能用 FileReference
對象偵聽的 DataEvent.UPLOAD_COMPLETE_DATA
事件所獲得. 大家可以下載源檔案親手測試一下.
*/
Response.Write(Request.Form["filename"]);
Response.Write(Request.Files);
Response.Write(Request.Files["Filedata"]);
Response.Write(Request.Files["Filedata"].ContentLength);
}
</script>
分別解釋上面那四句 Response.Write()
語句:
Response.Write(Request.Form["filename"]);
第一句將會輸出上傳檔案的名稱, 如: “ myPhoto.jpg “
Response.Write(Request.Files);
第二句將會輸出: “ System.Web.HttpFileCollection “. 說明了 Request.Files 是 Flex(或者說 AS3 )提交過來的 HttpFileCollection 對象, 它包含多個 HttpPostedFile 對象.
Response.Write(Request.Files["Filedata"]);
第三句將會輸出: “System.Web.HttpPostedFile ”. 因為上面說過 Request.Files 是一個包含多個 HttpPostedFile 對象的 HttpFileCollection 對象, 那麼要取得Request.Files 裡面其中一個HttpPostedFile 對象的話, 可以這樣取得: Request.Files[0], 或者這樣取得: Request.Files["Filedata"] .
還記得AS3.0 裡面上傳的語句嗎? 就是: file.upload(new URLRequest(”upFile.aspx”)); FileReference 對象的 upload() 方法完整的使用是:
upload(request:URLRequest, uploadDataFieldName:String=”Filedata”, testUpload:Boolean=alse):
大家看看第二個參數, 因為預設的值為 “Filedata” , 所以這裡是: Request.Files["Filedata"] . 如果您自訂了第二個參數( 如: “ myData ” ), 那麼您必須這樣來取得: Request.Files["myData"].
Response.Write(Request.Files["Filedata"].ContentLength);
第四句將會輸出上傳檔案的大小. 上面第三句說過了 Request.Files["Filedata"] 是一個 HttpPostedFile
對象, 所以它會包含一些屬性: 上傳檔案的大小(ContentLength屬性)、類型(ContentType屬性)、用戶端上傳檔案的完全路徑(FileName屬性)等等.
通過上面的測試, 如果您只上傳一個檔案的話, 那個 ASP.NET 檔案也可以這樣寫:
<script language=”C#” runat=”server”>
string uploadFolder = “upLoadedFiles”;
private void Page_Load(object sender, System.EventArgs e){
string path = Server.MapPath(uploadFolder);
HttpPostedFile file = Request.Files["Filedata"];
if (file != null && file.ContentLength > 0){
string savePath = path + “/” + Request.Form["filename"];
file.SaveAs(savePath);
}
}
</script>
轉載自: http://www.RiaHome.cn
源檔案下載: 壓縮包下載