利用iframe+from表单实现跨域上传文件

一、需要的材料

客户端需要一个HTML页面A其中包含一个iframe和一个form表单,一个页面B(我称之为客户端代理)里面包含对返回参数的处理;

服务端需要一个asp.net的一般处理程序用来处理上传文件并返回值。

二、原理图

有图才有真相,哈哈哈

三、客户端代码实现

1、页面A的实现

<!DOCTYPE html>
<html>

	<head>
		<meta charset="UTF-8">
		<title>A页面</title>
		<script src="http://libs.baidu.com/jquery/2.0.0/jquery.min.js"></script>
	</head>

	<body>
		<iframe name=‘hidden_frame‘ id="hidden_frame" style=‘display:none‘></iframe>
		<form id="fileform" method="post" enctype="multipart/form-data" target="hidden_frame">
			<input type="file" name="fileUpload" />
		</form>
		<button id="submitbtn">开始上传</button>
		<script type="text/javascript">
			function callback(msg) {
				//回调函数
				alert(msg);
			}
		</script>
		<script type="text/javascript">
			$("#submitbtn").click(function() {
				var callbackurl = window.location.href.sub(0, window.location.href.lastIndexOf(‘/‘)) + "proxy.html"; //获取代理文件路径
				$("#fileform").attr("action", "FileHandler.ashx?callbackurl=" + callbackurl);
				$("#fileform").submit();
			})
		</script>
	</body>

</html>

2.代理页面实现 proxy.html 为了方便调用,我将该页面放在了与A页面同一目录下,也可以不同目录,但必须是同域

<!DOCTYPE html>
<html>

	<head>
		<meta charset="UTF-8">
		<title>代理文件</title>
	</head>
	<body>
		<script type="text/javascript">
			var rs = window.location.search.split(‘?‘).slice(1);
			window.parent.callback(rs.toString().split(‘=‘).slice(1));//调用父页面的方法
		</script>
	</body>
</html>

三、服务端实现

public void ProcessRequest(HttpContext context)
{
    context.Response.ContentType = "text/html";
    HttpServerUtility server = context.Server;
    HttpRequest request = context.Request;
    HttpResponse response = context.Response;
    string callbackurl = context.Request["callbackurl"];
    HttpPostedFile file = context.Request.Files[0];
    if (file.ContentLength > 0)
    {
        string extName = Path.GetExtension(file.FileName);
        string fileName = Guid.NewGuid().ToString();
        string fullName = fileName + extName;

        string imageFilter = ".jpg|.png|.gif|.ico";// 随便模拟几个图片类型
        if (imageFilter.Contains(extName.ToLower()))
        {
            string phyFilePath = server.MapPath("~/Upload/Image/") + fullName;
            file.SaveAs(phyFilePath);
            context.Response.Redirect(callbackurl + "?msg=‘上传成功‘")
        }
    }
}

  

四、该方法的优缺点以及适用范围

优点:没有兼容性问题,在常见的浏览器中都是适用的;

缺点:返回数据最大支持2KB,对于较大的数据范围建议使用CORS方式跨域

适用范围:上传文件,返回值只是一些短信息比如返回上传正确与否。

时间: 2024-10-08 10:41:12

利用iframe+from表单实现跨域上传文件的相关文章

Js 跨域上传文件

代码在github上( https://github.com/andygithubchen/jsUpload ),请结合github上的文件阅读. 主要实现js跨域上传文件,这里的跨域目前只在两个域名所指向的服务器在同一局域网内. 当然,这两种方案都可以做同域名上传. 例如: 192.168.1.60 www.test.cn 192.168.1.61 www.video.cn 如果要在www.test.com域名下上传文件到www.video.com域名下,可以使用下面这两个方案: 方案一(在s

跨域上传文件(还是没有明白)

转: 最近工作中有这样的需求:项目在A机器(假设域名为www.a.com)上跑,资源文件要存储在专门的资源机器B(假设域名为www.b.com),要求在A上传文件到B上同时将上传信息以json格式返回. 由于之前的项目都比较小,也没有这样的需求,基本都是在单机上操作,自然涉及不到跨域的问题,初次遇到这个问题,比较棘手,进行了如下尝试均失败. 尝试一:在A机器上的页面中嵌入一个iframe,iframe的src指向B机器的一个上传页面,这样可以很容易将资源上传到B机器,但是却很难实现“以json格

ie8、9跨域上传文件(图片)

前言:新的项目,需要将图片跨域上传到专门的图片服务器上面,而且还要支持ie8/9的跨域上传. 解决:为了解决这个方案踩了很多坑,特此记录.以前收集了一些上传的组件 文件(图片)上传组件 ,各有优劣. 1:因为google在将来的版本不在支持flash了,所以不想使用swf支撑的组件上传 2:尝试了AjaxFileUpload 组件,这个在google跨域直接挂掉了. 3:尝试百度的上传组件,Web Uploader 这个挺不错,支持跨域,但是ie8/9跨域支持不大好,只好放弃了(也有可能是我没有

POST方式跨域上传文件

JSONP请求有限制: 第一,不能跳出两层, 第二,不支持POST. 往往解决跨域POST请求的方案是个"古老"方法, 请求同域下的iframe. 服务器端:  需要附加头信息: [php] view plaincopy header('Access-Control-Allow-Origin: *'); header('Access-Control-Allow-Methods: POST'); header('Access-Control-Max-Age: 1000'); 返回带有CA

【cors跨域】H5 js跨域上传文件,C#服务端接收

H5原生js文件上传,带进度. js代码: <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> <title></title> </head> <body> <form action=""> &l

Uploadify跨域上传原理

引用:http://www.cnblogs.com/me-sa/archive/2010/05/21/How-Uploadify-Cross-Domain.html < 回头再说:jQuery跨域原理 >一文提到浏览器的同源策略以及使用JsonP的方式实现跨域;在评论中金色海洋提出了一个问题: 我最近在用 uploadify + ashx 来做文件上传的功能.都测试成功了,但是发现我可以提交到其他的网站里面. 我是在本地测试了.两个网站,IP地址相同,使用端口来区分. 一个端口是8001,另一

Ueditor1.4.3实现跨域上传到独立文件服务器,完美解决单文件和多文件上传!

再写配置方法之前先吐槽一下网上的各种教程,TM没一个有卵用,一群傻屌不会写就别写,写了就要负责. 百度google搜了半天,全是配置什么document.domain,根域名什么的,我只想对你说: 好了,talk is cheap show me the code,言归正传: 首先去ue官网下载1.43版 .net版本,解压之后,把demo文件夹改成web,把net那个文件夹拷贝出来放到web外面,如图: 这样就把编辑器的静态文件和动态文件分离了,动态部分放到文件服务器上,静态部分集成到我们的网

跨域通信/跨域上传浅析

web项目跨域问题主要包括跨域通信和跨域上传,下面对这两方面分别做一个分析,具体项目中用哪个方案要看项目具体需求. 跨域通信 jsonp hash server proxy window.name cors postmessage redirect jsonp 原理:发起一个GET请求,回调函数带到请求参数中,把数据发送过去 坏处:服务器需要支持jsoncallback参数 好处:业界比较通用的方案,包括打点等操作都可以用类似技术 浏览器支持:chrome/firefox/safari/oper

asp.net mvc 文件跨域上传,接收返回结果

在系统中我们可能有各种各样的文件上传,这样我们可能会把文件模块单独部署一台服务器,这样在上传时就会遇到跨域问题.我们可以先上传到服务端然后通过httpClient等技术再上传到文件服务器,这样就不会存在跨域问题,但是这样多出了服务器中转的一个步骤,现在我们说一下如何在客户端直接跨域上传到文件服务器. 1.文件服务器部署一个文件上传接口(实现技术:webapi,webservice,mvc等等) 文件上传接口示例如下(MVC方式): /// <summary> /// 上传接口 /// <