最近闲余时间在做一个仿百度网盘的项目,其中就有一个上传文件夹的功能。查了下网上好像对这个问题的描述比较少,所以在此记录一下。

1、网上找来找去发现webkitdirectory这个东西,H5的一个新的属性吧,就是在文件控件上标记这个属性可以获取到选择文件夹里的所有文件的。

<input type="file" name="file" webkitdirectory>

特地看了下百度网盘网页版也是使用的这个属性,但是网上都说该属性只有chrome浏览器支持。然后我就不信,用360浏览器试了试还是可以用。结果发现360有两种模式(极速模式和兼容模式),极速模式是以Blink(Webkit)为内核的浏览模式,而chrome好像也是使用的这个内核。所以说我刚刚试的也可以用,但是切换到兼容模式则不能用了(IE内核)。

2、言归正传,直接贴代码吧。

<input type="file" name="file" webkitdirectory>
<button id="upload" type="button" onclick="Upload()" >上传</button>
var files = [];
$(document).ready(function () {
$('input').change(function () {
files = this.files;
})
}); function Upload() {
var data = new FormData();
debugger
for (var i = 0; i < files.length; i++) {
data.append('file', files[i]);
}
var path = files[0].webkitRelativePath;
$.ajax({
type: "post",
url: "/home/UpLoad",
data: data,
contentType: false,
processData: false,
success: function (data) {
console.log(data);
}
})
}

最后是控制器

[HttpPost]
public IActionResult UpLoad()
{
var files = Request.Form.Files;
string rootpath = _hostingEnvironment.WebRootPath + @"\Files"; try
{
foreach (var file in files)
{
string[] arrpath = file.FileName.Split(@"/");
string dirpath = "";//该文件的所在目录(包括一、二级目录)
string filename = arrpath[arrpath.Length - ].ToString();//该文件名
for (int i=;i<arrpath.Length;i++)
{
if(i==arrpath.Length-)
{
break;
}
dirpath += arrpath[i]+@"/";
}
DicCreate(Path.Combine(rootpath, dirpath));//不存在则创建该目录 string filepath = Path.Combine(rootpath, file.FileName);
using (var addFile = new FileStream(filepath, FileMode.OpenOrCreate))
{
if (file != null)
{
file.CopyTo(addFile);
}
else
{
Request.Body.CopyTo(addFile);
}
addFile.Close();
}
} return Ok(new
{
success = true,
message = "上传成功"
});
}
catch(Exception ex)
{
return Ok(new
{
success = false,
message = ex.Message
});
}
} /// <summary>
/// 文件目录如果不存在,就创建一个新的目录
/// </summary>
/// <param name="path"></param>
private void DicCreate(string path)
{
if (!Directory.Exists(path))
{
Directory.CreateDirectory(path);
}
}

3、说明下,后端接收到的files是选择文件夹里所有文件的集合。

比如我这里测试使用的是选中一个名为新建文件夹的文件夹,然后该文件夹里有两张图片和一个子文件夹,子文件夹里也是一张图片。

所有我获取到的files是count为3的集合,文件名分别为 新建文件夹/1.jpg、新建文件夹/2.jpg、新建文件夹/新建文件夹/8.jpg(这个是在二级文件夹里的)。

大概的思路就是:获取到文件集合后遍历,然后取得该文件所在的文件夹,如果服务器上不存在该文件夹则创建,最后上传文件。

当然我代码只是写了最基本的实现,具体还有些验证或者业务逻辑还得具体分析。

然后其他就不多说了吧,不太明白的调试下代码差不多就懂了,如有错误,望指出。

ASP.NET CORE之上传文件夹的更多相关文章

  1. asp.net FileUpload上传文件夹并检测所有子文件

    1.在FileUpload控件添加一个属性 webkitdirectory=""就可以上传文件夹了 <asp:FileUpload ID="FileUpload1& ...

  2. asp.net 怎么上传文件夹啊,不传压缩包!

    ASP.NET上传文件用FileUpLoad就可以,但是对文件夹的操作却不能用FileUpLoad来实现. 下面这个示例便是使用ASP.NET来实现上传文件夹并对文件夹进行压缩以及解压. ASP.NE ...

  3. ASP.NET Core 上传文件到共享文件夹

    参考资料:ASP.NET 上传文件到共享文件夹 创建共享文件夹参考资料:https://www.cnblogs.com/dansediao/p/5712657.html 一.配置上传文件相关参数并读取 ...

  4. asp.net能否上传文件夹下所有文件

    HTML部分 <%@PageLanguage="C#"AutoEventWireup="true"CodeBehind="index.aspx. ...

  5. asp.net 怎么上传文件夹啊,不传压缩包

    最近遇见一个需要上传百兆大文件的需求,调研了七牛和腾讯云的切片分段上传功能,因此在此整理前端大文件上传相关功能的实现. 在某些业务中,大文件上传是一个比较重要的交互场景,如上传入库比较大的Excel表 ...

  6. ASP.NET Core 中的文件上传

    ASP.NET Core上传文件 ASP.NET Core使用IFormFile来读取上传的文件内容,然后将数据写入到磁盘或其它存储空间. 添加FileUpload模型,用来接收上传的文件内容. pu ...

  7. asp.net core配置下载文件

    asp.net core的wwwroot文件夹下默认时保存静态文件的地方,外面可以直接访问,但是如果是一些无法识别的后缀文件,如(.apk),会报错404 如果想要实现下载这些文件,在配置静态文件中间 ...

  8. asp.net上传文件夹权限配置以及权限配置的分析

    切记:一定要禁止给公共上传文件夹的权限设置为everyone,且为完全控制!除非你这个文件夹属于内部操作的,那这样做是允许,其余情况一律禁止! 基本的文件上传文件夹权限配置: 1.在需要配置上传的文件 ...

  9. MVC文件上传05-使用客户端jQuery-File-Upload插件和服务端Backload组件自定义上传文件夹

    在零配置情况下,文件的上传文件夹是根目录下的Files文件夹,如何自定义文件的上传文件夹呢? MVC文件上传相关兄弟篇: MVC文件上传01-使用jquery异步上传并客户端验证类型和大小  MVC文 ...

随机推荐

  1. Eclipse编辑XML自动提示(zz)

    Eclipse编辑XML自动提示 博客分类: j2se XMLEclipseiBATISSpringSQL  IED Eclipse Java EE IDE for Web Developers: D ...

  2. Rest架构风格的实践(使用通用Mapper技术)

    1.根据用户 id 查询用户数据 1.1 controll控制器 @RequestMapping("restful/user") @Controller public class ...

  3. centos 7 搭建pip源

    一.安装pip2pi工具: pip install pip2pi 或编译: git clone https://github.com/wolever/pip2pi cd pip2pi python s ...

  4. Mathematics | Mean, Variance and Standard Deviation

    Mean is average of a given set of data. Let us consider below example These eight data points have t ...

  5. Win7 VS2013环境编译boost1_58_0

    备忘,发现好多不常用的东西不记笔记再想用要重新花时间找,所以试着开始记笔记,写入博客吧. 首先去官网下最新的版本 http://www.boost.org/ 写本文时boost最新版本为1_58_0, ...

  6. 利用url传多个参数

    刚开始接触jsp,比较偏向于用button标签的onclick方法进行页面的跳转.但是关于页面跳转的各种问题真是叫人头大,以下记录,仅仅为自己以后查看. Qone 用url传参的时候遇到中文怎么办 编 ...

  7. 第04章:MongoDB基本概念

    ① 数据库 MongoDB的一个实例可以拥有一个或多个相互独立的数据库,每个数据库都有自己的集合   集合 集合可以看作是拥有动态模式的表   文档 文档是MongoDB中基本的数据单元,类似于RDB ...

  8. HDU 5656 CA Loves GCD (容斥)

    题意:给定一个数组,每次他会从中选出若干个(至少一个数),求出所有数的GCD然后放回去,为了使自己不会无聊,会把每种不同的选法都选一遍,想知道他得到的所有GCD的和是多少. 析:枚举gcd,然后求每个 ...

  9. 关于CSS的优先级,CSS优先级计算,多个class引用

    原则一: 继承不如指定 原则二: #id > .class > 标签选择符 原则三:越具体越强大 原则四:标签#id >#id ; 标签.class > .class CSS优 ...

  10. django调用py报错 django.core.exceptions.ImproperlyConfigured: Requested setting DEFAULT_INDEX_TABLESPACE, but settings are not configured.

    完整报错信息如下 django.core.exceptions.ImproperlyConfigured: Requested setting DEFAULT_INDEX_TABLESPACE, bu ...