NoSql-MongoDB GridFS+ASP.NET MVC實現上傳,顯示,
之前一篇文章介紹了如何在dos視窗下對MongoDB進行一些簡單的操作,但是不管學習什麼,最終還是要應用於自己的項目當中,本篇主要介紹在MVC架構中如何應用於我們的MongoDB。
GridFS介紹:
GridFS是MongoDb中的一個內建功能,可以用於存放大量小檔案。我們可以使用MongoVUE來輔助管理。
使用前提-MongoDB驅動安裝:
對於MongoDB驅動,目前主要有兩種-官方驅動,samus驅動,我們再此使用官方驅動進行操作,:https://github.com/mongodb/mongo-csharp-driver/downloads
下載完成之後,進行解壓縮包得到兩個檔案:
- MongoDB.Bson.dll 序列化,Json相關
- MongoDb.Driver.dll 驅動
將其加入到項目之中,添加引用,下邊我們來看Demo實現:實現的效果就是一個簡單的上傳頁面和上傳view圖片的介面。
利用GridFS上傳圖片:MongoDBHelper(Controller):串連資料庫,上傳方法
namespace MongoDBTest.Controllers{ public class MongoDBHelperController : Controller { private static MongoDatabase DB; public static string fileTable = "files"; /// <summary> /// 串連資料庫設定 /// </summary> public void init() { //使用AppSettings方式和設定檔串連,靈活控制MongoDb資料庫位置 string ConnectionString = ConfigurationManager.AppSettings["mondoDbConnection"]; //串連本地的資料庫 //string ConnectionString = "127.0.0.1"; //串連不成功,提示 if (String.IsNullOrEmpty(ConnectionString)) { throw new ArgumentNullException("Connection string not found"); } //建立串連池 MongoServerSettings mongoSetting = new MongoServerSettings(); mongoSetting.MaxConnectionPoolSize = 15000;//設定最大串連池 mongoSetting.WaitQueueSize = 500;//設定等待隊列數 mongoSetting.Server = new MongoServerAddress(ConnectionString, 27017); int count = MongoServer.MaxServerCount; MongoServer server = MongoServer.Create(mongoSetting);//建立串連資料檔案 DB = server.GetDatabase("DB3");//建立資料庫連接,串連的字串名稱 } public void ProcessRequest() { init(); //從MVC傳值,擷取 string action = Request.QueryString["actions"]; //通過action值來判斷是上傳,還是擷取,還是下載等 switch (action) { case "DOWNLOAD": DownFile(); break; //下載檔案 case "UPLOAD": Upload(); break; //上傳檔案 } } //上傳檔案 public void Upload() { try { HttpPostedFileBase file = (HttpPostedFileBase)Request.Files["file"]; //擷取上傳檔案的長度 int nFileLen = file.ContentLength; //擷取上傳檔案的值 string nFileName = file.FileName; //利用GridFS 建立 MongoGridFSSettings fsSetting = new MongoGridFSSettings() { Root = fileTable }; MongoGridFS fs = new MongoGridFS(DB, fsSetting); byte[] myData = new Byte[nFileLen]; file.InputStream.Read(myData, 0, nFileLen); //調用Write、WriteByte、WriteLine函數時需要手動設定上傳時間 //通過Metadata 添加附加資訊 MongoGridFSCreateOptions option = new MongoGridFSCreateOptions(); option.UploadDate = DateTime.Now; //建立檔案,檔案並儲存資料 using (MongoGridFSStream gfs = fs.Create(file.FileName, option)) { gfs.Write(myData, 0, nFileLen); gfs.Close(); Response.Write("恭喜您" + nFileName + "檔案上傳成功!"); } } catch (Exception e) { Response.Write("Sorry your file is not upload successfully!" + e.Message); } Response.End(); }
/// <summary> /// 下載檔案方法 /// </summary> public void DownFile() { //擷取檔案值 string filename = Request.QueryString["value"]; //擷取檔案類型 Response.ContentType = "application/octet-stream"; //實現下載+檔案名稱 Response.AddHeader("Content-Disposition", "attachment; filename=" + filename); //擷取圖片名 MongoGridFSSettings fsSetting = new MongoGridFSSettings() { Root = fileTable }; //通過檔案名稱去資料庫查值 MongoGridFS fs = new MongoGridFS(DB, fsSetting); MongoGridFSFileInfo gfInfo = new MongoGridFSFileInfo(fs, filename); //方法一,很簡潔 fs.Download(Response.OutputStream, filename); Response.End(); } }}
MongoDbTest(View):上傳介面顯示
<html><body> <div> @*找到ProcessRequest,通過擷取Action值來執行操作*@ @using (Html.BeginForm("ProcessRequest", "MongoDBHelper", new { actions = "UPLOAD" }, FormMethod.Post, new { enctype = "multipart/form-data" })) { <input type="file" name="file" id="file" style="font-size:20px;" /> <br/> <br/> <input type="submit" value="上傳" style="font-size:20px" /> } </div></body></html>
介面顯示+上傳成功顯示:
從MongoDb讀取圖片,音頻,顯示到View視圖:MongoDBTest(Controller):賦值,尋找條件
/// <summary> /// 通過學號拼接圖片名稱顯示到介面-霍亞靜-2015年9月12日02:37:39 /// </summary> /// <returns></returns> public ActionResult ImgTest() { //初始化 string strPhotoUser = ""; //設定假資料,拼接圖片名稱 strPhotoUser += 130131199203216646 + ".jpg"; string strVoice = ""; strVoice += 123 + ".mp3"; //給ViewData賦值,給MongoDBHelper 下的ProcessRequest方法賦值 ViewData["img"] = "/MongoDBHelper/ProcessRequest?actions=DOWNLOAD&value=" + strPhotoUser; //給ViewDate賦值,給MongoDBHelper 下的ProcessRequest方法賦值 ViewData["voice"] = "/MongoDBHelper/ProcessRequest?actions=DOWNLOAD&value=" + strVoice; return View(); }
註:再此,只是賦了一個假資料,思想都一樣,通過拼接的方式得到圖片或者音頻等的名稱,去MongoDb尋找,顯示。ImgTest(View):
<html><body> <div> @*利用img屬性擷取ViewData值*@ <img src="@ViewData["img"]" style="width:auto;height:auto;" /> </div> <div> @*<p><a href="../../123.mp3">點擊</a></p>*@ @*出現介面,自動播放 loop屬性是迴圈播放的,所以在此省略*@ @*利用audio,HTML外掛程式擷取ViewData音頻*@ <audio src="@ViewData["voice"]" preload="auto" controls autoplay > <div class="audioplayer audioplayer-playing"></div> </audio> </div></body></html>
我們賦值兩個ViewData,圖片+音頻,最終顯示到視圖的效果:
這樣就達到我們想要的效果了。對於MongoDB,我們可以採用MongoVUE軟體來輔助管理,看看我們上傳的圖片和音頻:
善於用工具來輔助管理自己的學習,提高效率。
著作權聲明:本文為博主原創文章,未經博主允許不得轉載。