IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> JavaScript知识库 -> 网页上传文件夹 Angular + NetCore API 实现 -> 正文阅读

[JavaScript知识库]网页上传文件夹 Angular + NetCore API 实现

1、实现原理

????????前端采用 webkitdirectory 属性选择文件夹,然后遍历文件夹中的文件,循环调用后端接口一个文件一个文件的上传。某度网盘也是同样的原理。

2、前端实现

????????本文记录了Angular的写法,原生html+js的方式代码也差不多。模板页面代码如下:

<input?type="file"?(change)="selectFolder($event)"?webkitdirectory?/>

ts 代码 selectFolder 方法如下:

??selectFolder(event:?any)?{
????let?files?=?event.target.files;
????console.log(files);
????for?(let?i?=?0;?i?<?files.length;?i++)?{
??????let?formData?=?new?FormData();
??????formData.append("file",?files[i]);
??????this.http.post("http://127.0.0.1:8888/api/xxx/upload",?formData).subscribe(d?=>?{
????????console.log(d);
??????});
????}
??}
  
  //组件构造方法中注入的HttpClient
  constructor(private?http:?HttpClient)?{
??}

? ? ? ?页面运行效果:

?????????点击按钮选择文件夹:

? ? ? ? 这里如果 input 标签没有添加?webkitdirectory 属性,就不会有上传按钮,取而代之的是打开按钮,只能打开文件夹进行文件选择,而不能选中文件夹进行上传。选中文件夹a点击上传,会出现上传提示:

????????点击上传按钮完成操作。?查看打印可以发现,发送的对象里边有一个webkitRelativePath字段,包含了文件的完整路径信息:

?3、后端实现

????????后端代码需要实现接收前端请求,将流保存为本地文件。本文记录的是netcore api的实现,在Controller 中添加 Action:

        using Microsoft.AspNetCore.Http;
        using Microsoft.AspNetCore.Mvc;
       
        
        [HttpPost]
        public MsgResult Upload(IFormFile file)
        {
            var result = new MsgResult(1, "成功");

            string baseFolder = AppDomain.CurrentDomain.BaseDirectory + "/upload/";     //上传文件保存的根目录
            if (!Directory.Exists(baseFolder))
            {
                Directory.CreateDirectory(baseFolder);
            }

            var subFolders = file.FileName.Split("/").SkipLast(1).ToList();    //文件多级目录文件夹名称
            string folder = baseFolder;
            for (int j = 0; j < subFolders.Count; j++)
            {
                folder = folder + subFolders[j] + "/";
                if (!Directory.Exists(folder))
                {
                    Directory.CreateDirectory(folder);                    //若不存文件夹则创建  
                }
            }
            string path = baseFolder + file.FileName;
            using (var stream = new FileStream(path, FileMode.Create))
            {
                file.CopyTo(stream);
            }

            return result;
        }

????????通过代码可以发现 file.FileName 字段就包含了文件的完整路径信息,调试监视文件对象:

????????运行程序,就可以发现在程序的执行目录下保存了与前端上传的相同的目录结构及文件。?

  JavaScript知识库 最新文章
ES6的相关知识点
react 函数式组件 & react其他一些总结
Vue基础超详细
前端JS也可以连点成线(Vue中运用 AntVG6)
Vue事件处理的基本使用
Vue后台项目的记录 (一)
前后端分离vue跨域,devServer配置proxy代理
TypeScript
初识vuex
vue项目安装包指令收集
上一篇文章      下一篇文章      查看所有文章
加:2022-03-03 16:03:16  更:2022-03-03 16:05:09 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 9:07:39-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码