Asp.net core 学习笔记 ( upload/download files 文件上传与下载 )

2017-09-25

refer : https://docs.microsoft.com/en-us/aspnet/core/mvc/models/file-uploads

https://www.codeproject.com/Articles/1203408/Upload-Download-Files-in-ASP-NET-Core

这里只说说小文件上传.

先看看前端 js 代码

<input id="inputFile" type="file" />
<script>
    document.getElementById(‘inputFile‘).addEventListener(‘change‘, (e) => {
        let files = e.target.files;
        let formData = new FormData();
        formData.append("file", files[0]);
        let http = new XMLHttpRequest();
        http.open(‘POST‘, ‘/upload-file‘, true);
        http.send(formData);
    }, false);
</script>

如果要上传多个文件就 append 多几个就是了

c#

public class UploadFileData
{
    public IFormFile file { get; set; }
}

[Area("Web")]
public class UploadController : Controller
{
    public UploadController(
            IHostingEnvironment environment
    )
    {
        this.environment = environment;
    }

    private IHostingEnvironment environment { get; set; }

    [HttpPost("upload-file")]
    public async Task<IActionResult> uploadFile(UploadFileData data)
    {
        var allFiles = Request.Form.Files; // 多文件的话可以直接从 form 拿到完
        var root = environment.WebRootPath;
        var extension = Path.GetExtension(data.file.FileName);
        var guid = Guid.NewGuid().ToString();
        var fullPath = $@"{root}\images\{guid + extension}";
        using (FileStream stream = new FileStream(fullPath, FileMode.Create))
        {
            await data.file.CopyToAsync(stream);
        }
        return Ok();
    }
    [Route("upload")]
    public async Task<IActionResult> Index()
    {
        return View();
    }
}

上面的是最简单的版本,创建 file 然后把 upload file stream 写入

还有一个常用的场景是, 上传图片要做 EXIF 处理.

可以用 Magick.NET 目前支持 core, 不过呢, 好像只支持 window 场景. 如果你不是 windows 可能要在等等或则用其它插件.

using (var stream = data.file.OpenReadStream())
using (MagickImage image = new MagickImage(stream))
{
    ExifProfile profile = image.GetExifProfile();
    image.Settings.SetDefine(MagickFormat.Jpeg, "sampling-factor", "4:2:0");
    image.Strip(); //这句会把图片的所有 EXIF 洗掉
    image.Quality = 85;

    if (profile != null)
    {
        ExifValue orientation = profile.Values.SingleOrDefault(v => v.Tag == ExifTag.Orientation);
        if (orientation != null)
        {
            int orientationInt = Convert.ToInt32(orientation.Value);
            if (orientationInt == 6)
            {
                image.Rotate(90);
            }
            else if (orientationInt == 8)
            {
                image.Rotate(-90);
            }
            else if (orientationInt == 8)
            {
                image.Rotate(180);
            }
        }
        image.Write(fullPath);
    }
    else
    {
        image.Write(fullPath);
    }
}

很简单吧.

再来一个 zip 的

using (var stream = data.file.OpenReadStream())
using (var compressedFileStream = new FileStream($@"{root}\images\{guid}.zip", FileMode.Create))
using (var zipArchive = new ZipArchive(compressedFileStream, ZipArchiveMode.Update, false))
{
    var zipEntry = zipArchive.CreateEntry(data.file.FileName);
    using (var zipEntryStream = zipEntry.Open())
    {
        stream.CopyTo(zipEntryStream);
    }
}

core 支持 ZipArchive 哦

下载也很容易

public UploadController(
        IHostingEnvironment environment,
        IContentTypeProvider contentTypeProvider
)
{
    this.environment = environment;
    this.contentTypeProvider = contentTypeProvider;
}

private IHostingEnvironment environment { get; set; }
private IContentTypeProvider contentTypeProvider { get; set; }

[HttpGet("download-file")]
public FileResult downloadFile(string name, string display)
{
    string contentType;
    contentTypeProvider.TryGetContentType(name, out contentType);
    HttpContext.Response.ContentType = contentType;
    string path = environment.WebRootPath + @"\images\" + name; // 注意哦, 不要像我这样直接使用客户端的值来拼接 path, 危险的
    FileContentResult result = new FileContentResult(System.IO.File.ReadAllBytes(path), contentType)
    {
        FileDownloadName = display
    };
    return result;
}

html

<a href="/download-file?name=123.jpg&display=aaa.jpg" download  >download</a>
时间: 2024-10-18 11:54:29

Asp.net core 学习笔记 ( upload/download files 文件上传与下载 )的相关文章

asp.net core系列 69 Amazon S3 资源文件上传示例

原文:asp.net core系列 69 Amazon S3 资源文件上传示例 一.  上传示例 Amazon Simple Storage Service 是互联网存储解决方案.该服务旨在降低开发人员进行网络规模级计算的难度. Amazon S3 提供了一个简单 Web 服务接口,可用于随时在 Web 上的任何位置存储和检索任何数量的数据.此服务让所有开发人员都能访问同一个具备高扩展性.可靠性.安全性和快速价廉的数据存储基础设施, Amazon 用它来运行其全球的网站网络.此服务旨在为开发人员

2014-07-23 利用ASP.NET自带控件实现单文件上传与下载

效果图 上传文件页面: 下载文件页面:  1.母版页site.Master <%@ Master Language="C#" AutoEventWireup="true" CodeBehind="Site.master.cs" Inherits="upAndDown.SiteMaster" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict/

学习笔记(十一)文件上传下载

5. 文件下载的需求: 1). 在文件上传成功后的 success.jsp 页面上提供一个 "下载资源" 的超链接 2). 点击 "下载资源" 的超链接, 会把请求发送到 Servlet, 读取数据库, 在页面上显示可以下载的资源信息 FileName: 11.尚硅谷_JavaWEB_监听器.pptxDesc: AA下载 FileName: 12.尚硅谷_JavaWEB_文件的上传和下载.pptxDesc: BB下载 3). 再点击下载, 即可完成对应文件的下载.

java web 学习笔记 - jsp用的文件上传组件 SmartUpload

---恢复内容开始--- 1. SmartUpload 此控件在jsp中被广泛的使用,而FileUpload控件主要是用在框架中 2. 如果想要使用,需要在tomcat的lib目录中,将SmartUpload的jar包拷贝进来 3.通过表单上传文件,由于文件动不动就是几百k, 表单的方法必须是post,不可能用get方法进行地址重写. 另外,如果要上传文件的话,需要对表单进行封装 mutipart/form-data 以下是smartupload_demo01.jsp 表单封装之后,无法通过re

文件上传与下载学习笔记(1)---文件上传原理及配置

一:原理:将客户端的文件上传到服务器端的临时目录,再将服务器端的临时文件移动到指定目录. 二:客户端的配置 表单的method必须为post方法 表单必须添加enctype="multipart/form-data"属性 二者缺一不可. 三:将临时文件移动到指定目录 两种方法:1:move_uploaded_file($filename, $destination) 2:copy($source, $dest) 四:php.ini中的配置 在php.ini中搜索uploads ,会看到

asp.net core文件上传与下载

public class FileController : Controller { /// <summary> /// 跟asp.net webform和asp.net mvc不一样,通过注入的方式,获取项目所在路径 /// </summary> private IHostingEnvironment _hostEnv; public FileController(IHostingEnvironment env) { _hostEnv = env; //其他服务 } public

Selenium2学习-039-WebUI自动化实战实例-文件上传下载

通常在 WebUI 自动化测试过程中必然会涉及到文件上传的自动化测试需求,而开发在进行相应的技术实现是不同的,粗略可划分为两类:input标签类(类型为file)和非input标签类(例如:div.a或其他方式结合实现). 非input标签类因其有各式各样的实现方式,需要考虑具体的场景,因而此文对此类文件上传不做讲解,以input标签实现文件上传的方式进行讲解,请知悉! 解决方案有如下三种: 1.定位元素直接通过sendkeys修改input标签的文件链接: 2.通过第三方控件(AutoIt)编

JavaWeb学习总结(五十)——文件上传和下载

在Web应用系统开发中,文件上传和下载功能是非常常用的功能,今天来讲一下JavaWeb中的文件上传和下载功能的实现. 对于文件上传,浏览器在上传的过程中是将文件以流的形式提交到服务器端的,如果直接使用Servlet获取上传文件的输入流然后再解析里面的请求参数是比较麻烦,所以一般选择采用apache的开源工具common-fileupload这个文件上传组件.这个common-fileupload上传组件的jar包可以去apache官网上面下载,也可以在struts的lib文件夹下面找到,stru

JavaWeb学习总结,文件上传和下载

在Web应用系统开发中,文件上传和下载功能是非常常用的功能,今天来讲一下JavaWeb中的文件上传和下载功能的实现. 对于文件上传,浏览器在上传的过程中是将文件以流的形式提交到服务器端的,如果直接使用Servlet获取上传文件的输入流然后再解析里面的请求参数是比较麻烦,所以一般选择采用apache的开源工具common-fileupload这个文件上传组件.这个common-fileupload上传组件的jar包可以去apache官网上面下载,也可以在struts的lib文件夹下面找到,stru