转载请保留: 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.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.
转载请保留: http://www.RiaHome.cn , 小弟会感谢万分的.
源文件下载: 压缩包下载