Nancy之文件上传与下载

时间:2023-03-08 20:47:59

零、前言

由于前段时间一直在找工作,找到工作后又比较忙,又加班又通宵的赶项目,所以博客有段时间没有更新了。

今天稍微空闲一点,碰巧前几天看到有园友问我Nancy中下载文件的问题,然后就趁着休息的时间写下了这篇博客。

直接进正题吧!

一、新建一个空的asp.net应用程序

通过nuget安装相应的packages

二、添加Modules和Views文件夹

用于存放我们的“控制器”和视图(这一步不是必须的喔!)

三、新建CustomRootPathProvider.cs

具体如下:
     public class CustomRootPathProvider : IRootPathProvider
{
public string GetRootPath()
{
return AppDomain.CurrentDomain.GetData(".appPath").ToString();
}
}

四、编写Bootstrapper.cs

具体如下:
     public class Bootstrapper : DefaultNancyBootstrapper
{
protected override IRootPathProvider RootPathProvider
{
get
{
return new CustomRootPathProvider();
}
}
}

五、编写Module

这里我是新建了一个HomeModule.cs
需要注意的是,要在构造函数中添加一点东西
IRootPathProvider pathProvider  
下面贴上HomeModule.cs的完整代码
 using Nancy;
using System.Collections.Generic;
using System.IO; namespace NancyUpLoadAndDownloadDemo.Modules
{
public class HomeModule : NancyModule
{
public HomeModule(IRootPathProvider pathProvider) : base("/")
{
var uploadDirectory = Path.Combine(pathProvider.GetRootPath(), "Content", "uploads"); Get["/"] = _ =>
{
return View["UpLoad"];
}; Post["/"] = _ =>
{ if (!Directory.Exists(uploadDirectory))
{
Directory.CreateDirectory(uploadDirectory);
} foreach (var file in Request.Files)
{
var filename = Path.Combine(uploadDirectory, file.Name);
using (FileStream fileStream = new FileStream(filename, FileMode.Create))
{
file.Value.CopyTo(fileStream);
}
}
return Response.AsRedirect("/show") ;
}; Get["/down/{name}"] = _ =>
{
string fileName = _.name;
var relatePath = @"Content\uploads\"+fileName;
return Response.AsFile(relatePath);
}; Get["/show"] = _ =>
{
var folder = new DirectoryInfo(uploadDirectory);
IList<string> files = new List<string>();
foreach (var file in folder.GetFiles())
{
files.Add(file.Name);
}
return View["Show", files];
};
}
}
}
下面简单说一下这些是用来干嘛的:
Get["/"]   显示upload这个页面
Post["/"]   上传文件的
Get["/down/{name}"]   下载文件,{name}是参数 文件名
Get["/show"]  显示可下载的文件
上传文件和下载文件的具体细节会在看完演示后细说。

六、建立视图

Show.cshtml
 @{
Layout = null;
} <!DOCTYPE html> <html>
<head>
<meta name="viewport" content="width=device-width" />
<title></title>
</head>
<body>
<ul>
@foreach (var item in Model)
{
<li>
<a href="/down/@item">
@item
</a>
</li>
}
</ul>
</body>
</html>
UpLoad.cshtml
 @{
Layout = null;
} <!DOCTYPE html> <html>
<head>
<meta name="viewport" content="width=device-width" />
<title>UpLoad</title>
</head>
<body>
<h1>这是上传文件的演示</h1>
<hr />
<form action="/" method="post" enctype="multipart/form-data"> <div>
<label>请选择要上传的文件</label>
<input type="file" name="myFile" />
</div>
<div>
<input type="submit" value="上传" />
</div> </form>
</body>
</html>
视图就比较简单,没什么样式。就是简单的列出文件名称和上传文件的表单
下面来看看效果:
Nancy之文件上传与下载
Nancy之文件上传与下载
Nancy之文件上传与下载
Nancy之文件上传与下载
Nancy之文件上传与下载
Nancy之文件上传与下载
就这样完成了简单的上传和下载功能,也是挺简单的。

七、上传与下载的细节

上传:
相信之前大家在asp.net中进行上传时,下面这个httppostedfilebase类,肯定是经常用的
但是这个是基于system.web的,而Nancy是不依赖于system.web的!!!那么Nancy是怎么处理这个的呢
Nancy有自己的一套东西来处理这个,可以看看这个类
也可以看看httppostfilebase这个类
像处理这些问题,Nancy都有自己的实现,用起来跟平常的用法有点区别,这个是需要注意的!!
还有一个要注意的是路径的问题,这个问题可以参见
下载:
在asp.net mvc中,下载我们用的比较多的是 fileresult
其实,Nancy也提供了类似的方法
用法就是 response.asfile()
可以参见下面的