绕过silverlight的安全限制的js和asp.net上传文件方法

绕过silverlight的安全限制的js和asp教程.net上传文件方法

1.silveright页面按钮调用承载页的js代码打开一个用于上传的aspx页面,文件的上传都是在这个页面中完成。

2.文件上传完成以后,上传页将上传的文件的文件名传回承载页,再由承载页传回silverlight,以完成其它的工作。

具体实现如下:

1.首先这个方法需要silverlight与承载页的js代码进行交互,所以必须完成以下的基础操作:

1 void FileUploader_Loaded(object sender, RoutedEventArgs e)
2        {
3            HtmlPage.RegisterScriptableObject("FileUploadCtrl", this);
4        }

 

 

在需要调用承载页的loaded事件中将本silverlight页面注册为脚本对象,这样承载页中的js代码就可以使用本页的后台代码中具有ScriptableMember特性的方法了,如以下方法:

 

1 [ScriptableMember]
2         public void SetSelectedFile(string fullName)
3         {
4             SelectedFileName = fullName;
5         }

 

 

这个方法是给承载页的js代码将上传文件的文件名传回silverlight。

在承载中定义如下的函数

 

 1 function UploadFile() {
 2             //打开文件上传页面
 3              window.open('FileUpload.aspx', '上传附件', 'height=30,width=300, toolbar=no, menubar=no,location=no, status=no');
 4         }
 5         function SetSelectedFile(fullname) {
 6             //将上传文件的文件名传回silverlight
 7              var control = document.getElementById("SilverlightControl");
 8             var manager = control.Content.FileUploadCtrl;
 9             manager.SetSelectedFile(fullname);
10         }
11         function OpenAffix(msg) {
12             //打开文件
13              if (arguments.length > 0) {
14                 window.open("UploadFiles/" + arguments[0], "_blank");
15             }
16         }

 

 

2.完成以上工作以后则可以进行以下的操作。

在页面中放一个按钮,点击事件这么写:

 

 1 public void Button_Click(object sender, RoutedEventArgs e)
 2         {
 3             try
 4             {
 5                 ScriptObject sobjUploadFile = HtmlPage.Window.GetProperty("UploadFile") as ScriptObject;
 6                 sobjUploadFile.InvokeSelf();
 7                 return;
 8             }
 9             catch (Exception ex)
10             {
11                 MessageBox.Show(ex.Message);
12             }
13         }

 

 

第5行中GetProperty的参数即为承载页定义的js函数的函数名。运行这段代码就可以调用承载页的UploadFile的方法,即打开FileUpload.aspx页面。

3.FileUpload.aspx页面的内容如下:

 

 1 <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="FileUpload.aspx.cs" Inherits="OIU.Web.FileUpload" %>
 2
 3  <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 4
 5  <html xmlns="http://www.w3.org/1999/xhtml">
 6 <head runat="server">
 7     <title></title>
 8     <script type="text/网页特效">
 9         function SetSelectedFile(fullName) {
10             window.opener.location = "javascript:SetSelectedFile('" + fullName + "');";
11             window.close();
12         }
13     </script>
14 </head>
15 <body>
16     <form id="form1" runat="server">
17     <div>
18     <asp:FileUpload runat="server" ID="fu" />
19     &nbsp;<asp:Button Text="上传" runat="server" ID="btnUpload"
20         onclick="btnUpload_Clicked" />
21     </div>
22     </form>
23 </body>
24 </html>

 

 

这里注意,第9行的js函数,通过window.opener来调用打开这个页面的父页面的js方法:SetSelectedFile。

上传按钮的点击事件处理函数这么写:

 

 1 protected void btnUpload_Clicked(object sender, EventArgs e)
 2         {
 3             if (fu.HasFile)
 4             {
 5                 if (fu.PostedFile.ContentLength / 1024 / 1024 > 5)
 6                 {
 7                     ClientScript.RegisterStartupScript(ClientScript.GetType(), "myscript", "<script>alert('文件过大,支持最大5M的文件上传');</script>");
 8                     return;
 9                 }
10                 //string uploadFullName = string.Format("{0}UploadFiles{1}", AppDomain.CurrentDomain.BaseDirectory, fu.FileName);
11                 string uploadFullName = Server.MapPath("~/UploadFiles/") + fu.FileName;
12                 fu.SaveAs(uploadFullName);
13                 //将文件全路径返回父页面
14                 ClientScript.RegisterStartupScript(ClientScript.GetType(), "myscript", "<script>SetSelectedFile('" + fu.FileName + "');</script>");
15             }
16             else
17             {
18                 ClientScript.RegisterStartupScript(ClientScript.GetType(), "myscript", "<script>alert('新先选择要上传的文件');</script>");
19             }
20         }
21     }

 

 

里面有一部分的验证操作。开始我是想将上传的全路径传给页面再传回silverlight的,但是,从后台调用前台js函数时参数的路径分隔符全被转义了,如果谁能解决这个问题,可以跟帖让我学习学习。

4.完成了以上的操作以后,文件就已经上传到了服务器指定的目录了,接下来的工作就是如何下载或者打开上传的文件。

我的实现方法是通过silverlight页面文本的点击,调用承载页的OpenAffix函数使用打开文件。具体实现如下:

 

1 private void StatusText_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
2         {
3             if (null != StatusText.Tag && !string.IsNullOrEmpty(StatusText.Tag.ToString()))
4             {
5                 HtmlPage.Window.Invoke("OpenAffix", StatusText.Tag);
6             }
7         }

 

 

这是另一种silverlight调用承载页js函数的方法。参考第1条中js函数,可以实现文件的下载或者打开

 

时间: 2024-08-08 07:44:51

绕过silverlight的安全限制的js和asp.net上传文件方法的相关文章

在Node.js中使用HTTP上传文件的方法

  这篇文章主要介绍了在Node.js中使用HTTP上传文件的方法,作者以windows下的visual studio作为操作node的环境,推荐阅读!需要的朋友可以参考下 开发环境 我们将使用 Visual Studio Express 2013 for Web 作为开发环境, 不过它还不能被用来做 Node.js 开发.为此我们需要安装 Node.js Tools for Visual Studio. 装好后 Visual Studio Express 2013 for Web 就会转变成一

JS中使用FormData上传文件、图片的方法_javascript技巧

关于FormData XMLHttpRequest Level 2添加了一个新的接口  ---- FormData 利用FormData对象,可以通过js用一些键值对来模拟一系列表单控件,可以使用XMLHttpRequest的 send( ) 方法来异步提交表单与普通的ajax相比,使用FormData的最大优点就是可以异步上传二进制文件 FormData对象 FormData对象,可以把所有表单元素的name与value组成一个queryString,提交到后台. 在使用ajax提交时,使用F

在Node.js中使用HTTP上传文件的方法_node.js

开发环境我们将使用 Visual Studio Express 2013 for Web 作为开发环境, 不过它还不能被用来做 Node.js 开发.为此我们需要安装 Node.js Tools for Visual Studio.  装好后 Visual Studio Express 2013 for Web 就会转变成一个 Node.js IDE 环境,提供创建这个应用所需要的所有东西..而基于这里提供的指导,我们需要:     下载安装 Node.js  Windows 版,选择适用你系统

Js+php实现异步拖拽上传文件

         本文给大家分享的是使用php结合js实现异步拖拽上传文件的代码,及示例,有需要的小伙伴可以参考下.              异步拖拽上传文件--小实例 upload.html ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53

如何使用JS获取IE上传文件路径(IE7,8)

本篇文章是对使用JS获取IE上传文件路径的实现代码进行了详细的分析介绍,需要的朋友参考下   复制代码 代码如下: function validateFileSize(id, maxsize) {             var btnsave = document.getElementById("Button2");             btnsave.disabled = false;             var filepath = "";      

JQuery插件ajaxfileupload.js异步上传文件实例

这篇文章主要介绍了JQuery插件ajaxfileupload.js异步上传文件实例,本文直接给出了HTML代码和JS代码以及后台处理代码,需要的朋友可以参考下     在服务器端做文件上传的过程中,如果使用web服务器短端的上传控件去上传文件的话,会导致页面刷新一次,这样对用户的体验就不是很友好了.ajaxfileupload.js是一款jQuery的异步上传文件插件,使用简单且容易上手. 前置条件:ajaxfileupload.js文件,百度下载一个就行. JS引用:  代码如下: <scr

js获取判断上传文件后缀名的示例代码

 本篇文章主要是对js获取判断上传文件后缀名的示例代码进行了介绍,需要的朋友可以过来参考下,希望对大家有所帮助  代码如下: function lastname(){  //获取欲上传的文件路径 var filepath = document.getElementById("file1").value;  //为了避免转义反斜杠出问题,这里将对其进行转换 var re = /(+)/g;  var filename=filepath.replace(re,"#");

file控件选择上传文件确定后触发的js事件是哪个

  这篇文章主要介绍了file控件选择上传文件确定后触发了什么js事件,需要的朋友可以参考下 一直以来纠结于这个问题.今天闲来上网搜索了一下这个问题.终于知道答案.是onchange事件.经过本人测试,可用.还有说onpropertychange也可以.经chrome浏览器测试,无效果.不知道是什么原因.  

.net上传文件时,用js调用后台函数,出现HTMLfile拒绝访问

问题描述 .net上传文件时,用js调用后台函数,出现HTMLfile拒绝访问 .net上传文件时,用js调用后台函数,出现HTMLfile拒绝访问,拜求大神指点, 解决方案 fileupload 控件中 选择文件,这时候文件还没有上次,只是在浏览器端. 文件上传后,在服务器端处理(大部分情况是postback). 这时候没法执行js. 不太明白你的问题,最好上点代码.