零、前言
由于前段時間一直在找工作,找到工作後又比較忙,又加班又通宵的趕項目,是以部落格有段時間沒有更新了。
今天稍微空閑一點,碰巧前幾天看到有園友問我Nancy中下載下傳檔案的問題,然後就趁着休息的時間寫下了這篇部落格。
直接進正題吧!
一、建立一個空的asp.net應用程式
通過nuget安裝相應的packages
二、添加Modules和Views檔案夾
用于存放我們的“控制器”和視圖(這一步不是必須的喔!)
三、建立CustomRootPathProvider.cs
具體如下:
1 public classCustomRootPathProvider : IRootPathProvider2 {3 public stringGetRootPath()4 {5 return AppDomain.CurrentDomain.GetData(".appPath").ToString();6 }7 }
四、編寫Bootstrapper.cs
具體如下:
1 public classBootstrapper : DefaultNancyBootstrapper2 {3 protected overrideIRootPathProvider RootPathProvider4 {5 get
6 {7 return newCustomRootPathProvider();8 }9 }10 }
五、編寫Module
這裡我是建立了一個HomeModule.cs
需要注意的是,要在構造函數中添加一點東西
IRootPathProvider pathProvider
下面貼上HomeModule.cs的完整代碼
1 usingNancy;2 usingSystem.Collections.Generic;3 usingSystem.IO;4
5 namespaceNancyUpLoadAndDownloadDemo.Modules6 {7 public classHomeModule : NancyModule8 {9 public HomeModule(IRootPathProvider pathProvider) : base("/")10 {11 var uploadDirectory = Path.Combine(pathProvider.GetRootPath(), "Content", "uploads");12
13 Get["/"] = _ =>
14 {15 return View["UpLoad"];16 };17
18 Post["/"] = _ =>
19 {20
21 if (!Directory.Exists(uploadDirectory))22 {23 Directory.CreateDirectory(uploadDirectory);24 }25
26 foreach (var file inRequest.Files)27 {28 var filename =Path.Combine(uploadDirectory, file.Name);29 using (FileStream fileStream = newFileStream(filename, FileMode.Create))30 {31 file.Value.CopyTo(fileStream);32 }33 }34 return Response.AsRedirect("/show") ;35 };36
37 Get["/down/{name}"] = _ =>
38 {39 string fileName =_.name;40 var relatePath = @"Content\uploads\"+fileName;41 returnResponse.AsFile(relatePath);42 };43
44 Get["/show"] = _ =>
45 {46 var folder = newDirectoryInfo(uploadDirectory);47 IList files = new List();48 foreach (var file infolder.GetFiles())49 {50 files.Add(file.Name);51 }52 return View["Show", files];53 };54 }55 }56 }
下面簡單說一下這些是用來幹嘛的:
Get["/"] 顯示upload這個頁面
Post["/"] 上傳檔案的
Get["/down/{name}"] 下載下傳檔案,{name}是參數 檔案名
Get["/show"] 顯示可下載下傳的檔案
上傳檔案和下載下傳檔案的具體細節會在看完示範後細說。
六、建立視圖
Show.cshtml
1 @{2 Layout = null;3 }4
5
6
7
8
9
10
11
12
13
14 @foreach (var item in Model)15 {16
17
18 @item19
20
21 }22
23
24
25
UpLoad.cshtml
1 @{2 Layout = null;3 }4
5
6
7
8
9
10
UpLoad
11
12
13
這是上傳檔案的示範
14
15
16
17
18 請選擇要上傳的檔案
19
20
21
22
23
24
25
26
27
視圖就比較簡單,沒什麼樣式。就是簡單的列出檔案名稱和上傳檔案的表單
下面來看看效果:
就這樣完成了簡單的上傳和下載下傳功能,也是挺簡單的。
七、上傳與下載下傳的細節
上傳:
相信之前大家在asp.net中進行上傳時,下面這個httppostedfilebase類,肯定是經常用的
但是這個是基于system.web的,而Nancy是不依賴于system.web的!!!那麼Nancy是怎麼處理這個的呢
Nancy有自己的一套東西來處理這個,可以看看這個類
也可以看看httppostfilebase這個類
像處理這些問題,Nancy都有自己的實作,用起來跟平常的用法有點差別,這個是需要注意的!!
還有一個要注意的是路徑的問題,這個問題可以參見
下載下傳:
在asp.net mvc中,下載下傳我們用的比較多的是 fileresult
其實,Nancy也提供了類似的方法
用法就是 response.asfile()
可以參見下面的