快捷搜索:  汽车  科技

如何搭建文件上传服务器(本地服务的文件上传与远程服务的文件上传)

如何搭建文件上传服务器(本地服务的文件上传与远程服务的文件上传)1 /// <summary> 2 /// 上传文件到远程服务器 3 /// </summary> 4 /// <param name="bytes"></param> 5 /// <param name="basepath"></param> 6 /// <param name="filename"></param> 7 /// <returns></returns> 8 public static string PostUploadFile(byte[] bytes string

文件上传属于常见业务,很多地方都用得到(比如图片上传);

确切地说,这里的“本地”是指的项目所在的服务端,只是在项目服务端再次请求另外一个服务端进行文件二次上传。

比如:我们上传图片的时候,请求项目的服务器需要上传一份,同时还要上传一份到cdn服务器。

示例使用控件: el-UpLoad 作为演示

如何搭建文件上传服务器(本地服务的文件上传与远程服务的文件上传)(1)

如何搭建文件上传服务器(本地服务的文件上传与远程服务的文件上传)(2)

如何搭建文件上传服务器(本地服务的文件上传与远程服务的文件上传)(3)

1 <style> 2 .Uploader { 3 border: 1px dashed #d9d9d9; 4 border-radius: 6px; 5 cursor: pointer; 6 position: relative; 7 overflow: hidden; 8 } 9 10 .uploader:hover { 11 border-color: #409EFF; 12 } 13 14 .avatar-uploader-icon { 15 font-size: 28px; 16 color: #8c939d; 17 text-align: center; 18 } 19 20 .banners-size { 21 width: 280px; 22 height: 120px; 23 line-height: 120px; 24 } 25 26 .avatar-banners { 27 width: 280px; 28 height: 120px; 29 background-size: cover; 30 } 31 32 .el-upload__tip { 33 color: red; 34 } 35 </style>

如何搭建文件上传服务器(本地服务的文件上传与远程服务的文件上传)(4)

如何搭建文件上传服务器(本地服务的文件上传与远程服务的文件上传)(5)

1 <style> 2 .uploader { 3 border: 1px dashed #d9d9d9; 4 border-radius: 6px; 5 cursor: pointer; 6 position: relative; 7 overflow: hidden; 8 } 9 10 .uploader:hover { 11 border-color: #409EFF; 12 } 13 14 .avatar-uploader-icon { 15 font-size: 28px; 16 color: #8c939d; 17 text-align: center; 18 } 19 20 .banners-size { 21 width: 280px; 22 height: 120px; 23 line-height: 120px; 24 } 25 26 .avatar-banners { 27 width: 280px; 28 height: 120px; 29 background-size: cover; 30 } 31 32 .el-upload__tip { 33 color: red; 34 } 35 </style>

如何搭建文件上传服务器(本地服务的文件上传与远程服务的文件上传)(6)

前端核心代码:

如何搭建文件上传服务器(本地服务的文件上传与远程服务的文件上传)(7)

如何搭建文件上传服务器(本地服务的文件上传与远程服务的文件上传)(8)

如何搭建文件上传服务器(本地服务的文件上传与远程服务的文件上传)(9)

如何搭建文件上传服务器(本地服务的文件上传与远程服务的文件上传)(10)

本地服务器上传接口:

如何搭建文件上传服务器(本地服务的文件上传与远程服务的文件上传)(11)

如何搭建文件上传服务器(本地服务的文件上传与远程服务的文件上传)(12)

1 /// <summary> 2 /// 本地上传图片 3 /// </summary> 4 /// <returns></returns> 5 [HttpPost] 6 public JsonResult UploadImg(string filename) 7 { 8 var result = new Common.CommonResult(1 "网络请求错误"); 9 try 10 { 11 string basePath = ConfigurationManager.AppSettings["basePath"] ?? "\\Images"; //服务器上传文件夹 12 string imgpath = string.Empty; 13 14 HttpPostedFileBase file = Request.Files.Get(filename); //从browser传过来的的文件 15 //HttpPostedFile file = System.Web.HttpContext.Current.Request.Files.Get(filename); //从browser传过来的的文件 16 17 if (file != null && file.ContentLength > 0) 18 { 19 //文件后缀名 20 string fileExtension = Path.GetExtension(file.FileName).ToLower(); 21 22 //获取文件名 23 string fileName = DateTime.Now.ToString("yyyy_MM_dd_HH_mm_ss_ffff"); 24 fileName = fileExtension; 25 26 Stream postStream = file.InputStream; 27 byte[] bytes = new byte[postStream.Length]; 28 postStream.Read(bytes 0 file.ContentLength); 29 postStream.Seek(0 SeekOrigin.Begin); //设置当前流的位置为流的开始 30 postStream.Close(); 31 32 //写入本地 33 var repath = UploadHelper.UploadFile(bytes basePath fileName); 34 35 result.Code = 0; 36 result.Message = "OK"; 37 result.Data = repath; 38 } 39 return Json(JsonConvert.SerializeObject(result)); 40 } 41 catch (Exception) 42 { 43 return Json(JsonConvert.SerializeObject(result)); 44 } 45 }

如何搭建文件上传服务器(本地服务的文件上传与远程服务的文件上传)(13)

上传本地文件处理方法:UploadHelper.UploadFile()

如何搭建文件上传服务器(本地服务的文件上传与远程服务的文件上传)(14)

1 /// <summary> 2 /// 上传文件到本地 3 /// </summary> 4 /// <param name="filename"></param> 5 /// <param name="basePath"></param> 6 /// <param name="bytes"></param> 7 /// <returns></returns> 8 public static string UploadFile(byte[] bytes string basePath string filename) 9 { 10 string result = ""; 11 try 12 { 13 if (bytes != null) 14 { 15 //保存文件路径,比如:\\Images\\2020-01-01\\,这里的basePath相当于\\Images 16 string upfilePath = basePath "\\" DateTime.Now.ToString("yyyy-MM-dd") "\\"; //根路径 17 //上传到本地 ~/表示上级目录,如果不加则表示同级目录 18 string filePath = System.Web.HttpContext.Current.Server.MapPath("~/" upfilePath); 19 if (!Directory.Exists(filePath)) 20 { 21 Directory.CreateDirectory(filePath); 22 } 23 //完整路径:项目目录\\Images\\2020-01-01\\abc.jpg 24 string fileSavePath = Path.Combine(filePath filename); //合并成完整的文件路径 25 26 //写入本地 27 using (FileStream fs = new FileStream(fileSavePath FileMode.Create)) 28 { 29 fs.Write(bytes 0 bytes.Length); 30 fs.Close(); 31 fs.Dispose(); 32 } 33 //返回路径:/Images/2020-01-01/abc.jpg 34 result = (upfilePath filename).Replace("\\" "/"); 35 } 36 else 37 { 38 result = "上传的文件信息不存在!"; 39 } 40 } 41 catch (Exception ex) 42 { 43 return ""; 44 } 45 return result; 46 }

如何搭建文件上传服务器(本地服务的文件上传与远程服务的文件上传)(15)

一般向本地服务器上传的同时,还要向cdn服务器上传一份,请求cdn服务器接口代码如下:

如何搭建文件上传服务器(本地服务的文件上传与远程服务的文件上传)(16)

1 /// <summary> 2 /// 上传文件到远程服务器 3 /// </summary> 4 /// <param name="bytes"></param> 5 /// <param name="basepath"></param> 6 /// <param name="filename"></param> 7 /// <returns></returns> 8 public static string PostUploadFile(byte[] bytes string basepath string filename) 9 { 10 string repath = ""; 11 string hosturl = ConfigurationManager.AppSettings["apihost"] ?? "https://cache.xxxxxx.com:8080/"; //远程服务器路径 12 try 13 { 14 var apiurl = hosturl "api/UpLoad/ReceiveFile"; //远程请求接口 相当于:https://cache.xxxxxx.com:8080/api/UpLoad/ReceiveFile 15 HttpClient httpClient = HttpClientFactory.GetHttpClient(); 16 string upfilePath = basepath "\\" DateTime.Now.ToString("yyyy-MM-dd") "\\"; //保存路径,比如:\\Images\\2020-01-01\\,basepath相当于\\Images 17 using (var multipartFormDataContent = new MultipartFormDataContent()) //MultipartFormDataContent相当于 "Content-Type": "multipart/form-data" 18 { 19 //二进制流传输 远程服务器可以使用: Request.Files.Get("filedata")接收 20 multipartFormDataContent.Add(new ByteArrayContent(bytes 0 bytes.Length) "filedata" filename); 21 //远程服务器可以使用: Request["filePath"]接收 22 multipartFormDataContent.Add(new StringContent(upfilePath Encoding.UTF8 "application/x-www-form-urlencoded") "filePath"); 23 24 //post请求 25 var response = httpClient.PostAsync(apiurl multipartFormDataContent).Result; 26 if (response.StatusCode == System.Net.HttpStatusCode.OK) 27 { 28 var result = response.Content.ReadAsStringAsync().Result; 29 if ((int)response.StatusCode == 200) 30 { 31 repath = (upfilePath filename).Replace("\\" "/"); 32 } 33 } 34 } 35 return repath; 36 } 37 catch (Exception ex) 38 { 39 return repath; 40 } 41 }

如何搭建文件上传服务器(本地服务的文件上传与远程服务的文件上传)(17)

接下来看看在远程cdn服务器上如何接收本地服务器上传过来的文件,实际上跟本地服务器上传没多大区别。

创建一个文件上传服务,比如创建一个WebApI服务,创建一个文件上传接口:/api/UpLoad/ReceiveFile,然后将该服务发布到IIS上即可

如何搭建文件上传服务器(本地服务的文件上传与远程服务的文件上传)(18)

然后客户端请求路径:https://cache.xxxxxx.com:8080/api/UpLoad/ReceiveFile

如何搭建文件上传服务器(本地服务的文件上传与远程服务的文件上传)(19)

1 /// <summary> 2 /// 文件上传服务 3 /// </summary> 4 public class UpLoadController : ApiController 5 { 6 /// <summary> 7 /// 文件接收接口 8 /// </summary> 9 /// <returns></returns> 10 [HttpPost] 11 public HttpResponseMessage ReceiveFile() 12 { 13 HttpResponseMessage response = null; 14 try 15 { 16 HttpPostedFile file = HttpContext.Current.Request.Files.Get("filedata"); //获取文件流 17 string getfilepath = HttpContext.Current.Request["filePath"] ?? "\\Images\\"; //获取保存路径(不包含文件名),默认:\\Images\\ 18 var filename = file.FileName; //获取文件名 19 20 //保存到本地的路径,~/表示指向上级根目录 21 string savePath = HttpContext.Current.Server.MapPath("~/" getfilepath); 22 23 //创建文件夹 24 if (!Directory.Exists(savePath)) 25 { 26 Directory.CreateDirectory(savePath); 27 } 28 29 //保存文件到指定路径下 30 string saveFilePath = Path.Combine(savePath filename); 31 Stream postStream = file.InputStream; 32 using (FileStream fs = new FileStream(saveFilePath FileMode.Create)) 33 { 34 byte[] new_b = new byte[postStream.Length]; 35 while (postStream.Read(new_b 0 new_b.Length) != 0) 36 { 37 fs.Write(new_b 0 new_b.Length); 38 } 39 postStream.Close(); 40 fs.Close(); 41 fs.Dispose(); 42 } 43 response = Request.CreateResponse(HttpStatusCode.OK); //成功返回200 44 } 45 catch (Exception) 46 { 47 response = Request.CreateResponse(HttpStatusCode.BadRequest); //返回400 48 } 49 return response; 50 } 51 52 }

如何搭建文件上传服务器(本地服务的文件上传与远程服务的文件上传)(20)

.Add(new ByteArrayContent(bytes 0 bytes.Length) "filedata" filename); 21 //远程服务器可以使用: Request["filePath"]接收 22 multipartFormDataContent.Add(new StringContent(upfilePath Encoding.UTF8 "application/x-www-form-urlencoded") "filePath"); 23 24 //post请求 25 var response = httpClient.PostAsync(apiurl multipartFormDataContent).Result; 26 if (response.StatusCode == System.Net.HttpStatusCode.OK) 27 { 28 var result = response.Content.ReadAsStringAsync().Result; 29 if ((int)response.StatusCode == 200) 30 { 31 repath = (upfilePath filename).Replace("\\" "/"); 32 } 33 } 34 } 35 return repath; 36 } 37 catch (Exception ex) 38 { 39 return repath; 40 } 41 }

如何搭建文件上传服务器(本地服务的文件上传与远程服务的文件上传)(21)

接下来看看在远程cdn服务器上如何接收本地服务器上传过来的文件,实际上跟本地服务上传没多大区别。

创建一个文件上传服务,比如创建一个WebApI服务,创建一个文件上传接口:/api/UpLoad/ReceiveFile,然后将该服务发布到IIS上即可

如何搭建文件上传服务器(本地服务的文件上传与远程服务的文件上传)(22)

然后客户端请求路径:https://cache.xxxxxx.com:8080/api/UpLoad/ReceiveFile

如何搭建文件上传服务器(本地服务的文件上传与远程服务的文件上传)(23)

1 /// <summary> 2 /// 文件上传服务 3 /// </summary> 4 public class UpLoadController : ApiController 5 { 6 /// <summary> 7 /// 文件接收接口 8 /// </summary> 9 /// <returns></returns> 10 [HttpPost] 11 public HttpResponseMessage ReceiveFile() 12 { 13 HttpResponseMessage response = null; 14 try 15 { 16 HttpPostedFile file = HttpContext.Current.Request.Files.Get("filedata"); //获取文件流 17 string getfilepath = HttpContext.Current.Request["filePath"] ?? "\\Images\\"; //获取保存路径(不包含文件名),默认:\\Images\\ 18 var filename = file.FileName; //获取文件名 19 20 //保存到本地的路径,~/表示指向上级根目录 21 string savePath = HttpContext.Current.Server.MapPath("~/" getfilepath); 22 23 //创建文件夹 24 if (!Directory.Exists(savePath)) 25 { 26 Directory.CreateDirectory(savePath); 27 } 28 29 //保存文件到指定路径下 30 string saveFilePath = Path.Combine(savePath filename); 31 Stream postStream = file.InputStream; 32 using (FileStream fs = new FileStream(saveFilePath FileMode.Create)) 33 { 34 byte[] new_b = new byte[postStream.Length]; 35 while (postStream.Read(new_b 0 new_b.Length) != 0) 36 { 37 fs.Write(new_b 0 new_b.Length); 38 } 39 postStream.Close(); 40 fs.Close(); 41 fs.Dispose(); 42 } 43 response = Request.CreateResponse(HttpStatusCode.OK); //成功返回200 44 } 45 catch (Exception) 46 { 47 response = Request.CreateResponse(HttpStatusCode.BadRequest); //返回400 48 } 49 return response; 50 } 51 52 }

如何搭建文件上传服务器(本地服务的文件上传与远程服务的文件上传)(24)

猜您喜欢: