跨域文件上传解决方案

文件上传在项目中是必不可少的一个环节。一般而言,只要有一个上传页面就可以了  图片直接上传到网站下面。

但是当项目较多,或者项目太大 有好多需要上传文件的需求时,一个通用的文件上传组件就很有必要了。

而且我需要的是文件上传之后是在单独的服务器上(外在体现就是网站与图片不是同一个域名)

这样文件上传页面与当前网站就需要跨域进行上传操作了。

上传过程没有问题,但是上传结束之后的回调操作因为不能跨域存取值而无法进行。

通过对网上一些文章的整理,方案如下

调用文件上传组件的页面(url=http://localhost:2565/.....)

<body>
    <form id="fileform" name = "fileform" enctype="multipart/form-data" target="hideFrame" method="post"
            action="http://localhost:13124/Upload/FileHandler.ashx?cb=http://localhost:2565/fileUploadCB.htm">
        <input type="file" id="fileSelector" name="fileSelector" />
    </form>
    <iframe id="hideFrame" name="hideFrame" style="display:none;"></iframe>
    <input type="button" id="btnUpload" value="上传" />
    <script>
        document.querySelector("#btnUpload").onclick = function () {
            this.style.backgroundColor = "blue";//上传过程中按钮是蓝色的
            document.querySelector("#fileform").submit();
        }

        function uploadCallBack(rst) {
            document.querySelector("#btnUpload").style.backgroundColor = "";//上传结束按钮颜色回复
            console.log(rst);
        }
</script>

form的target要指定一个隐藏的iframe,这样当前页面才不会因为上传图片而刷新。

实际上就相当于在隐藏的iframe中打开action指定的链接并把form中的数据post过去

至于action的链接中有个参数cb,这个cb的链接在整个操作中至关重要:它是上传结束后回调操作的第一步。

上传文件的后台代码(http://localhost:13124/Upload/FileHandler.ashx)

private const int MAX_UPLOAD_SIZE = 2;

/// <summary>
/// 上传文件
/// fileSelector是前台代码中文件控件的name/// </summary>
/// <returns></returns>
public string UploadFile(HttpRequest req ,HttpResponse res)
{
    if (req.Files["fileSelector"].ContentLength > MAX_UPLOAD_SIZE * 1024 * 1024)
    {
        return String.Format("请上传{0}M以内的文件。", MAX_UPLOAD_SIZE);
    }

    string uploadFileName = req.Files["fileSelector"].FileName;
    string path = HttpContext.Current.Server.MapPath(uploadFileName);
    req.Files["fileSelector"].SaveAs(path);
    return "";
}

/// <summary>
/// 上传结束后要重定向到指定链接
/// </summary>
/// <param name="context"></param>
public void ProcessRequest(HttpContext context)
{
    string result = UploadFile(context.Request, context.Response);
    if (String.IsNullOrEmpty(result))
    {
        result = "上传成功";
    }
    string cbSrc = context.Request["CB"];
    context.Response.Redirect(cbSrc);
}

注意:cb指定的上传结束后的链接与调用上传组件的页面是同源的。

cb指定的页面(http://localhost:2565/fileUploadCB.htm)

<html xmlns="http://www.w3.org/1999/xhtml">
<body>
    <script>
        alert("成功Oh Yeah!");
        parent.uploadCallBack("上传成功!");
    </script>
</body>
</html>

该页面只是起到一个中转的作用,用于上传结束之后将结果提供给主页面,并执行回调函数。



上面给出的只是基本方案。具体的话  还有很多事情要做,上传时传的参数还是要研究一下的  因为这决定了文件的分类,用户归属等。

大部分工作也没必要自己写,有很多成熟的上传插件

FineUploader

时间: 2024-09-30 09:02:48

跨域文件上传解决方案的相关文章

(H5)FormData+AJAX+SpringMVC跨域异步上传文件

最近都没时间整理资料了,一入职就要弄懂业务,整天被业务弄得血崩. 总结下今天弄了一个早上的跨域异步上传文件.主要用到技术有HTML5的FormData,AJAX,Spring MVC. 首先看下上传页面: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <script type="text/javascript" src="js/plugins/

前后端分离跨服务器文件上传-Java SpringMVC版

近来工作上不上特别忙,加上对后台java了解一点,所以就抽时间,写了一个java版本的前后端分离的跨服务器文件上传功能,包括前后端代码. 一.Tomcat服务器部分 1.Tomcat服务器 单独复制一份Tomcat,用来作为文件服务器 1.1 xml文件: 需要在该Tomcat的conf目录下的web.xml文件的大概100行添加如下部分: 1.2 server.xml文件: 需要在该Tomcat的conf目录下的server.xml文件做一些端口的修改 1.3 Tomcat下建立文件夹 在该T

内网/外网大文件上传解决方案

最近遇见一个需要上传百兆大文件的需求,调研了七牛和腾讯云的切片分段上传功能,因此在此整理前端大文件上传相关功能的实现. 在某些业务中,大文件上传是一个比较重要的交互场景,如上传入库比较大的Excel表格数据.上传影音文件等.如果文件体积比较大,或者网络条件不好时,上传的时间会比较长(要传输更多的报文,丢包重传的概率也更大),用户不能刷新页面,只能耐心等待请求完成. 下面从文件上传方式入手,整理大文件上传的思路,并给出了相关实例代码,由于PHP内置了比较方便的文件拆分和拼接方法,因此服务端代码使用

前端大文件上传解决方案支持分片断点上传

最近遇见一个需要上传百兆大文件的需求,调研了七牛和腾讯云的切片分段上传功能,因此在此整理前端大文件上传相关功能的实现. 在某些业务中,大文件上传是一个比较重要的交互场景,如上传入库比较大的Excel表格数据.上传影音文件等.如果文件体积比较大,或者网络条件不好时,上传的时间会比较长(要传输更多的报文,丢包重传的概率也更大),用户不能刷新页面,只能耐心等待请求完成. 下面从文件上传方式入手,整理大文件上传的思路,并给出了相关实例代码,由于PHP内置了比较方便的文件拆分和拼接方法,因此服务端代码使用

cors跨域 + 异步上传文件

一:实现跨域 CORS定义一种跨域访问的机制,可以让AJAX实现跨域访问.CORS 允许一个域上的网络应用向另一个域提交跨域 AJAX 请求.实现此功能非常简单,只需由服务器发送一个响应标头即可. 如果不需要文件上传,可以使用jquery.ajax,设置dataType="jsonp",即可(注意:jsonp的请求格式与返回数据与json有些许差入). 1.使用jQuery的support属性,其下有一个cors设置,设置成true,说名此次请求需要验证该请求是否允许跨域 即:$.su

Jquery~跨域异步上传文件

先说明白 这个跨域异步上传功能我们借助了Jquery.form插件,它在异步表单方面很有成效,而跨域我们会在HTTP响应头上添加access-control-allow-method,当然这个头标记只有IE10,火狐和谷歌上支持,对于IE10以下的浏览器来说,我们就不能用这种方式了,我们需要换个思路去干这事,让服务端去重写向我们的客户端,由客户端(与文件上传页面在同域下)来返回相关数据即可. 再做事 1 Jquery.form的使用 <form method="post" act

大文件上传解决方案

版权所有 2009-2018荆门泽优软件有限公司 保留所有权利 官方网站:http://www.ncmem.com/ 产品首页:http://www.ncmem.com/webapp/up6.2/index.asp 在线演示:http://www.ncmem.com/products/up6.2/index.htm 产品介绍:http://www.cnblogs.com/xproer/archive/2012/10/26/2741264.html 升级日志:http://www.cnblogs.

web大文件上传解决方案支持分片断点上传

一. 功能性需求与非功能性需求 要求操作便利,一次选择多个文件和文件夹进行上传:支持PC端全平台操作系统,Windows,Linux,Mac 支持文件和文件夹的批量下载,断点续传.刷新页面后继续传输.关闭浏览器后保留进度信息. 支持文件夹批量上传下载,服务器端保留文件夹层级结构,服务器端文件夹层级结构与本地相同. 支持大文件批量上传(20G)和下载,同时需要保证上传期间用户电脑不出现卡死等体验:支持文件夹上传,文件夹中的文件数量达到1万个以上,且包含层级结构. 支持断点续传,关闭浏览器或刷新浏览

b/s大文件上传解决方案支持分片断点上传

核心原理: 该项目核心就是文件分块上传.前后端要高度配合,需要双方约定好一些数据,才能完成大文件分块,我们在项目中要重点解决的以下问题. * 如何分片: * 如何合成一个文件: * 中断了从哪个分片开始. 如何分,利用强大的js库,来减轻我们的工作,市场上已经能有关于大文件分块的轮子,虽然程序员的天性曾迫使我重新造轮子.但是因为时间的关系还有工作的关系,我只能罢休了.最后我选择了百度的WebUploader来实现前端所需. 如何合,在合之前,我们还得先解决一个问题,我们如何区分分块所属那个文件的