zoukankan      html  css  js  c++  java
  • asp.net跨服务器上传文件解决方案

    为何要多服务器存储

    Web前端优化其中有一个规则就是通过不同的主机并行下载资源(Parallelize downloads across hostnames),IE浏览器对同一个域名的文件,同时只能下载2个文件,这样的话,假设同一个页面站内资源很多,尤其是图片资源过多时,页面加载速度将会受到影响,这时分布式处理文件显得尤为重要,中大型站点往往通过多个资源服务器来存储这些文件,比如博客园本身也是将图片文件保存在imgn.cnblogs.com的服务器上。更大型的网站可能会将一些js、css文件也会从主域中分离处理。

    跨服务器上传解决方案

    跨服务器上传其实就是在a站上传文件保存到b站,比较常见的两种方式如下。

    第一种是非常灵活的方式,假设A.com和B.com,在A上有一个文件gate.aspx,这个页面无参数时跳转到B上的upload.aspx,其实上传是通过B上的upload.aspx上传到B服务器,然后上传成功后将上传结果以参数方式再传递给gate.aspx;gate.aspx接收到这个参数再做相应的处理。这种方式实质上并不涉及到跨服务器,仅仅是利用一些灵活的变通方式。

    第二种方式就是我们今天要提到的实实在在的跨服务器上传,利用B.com的handler文件,先将文件进行编码,使用POST方式传递到handler,然后handler将文件保存到服务器上,同时返回相应的结果。

    将文件转为Base64:

    string fileName = FileUpload.FileName;
    FileInfo file = new FileInfo(fileName);
    string ext=file.Extension;
    Stream stream = FileUpload.PostedFile.InputStream;
    BinaryReader br = new BinaryReader(stream);
    byte[] fileByte = br.ReadBytes((int)stream.Length);
    string baseFileString = Convert.ToBase64String(fileByte);
    

    在handler.ashx中做处理:

        /// <summary>
        /// 上传图片
        /// </summary>
        [WebService(Namespace = "http://tempuri.org/")]
        [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
        public class CrossServerFileUpload : IHttpHandler
        {
            private string _allowFileTypes = "gif,jpg,jpeg,png,bmp";
    
            private HttpContext _context;
            public void ProcessRequest(HttpContext context)
            {
                _context = context;
    
                string src = context.Request.Form["src"];
    			if (string.IsNullOrEmpty(src)) return;
    
    			src = src.ToLower();
     			bool isExtValid = src.EndsWith(".jpg") || src.EndsWith(".png") || src.EndsWith(".gif") || src.EndsWith(".bmp") || src.EndsWith(".jpeg");
                if (isExtValid) {
                    context.Response.ContentType = "text/plain";
                    string ext = context.Request.Form["ext"];
                    string content = context.Request.Form["data"];
    
                    Upload(ext, content);
                }
            }
            /// <summary>
            /// 上传类
            /// </summary>
            /// <param name="ext"></param>
            /// <param name="content"></param>
            private void Upload(string ext,string content)
            {
                if (string.IsNullOrEmpty(ext) || string.IsNullOrEmpty(content)) {
                    return;
                }
                //保存图片
                string dateNum = DateTime.Now.ToString("yyyyMM");//按月存放
                string fileName = Guid.NewGuid() + ext;
                string currentPath = HttpContext.Current.Request.PhysicalApplicationPath + "upload\\" + dateNum + "\\";
                string fullPath =currentPath  + fileName;
    
                if (!Directory.Exists(currentPath))
                    Directory.CreateDirectory(currentPath);
    
                byte[] buffer = Convert.FromBase64String(content);
                using (FileStream fileStream = new FileStream(fullPath, FileMode.Create)) {
                    fileStream.Write(buffer, 0, buffer.Length);
                }
                string host = _context.Request.Url.Host;
                ResponseWrite(string.Format("http://" + host + "/upload/{0}/{1}", dateNum, fileName));//返回图片保存路径
            }
            /// <summary>
            /// 生成http内容 
            /// </summary>
            /// <param name="content"></param>
            private void ResponseWrite(string content)
            {
                _context.Response.ClearContent();
                _context.Response.ContentType = "text/plain";
                _context.Response.Write(content);
                _context.Response.End();
            }
    

    以上是跨服务器处理代码的核心代码,实际应用中还需要考虑权限问题。

    代码下载

  • 相关阅读:
    linux安装mysql5.7.24
    如何解决svn Authorization failed错误
    vux配置i18n
    vue项目使用vux框架配置教程
    EL函数
    Android的taskAffinity对四种launchMode的影响
    Activity生命周期-Android
    为什么用服务不用线程-Android
    Hibernate总结--MyEclipse的小bug
    EL表达式隐含对象
  • 原文地址:https://www.cnblogs.com/walkingp/p/2033064.html
Copyright © 2011-2022 走看看