【原创】flex结合asp.net上传深入详细解说

      Flex和AIR 2007-9-15 12:12

转载请保留: http://www.RiaHome.cn , 小弟会感谢万分的.

        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.SELECTIOErrorEvent.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.
    转载请保留: http://www.RiaHome.cn , 小弟会感谢万分的.

源文件下载:  压缩包下载


标签集:TAGS:Flex AS3 ASP.NET
回复Comments() 点击Count()

回复Comments

{commenttime}{commentauthor}

{CommentUrl}
{commentcontent}