ASP.NET Core单文件和多文件上传并保存到服务端的方法

 更新时间:2021年9月22日 10:00  点击:1680

前言:

  在我们日常开发中,关于图片,视频,音频,文档等相关文件上传并保存到服务端中是非常常见的一个功能,今天主要是把自己在开发中常用的两种方式记录下来方便一下直接使用,并且希望能够帮助到有需要的同学!

一、配置ASP.NET Core中的静态文件:

简单概述:

  在ASP.NET Core应用中静态资源文件需要进行相应的配置才能够提供给客户端直接使用。

详情描述请参考官方文档:
https://docs.microsoft.com/zh-cn/aspnet/core/fundamentals/static-files?view=aspnetcore-3.1

简单配置,提供 Web 根目录内的文件:

调用 Startup.Configure中的UseStaticFiles 方法配置:

public void Configure(IApplicationBuilder app)
{
  app.UseStaticFiles();
}

二、文件服务器和应用程序配置(IIS,Kestrel):

详情描述,请参考官方文档说明:
https://docs.microsoft.com/zh-cn/aspnet/core/mvc/models/file-uploads?view=aspnetcore-3.1#server-and-app-configuration

多部分正文长度限制:

MultipartBodyLengthLimit 设置每个多部分正文的长度限制。 分析超出此限制的窗体部分时,会引发 InvalidDataException。 默认值为 134,217,728 (128 MB)。 使用 MultipartBodyLengthLimit 中的 Startup.ConfigureServices 设置自定义此限制:

public void ConfigureServices(IServiceCollection services)
{
  services.Configure<FormOptions>(options =>
  {
    // Set the limit to 256 MB
    options.MultipartBodyLengthLimit = 268435456;
  });
}

Kestrel 最大请求正文大小:

对于 Kestrel 托管的应用,默认的最大请求正文大小为 30,000,000 个字节,约为 28.6 MB。 使用 MaxRequestBodySize Kestrel 服务器选项自定义限制:

public static IHostBuilder CreateHostBuilder(string[] args) =>
  Host.CreateDefaultBuilder(args)
    .ConfigureKestrel((context, options) =>
    {
      // Handle requests up to 50 MB
      options.Limits.MaxRequestBodySize = 52428800;
    })
    .ConfigureWebHostDefaults(webBuilder =>
    {
      webBuilder.UseStartup<Startup>();
    });

IIS 内容长度限制:

默认的请求限制 (maxAllowedContentLength) 为 30,000,000 字节,大约 28.6 MB。 请在 web.config 文件中自定义此限制:

<system.webServer>
 <security>
  <requestFiltering>
   <!-- Handle requests up to 50 MB -->
   <requestLimits maxAllowedContentLength="52428800" />
  </requestFiltering>
 </security>
</system.webServer>

三、单文件上传:

using System;
using System.IO;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Mvc;

namespace FileUploadManage.Controllers
{
  /// <summary>
  /// 图片,视频,音频,文档等相关文件通用上传服务类
  /// </summary>
  public class FileUploadController : Controller
  {
    private static IHostingEnvironment _hostingEnvironment;

    public FileUploadController(IHostingEnvironment hostingEnvironment)
    {
      _hostingEnvironment = hostingEnvironment;
    }

    /// <summary>
    /// 单文件上传
    /// </summary>
    /// <returns></returns>
    public JsonResult SingleFileUpload()
    {
      var formFile = Request.Form.Files[0];//获取请求发送过来的文件
      var currentDate = DateTime.Now;
      var webRootPath = _hostingEnvironment.WebRootPath;//>>>相当于HttpContext.Current.Server.MapPath("") 

      try
      {
        var filePath = $"/UploadFile/{currentDate:yyyyMMdd}/";

        //创建每日存储文件夹
        if (!Directory.Exists(webRootPath + filePath))
        {
          Directory.CreateDirectory(webRootPath + filePath);
        }

        if (formFile != null)
        {
          //文件后缀
          var fileExtension = Path.GetExtension(formFile.FileName);//获取文件格式,拓展名

          //判断文件大小
          var fileSize = formFile.Length;

          if (fileSize > 1024 * 1024 * 10) //10M TODO:(1mb=1024X1024b)
          {
            return new JsonResult(new { isSuccess = false, resultMsg = "上传的文件不能大于10M" });
          }

          //保存的文件名称(以名称和保存时间命名)
          var saveName = formFile.FileName.Substring(0, formFile.FileName.LastIndexOf('.'))+"_"+currentDate.ToString("HHmmss")+ fileExtension;

          //文件保存
          using (var fs = System.IO.File.Create(webRootPath + filePath + saveName))
          {
            formFile.CopyTo(fs);
            fs.Flush();
          }

          //完整的文件路径
          var completeFilePath = Path.Combine(filePath, saveName);

          return new JsonResult(new { isSuccess = true, returnMsg = "上传成功", completeFilePath = completeFilePath });
        }
        else
        {
          return new JsonResult(new { isSuccess = false, resultMsg = "上传失败,未检测上传的文件信息~" });
        }

      }
      catch (Exception ex)
      {
        return new JsonResult(new { isSuccess = false, resultMsg = "文件保存失败,异常信息为:" + ex.Message });
      }
    }

  }
}

四、多文件上传:

using System;
using System.Collections.Generic;
using System.IO;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Http.Internal;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore.Internal;

namespace FileUploadManage.Controllers
{
  /// <summary>
  /// 图片,视频,音频,文档等相关文件通用上传服务类
  /// </summary>
  public class FileUploadController : Controller
  {
    private static IHostingEnvironment _hostingEnvironment;

    public FileUploadController(IHostingEnvironment hostingEnvironment)
    {
      _hostingEnvironment = hostingEnvironment;
    }

    /// <summary>
    /// 多文件上传
    /// </summary>
    /// <param name="formCollection">表单集合值</param>
    /// <returns>服务器存储的文件信息</returns>

    public JsonResult MultiFileUpload(IFormCollection formCollection)
    {
      var currentDate = DateTime.Now;
      var webRootPath = _hostingEnvironment.WebRootPath;//>>>相当于HttpContext.Current.Server.MapPath("") 
      var uploadFileRequestList = new List<UploadFileRequest>();
      try
      {
        //FormCollection转化为FormFileCollection
        var files = (FormFileCollection)formCollection.Files;

        if (files.Any())
        {
          foreach (var file in files)
          {
            var uploadFileRequest = new UploadFileRequest();

            var filePath = $"/UploadFile/{currentDate:yyyyMMdd}/";

            //创建每日存储文件夹
            if (!Directory.Exists(webRootPath + filePath))
            {
              Directory.CreateDirectory(webRootPath + filePath);
            }

            //文件后缀
            var fileExtension = Path.GetExtension(file.FileName);//获取文件格式,拓展名

            //判断文件大小
            var fileSize = file.Length;

            if (fileSize > 1024 * 1024 * 10) //10M TODO:(1mb=1024X1024b)
            {
              continue;
            }

            //保存的文件名称(以名称和保存时间命名)
            var saveName = file.FileName.Substring(0, file.FileName.LastIndexOf('.')) + "_" + currentDate.ToString("HHmmss") + fileExtension;

            //文件保存
            using (var fs = System.IO.File.Create(webRootPath + filePath + saveName))
            {
              file.CopyTo(fs);
              fs.Flush();
            }

            //完整的文件路径
            var completeFilePath = Path.Combine(filePath, saveName);

            uploadFileRequestList.Add(new UploadFileRequest()
            {
              FileName = saveName,
              FilePath = completeFilePath
            });
          }
        }
        else
        {
          return new JsonResult(new { isSuccess = false, resultMsg = "上传失败,未检测上传的文件信息~" });
        }
      }
      catch (Exception ex)
      {
        return new JsonResult(new { isSuccess = false, resultMsg = "文件保存失败,异常信息为:" + ex.Message });
      }

      if (uploadFileRequestList.Any())
      {
        return new JsonResult(new { isSuccess = true, returnMsg = "上传成功", filePathArray = uploadFileRequestList });
      }
      else
      {
        return new JsonResult(new { isSuccess = false, resultMsg = "网络打瞌睡了,文件保存失败" });
      }
    }

  }

  /// <summary>
  /// 对文件上传响应模型
  /// </summary>
  public class UploadFileRequest
  {
    /// <summary>
    /// 文件名称
    /// </summary>
    public string FileName { get; set; }

    /// <summary>
    /// 文件路径
    /// </summary>
    public string FilePath { get; set; }
  }
}

到此这篇关于ASP.NET Core单文件和多文件上传并保存到服务端的方法的文章就介绍到这了,更多相关ASP.NET Core文件上传内容请搜索猪先飞以前的文章或继续浏览下面的相关文章希望大家以后多多支持猪先飞!

作者:追逐时光

作者简介:一个热爱编程,善于分享,喜欢学习、探索、尝试新事物,新技术的程序猿。

[!--infotagslink--]

相关文章

  • php读取zip文件(删除文件,提取文件,增加文件)实例

    下面小编来给大家演示几个php操作zip文件的实例,我们可以读取zip包中指定文件与删除zip包中指定文件,下面来给大这介绍一下。 从zip压缩文件中提取文件 代...2016-11-25
  • ASP.NET购物车实现过程详解

    这篇文章主要为大家详细介绍了ASP.NET购物车的实现过程,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-09-22
  • Jupyter Notebook读取csv文件出现的问题及解决

    这篇文章主要介绍了JupyterNotebook读取csv文件出现的问题及解决,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2023-01-06
  • .NET Core下使用Kafka的方法步骤

    这篇文章主要介绍了.NET Core下使用Kafka的方法步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-09-22
  • Photoshop打开PSD文件空白怎么解决

    有时我们接受或下载到的PSD文件打开是空白的,那么我们要如何来解决这个 问题了,下面一聚教程小伙伴就为各位介绍Photoshop打开PSD文件空白解决办法。 1、如我们打开...2016-09-14
  • 在ASP.NET 2.0中操作数据之七十二:调试存储过程

    在开发过程中,使用Visual Studio的断点调试功能可以很方便帮我们调试发现程序存在的错误,同样Visual Studio也支持对SQL Server里面的存储过程进行调试,下面就让我们看看具体的调试方法。...2021-09-22
  • 解决python 使用openpyxl读写大文件的坑

    这篇文章主要介绍了解决python 使用openpyxl读写大文件的坑,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-03-13
  • C#实现HTTP下载文件的方法

    这篇文章主要介绍了C#实现HTTP下载文件的方法,包括了HTTP通信的创建、本地文件的写入等,非常具有实用价值,需要的朋友可以参考下...2020-06-25
  • SpringBoot实现excel文件生成和下载

    这篇文章主要为大家详细介绍了SpringBoot实现excel文件生成和下载,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-02-09
  • C#操作本地文件及保存文件到数据库的基本方法总结

    C#使用System.IO中的文件操作方法在Windows系统中处理本地文件相当顺手,这里我们还总结了在Oracle中保存文件的方法,嗯,接下来就来看看整理的C#操作本地文件及保存文件到数据库的基本方法总结...2020-06-25
  • php无刷新利用iframe实现页面无刷新上传文件(1/2)

    利用form表单的target属性和iframe 一、上传文件的一个php教程方法。 该方法接受一个$file参数,该参数为从客户端获取的$_files变量,返回重新命名后的文件名,如果上传失...2016-11-25
  • Php文件上传类class.upload.php用法示例

    本文章来人大家介绍一个php文件上传类的使用方法,期望此实例对各位php入门者会有不小帮助哦。 简介 Class.upload.php是用于管理上传文件的php文件上传类, 它可以帮...2016-11-25
  • php批量替换内容或指定目录下所有文件内容

    要替换字符串中的内容我们只要利用php相关函数,如strstr,str_replace,正则表达式了,那么我们要替换目录所有文件的内容就需要先遍历目录再打开文件再利用上面讲的函数替...2016-11-25
  • PHP文件上传一些小收获

    又码了一个周末的代码,这次在做一些关于文件上传的东西。(PHP UPLOAD)小有收获项目是一个BT种子列表,用户有权限上传自己的种子,然后配合BT TRACK服务器把种子的信息写出来...2016-11-25
  • jQuery实现简单的文件上传进度条效果

    本文实例讲述了jQuery实现文件上传进度条效果的代码。分享给大家供大家参考。具体如下: 运行效果截图如下:具体代码如下:<!DOCTYPE html><html><head><meta charset="utf-8"><title>upload</title><link rel="stylesheet...2015-11-24
  • AI源文件转photoshop图像变模糊问题解决教程

    今天小编在这里就来给photoshop的这一款软件的使用者们来说下AI源文件转photoshop图像变模糊问题的解决教程,各位想知道具体解决方法的使用者们,那么下面就快来跟着小编...2016-09-14
  • Zend studio文件注释模板设置方法

    步骤:Window -> PHP -> Editor -> Templates,这里可以设置(增、删、改、导入等)管理你的模板。新建文件注释、函数注释、代码块等模板的实例新建模板,分别输入Name、Description、Patterna)文件注释Name: 3cfileDescriptio...2013-10-04
  • C++万能库头文件在vs中的安装步骤(图文)

    这篇文章主要介绍了C++万能库头文件在vs中的安装步骤(图文),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-02-23
  • php文件上传你必须知道的几点

    本篇文章主要说明的是与php文件上传的相关配置的知识点。PHP文件上传功能配置主要涉及php.ini配置文件中的upload_tmp_dir、upload_max_filesize、post_max_size等选项,下面一一说明。打开php.ini配置文件找到File Upl...2015-10-21
  • ant design中upload组件上传大文件,显示进度条进度的实例

    这篇文章主要介绍了ant design中upload组件上传大文件,显示进度条进度的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-10-29