当下.Net Core项目可是如雨后春笋一般发展起来,作为.Net大军中的一员,我热忱地拥抱了.Net Core并且积极使用其进行业务的开发,我们先介绍下.Net Core项目下实现文件上传下载接口。

一、开发环境

毋庸置疑,宇宙第一IDE VisualStudio 2017

二、项目结构

FilesController 文件上传下载控制器

PictureController 图片上传下载控制器

Return_Helper_DG 返回值帮助类

三、关键代码

1、首先我们来看Startup.cs 这个是我们的程序启动配置类,在这里我们进行一系列的配置。

跨域配置:

当然跨域少不了dll的引用,我们使用Nuget引用相关的引用包

服务器资源路径置换,这样可以防止客户端猜测服务端文件路径,制造一个虚拟的隐射进行访问,提高了安全性。

Startup.cs的完整代码如下:

 using Microsoft.AspNetCore.Builder;
 using Microsoft.AspNetCore.Hosting;
 using Microsoft.AspNetCore.Http;
 using Microsoft.Extensions.Configuration;
 using Microsoft.Extensions.DependencyInjection;
 using Microsoft.Extensions.FileProviders;
 using Microsoft.Extensions.Logging;
 using System.IO;

 namespace QX_Core.FilesCenter
 {
     public class Startup
     {
         public Startup(IHostingEnvironment env)
         {
             var builder = new ConfigurationBuilder()
                 .SetBasePath(env.ContentRootPath)
                 .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
                 .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true)
                 .AddEnvironmentVariables();
             Configuration = builder.Build();
         }

         public IConfigurationRoot Configuration { get; }

         // This method gets called by the runtime. Use this method to add services to the container.
         public void ConfigureServices(IServiceCollection services)
         {
             // Add framework services.
             services.AddMvc();
             #region CORS
             services.AddCors(options =>
             {
                 options.AddPolicy("AllowSpecificOrigin",
                     builder => builder.WithOrigins("http://localhost:3997").AllowAnyHeader().AllowAnyOrigin().AllowAnyMethod());
             });
             #endregion
         }

         // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
         public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
         {
             //loggerFactory.AddConsole(Configuration.GetSection("Logging"));
             //loggerFactory.AddDebug();

             app.UseMvc();
             // Shows UseCors with named policy.
             app.UseCors("AllowSpecificOrigin");

             app.UseStaticFiles(new StaticFileOptions()
             {
                 FileProvider = new PhysicalFileProvider(Path.Combine(Directory.GetCurrentDirectory(), @"wwwroot/Files")),
                 RequestPath = new PathString("/src")
             });
         }
     }
 }

2、Return_Helper_DG类用户设置一个统一的返回值反馈到客户端
Return_Helper_DG类的代码如下:

 using System.Net;
 /**
 * author:qixiao
 * create:2017-5-19 15:15:05
 * */
 namespace QX_Core.FilesCenter.QX_Core.Helper
 {
     public abstract class Return_Helper_DG
     {
         public static object IsSuccess_Msg_Data_HttpCode(bool isSuccess, string msg, dynamic data, HttpStatusCode httpCode = HttpStatusCode.OK)
         {
             return new { isSuccess = isSuccess, msg = msg, httpCode = httpCode, data = data };
         }
         , HttpStatusCode httpCode = HttpStatusCode.OK)
         {
             return new { isSuccess = true, msg = msg, httpCode = httpCode, data = data, dataCount = dataCount };
         }
         , , HttpStatusCode httpCode = HttpStatusCode.InternalServerError)
         {
             return new { isSuccess = false, msg = msg, httpCode = httpCode, errorCode = errorCode, errorLevel = errorLevel };
         }
     }
 }

3、FilesController是我们的文件上传控制器接口,这里定义了对上传的文件的接收操作,并且在控制器上启用跨域配置

 using Microsoft.AspNetCore.Cors;
 using Microsoft.AspNetCore.Hosting;
 using Microsoft.AspNetCore.Mvc;
 using Microsoft.Net.Http.Headers;
 using QX_Core.FilesCenter.QX_Core.Helper;
 using System;
 using System.Collections.Generic;
 using System.IO;
 using System.Linq;

 namespace QX_Core.FilesCenter.Controllers
 {
     //[Produces("application/json")]
     [Route("api/[controller]")]
     [EnableCors("AllowSpecificOrigin")]
     public class FilesController : Controller
     {
         private IHostingEnvironment hostingEnv;

         public FilesController(IHostingEnvironment env)
         {
             this.hostingEnv = env;
         }

         [HttpPost]
         public IActionResult Post()
         {
             var files = Request.Form.Files;
             long size = files.Sum(f => f.Length);

             //size > 100MB refuse upload !
             )
             {
                 return Json(Return_Helper_DG.Error_Msg_Ecode_Elevel_HttpCode("files total size > 100MB , server refused !"));
             }

             List<string> filePathResultList = new List<string>();

             foreach (var file in files)
             {
                 var fileName = ContentDispositionHeaderValue.Parse(file.ContentDisposition).FileName.Trim('"');

                 string filePath = hostingEnv.WebRootPath + $@"\Files\Files\";

                 if (!Directory.Exists(filePath))
                 {
                     Directory.CreateDirectory(filePath);
                 }

                 fileName = Guid.NewGuid() + ];

                 string fileFullName = filePath + fileName;

                 using (FileStream fs = System.IO.File.Create(fileFullName))
                 {
                     file.CopyTo(fs);
                     fs.Flush();
                 }
                 filePathResultList.Add($"/src/Files/{fileName}");
             }

             string message = $"{files.Count} file(s) /{size} bytes uploaded successfully!";

             return Json(Return_Helper_DG.Success_Msg_Data_DCount_HttpCode(message, filePathResultList, filePathResultList.Count));
         }

     }
 }

在上述的代码中,我们对上传的文件的大小进行了限制,并且对文件的大小进行反馈。

4、PictureController 图片上传控制器接口,类似于文件,不过对上传的图片类型进行了校验和限制

 using Microsoft.AspNetCore.Cors;
 using Microsoft.AspNetCore.Hosting;
 using Microsoft.AspNetCore.Mvc;
 using Microsoft.Net.Http.Headers;
 using QX_Core.FilesCenter.QX_Core.Helper;
 using System;
 using System.Collections.Generic;
 using System.IO;
 using System.Linq;

 namespace QX_Core.FilesCenter.Controllers
 {
     //[Produces("application/json")]
     [Route("api/[controller]")]
     [EnableCors("AllowSpecificOrigin")]
     public class PicturesController : Controller
     {
         private IHostingEnvironment hostingEnv;

         string[] pictureFormatArray = { "png", "jpg", "jpeg", "bmp", "gif","ico", "PNG", "JPG", "JPEG", "BMP", "GIF","ICO" };

         public PicturesController(IHostingEnvironment env)
         {
             this.hostingEnv = env;
         }

         [HttpPost]
         public IActionResult Post()
         {
             var files = Request.Form.Files;
             long size = files.Sum(f => f.Length);

             //size > 100MB refuse upload !
             )
             {
                 return Json(Return_Helper_DG.Error_Msg_Ecode_Elevel_HttpCode("pictures total size > 100MB , server refused !"));
             }

             List<string> filePathResultList = new List<string>();

             foreach (var file in files)
             {
                 var fileName = ContentDispositionHeaderValue.Parse(file.ContentDisposition).FileName.Trim('"');

                 string filePath = hostingEnv.WebRootPath + $@"\Files\Pictures\";

                 if (!Directory.Exists(filePath))
                 {
                     Directory.CreateDirectory(filePath);
                 }

                 ];

                 if (!pictureFormatArray.Contains(suffix))
                 {
                     return Json(Return_Helper_DG.Error_Msg_Ecode_Elevel_HttpCode("the picture format not support ! you must upload files that suffix like 'png','jpg','jpeg','bmp','gif','ico'."));
                 }

                 fileName = Guid.NewGuid() + "." + suffix;

                 string fileFullName = filePath + fileName;

                 using (FileStream fs = System.IO.File.Create(fileFullName))
                 {
                     file.CopyTo(fs);
                     fs.Flush();
                 }
                 filePathResultList.Add($"/src/Pictures/{fileName}");
             }

             string message = $"{files.Count} file(s) /{size} bytes uploaded successfully!";

             return Json(Return_Helper_DG.Success_Msg_Data_DCount_HttpCode(message, filePathResultList, filePathResultList.Count));
         }

     }
 }

到此,我们的文件图片上传代码已经全部完成,下面我们对文件上传的客户端进行实现

四、客户端的实现

客户端我们很简单地用jQuery Ajax的方式进行图片文件的提交,客户端代码的实现:

 <!doctype>

 <head>
     <script src="jquery-3.2.0.min.js"></script>
     <script>
         $(document).ready(function () {
             var appDomain = "http://localhost:53972/";
             $("#btn_fileUpload").click(function () {
                                 var fileUpload = $("#files").get(0);
                 var files = fileUpload.files;
                 var data = new FormData();
                 for (var i = 0; i < files.length; i++) {
                       data.append(files[i].name, files[i]);
                 }
                 $.ajax({
                     type: "POST",
                     url: appDomain+'api/Pictures',
                     contentType: false,
                     processData: false,
                     data: data,
                     success: function (data) {
                         console.log(JSON.stringify(data));
                     },
                     error: function () {
                         console.log(JSON.stringify(data));
                     }
                 });
             });
             //end click

         })
     </script>
 </head>
 <title></title>

 <body>
     <article>
         <header>
             <h2>article-form</h2>
         </header>
         <p>
             <form id="uploadForm" enctype="multipart/form-data">
                 <input type="file" id="files" name="files" placeholder="file" multiple>file-multiple属性可以选择多项<br><br>
                 <input type="button" id="btn_fileUpload" value="fileUpload">
             </form>
         </p>
     </article>
 </body>

五、代码测试

1.启动服务器

我们可以看到一个控制台和一个web自动启动,并且web显示默认的Values控制器的请求返回值。

2.图片上传

我们使用ajax的方式进行图片的上传操作,打开测试web页面,并且选择图片,点击上传,查看控制台返回的结果:

可以看到,一张图片上传成功!

输入返回的地址,我们可以看到成功访问到了图片,特别注意这里服务器路径的改变:


多图片上传:

可见,多图片上传没有任何问题!


同样进行文件上传的测试:

同样,文件上传也没有任何问题!

六、总结

至此,我们已经实现了预期的.Net Core图片文件上传的全部功能!

.Net Core 图片文件上传下载的更多相关文章

  1. JAVA Web 之 struts2文件上传下载演示(一)(转)

    JAVA Web 之 struts2文件上传下载演示(一) 一.文件上传演示 1.需要的jar包 大多数的jar包都是struts里面的,大家把jar包直接复制到WebContent/WEB-INF/ ...

  2. JavaWeb 文件上传下载

    1. 文件上传下载概述 1.1. 什么是文件上传下载 所谓文件上传下载就是将本地文件上传到服务器端,从服务器端下载文件到本地的过程.例如目前网站需要上传头像.上传下载图片或网盘等功能都是利用文件上传下 ...

  3. SpringMVC(三) RESTful架构和文件上传下载

    RESTful架构 REST全名为:Representational State Transfer.资源表现层状态转化.是目前最流行的一种互联网软件架构. 它结构清晰.符合标准.易于理解.扩展方便,所 ...

  4. 转载:JavaWeb 文件上传下载

    转自:https://www.cnblogs.com/aaron911/p/7797877.html 1. 文件上传下载概述 1.1. 什么是文件上传下载 所谓文件上传下载就是将本地文件上传到服务器端 ...

  5. Struts的文件上传下载

    Struts的文件上传下载 1.文件上传 Struts2的文件上传也是使用fileUpload的组件,这个组默认是集合在框架里面的.且是使用拦截器:<interceptor name=" ...

  6. JavaWeb实现文件上传下载功能实例解析

    转:http://www.cnblogs.com/xdp-gacl/p/4200090.html JavaWeb实现文件上传下载功能实例解析 在Web应用系统开发中,文件上传和下载功能是非常常用的功能 ...

  7. JAVA Web 之 struts2文件上传下载演示(二)(转)

    JAVA Web 之 struts2文件上传下载演示(二) 一.文件上传演示 详细查看本人的另一篇博客 http://titanseason.iteye.com/blog/1489397 二.文件下载 ...

  8. java web 文件上传下载

    文件上传下载案例: 首先是此案例工程的目录结构:

  9. 文件上传下载样式 --- bootstrap

    在平时工作中,文件上传下载功能属于不可或缺的一部分.bootstrap前端样式框架也使用的比较多,现在根据bootstrap强大的样式模板,自定义一种文件下载的样式. 后续会使用spring MVC框 ...

随机推荐

  1. MySQL之使用DDL语句创建表

    一.使用DDL语句创建表 DDL语言全面数据定义语言(Data Define Language) 主要的DDL动词: CREATE(创建).DROP(删除).ALTER(修改) TRUNCATE(截断 ...

  2. 【2017-04--28】Winform中ListView控件

    ListView 1.先设置列,设置视图属性选择Details. 添加列,修改列名. 2.编辑项(添加行数据) 添加一个ListViewItem对象,该对象的Text对应着是第一列的数据, 在该对象的 ...

  3. 完美实现在同一个页面中使用不同样式的artDialog样式

    偶然发现artDialog.js这个插件,就被其优雅的设计及漂亮的效果深深吸引,在做例子时碰到了一些想当然它应该提供但却没有提供的功能,不过这都不影响我对它的喜爱,下面说一下遇到的问题吧! artDi ...

  4. windows下安装Redis并部署成服务

    windows下安装Redis并部署成服务 Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库.缓存和消息中间件. 一:下载 下载地址: windows版本: http ...

  5. 《分布式Java应用之基础与实践》读书笔记三

    对于大型分布式Java应用与SOA,我们可以从以下几个方面来分析: 为什么需要SOA SOA是什么 eBay的SOA平台 可实现SOA的方法 为什么需要SOA   第一个现象是系统多元化带来的问题,可 ...

  6. Android ViewPager动画切换

    使用方法 setPageTransformer 例如: ViewPager.setPageTransformer(true, new ZoomOutPageTransformer()) package ...

  7. node.js 中回调函数callback(转载),说的很清楚,看一遍就理解了

    最近在看 express,满眼看去,到处是以函数作为参数的回调函数的使用.如果这个概念理解不了,nodejs.express 的代码就会看得一塌糊涂.比如: 复制代码 代码如下: app.use(fu ...

  8. 用Docker在一台笔记本电脑上搭建一个具有10个节点7种角色的Hadoop集群(上)-快速上手Docker

    如果想在一台电脑上搭建一个多节点的Hadoop集群,传统的方式是使用多个虚拟机.但这种方式占用的资源比较多,一台笔记本能同时运行的虚拟机的数量是很有限的.这个时候我们可以使用Docker.Docker ...

  9. 通过winform+模拟登录实现快速一键登录到人才招聘网站

    之前为了便于人事部门招聘登录网站更简洁高效,免去每天频繁输网址.用户名.密码等相关登录信息,特基于winform+HttpWebRequest实现模拟请求登录,最终达到一键登录到招聘网站后台的效果. ...

  10. SQLServer 延迟事务持久性

    SQL Server 2014新功能 -- 延迟事务持久性(Delayed Transaction Durability) SQL Server事务提交默认是完全持久性的(Full Durable), ...