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(); } |
以上是跨服务器处理代码的核心代码,实际应用中还需要考虑权限问题。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· [AI/GPT/综述] AI Agent的设计模式综述
2010-04-29 C#数据结构三:单链表Singly Linked List