آپلود و دانلود کردن فایل PDF در فرمت باینری با استفاده از FileResult

شنبه 27 شهریور 1395

در این مقاله قصد داریم در ASP.NET MVC با استفاده از FileResult یک فایل PDF را با فرمت باینری در بانک اطلاعاتی خود ذخیره کنیم .

آپلود و دانلود کردن فایل PDF در فرمت باینری با استفاده از FileResult

مقدمه

بیشتر مواقع ، ما نیاز به کار کردن با فایل ها و ذخیره سازی آنها داریم  که این عمل میتواند برای ما مشکل ایجاد کند ، چرا که تمام این فایل ها بر روی سرور قرار گرفته و حافظه سرور را اشغال می کنند. بنابراین برای رفع این مشکل ، میخواهیم با استفاده از FileResult ، نحوه آپلود فایل با فرمت باینری در بانک اطالاعاتی را به شما آموزش دهیم . مراحل زیر را دنبال کنید :

مرحله اول – ایجاد پروژ ASP.NET MVC  

ویژوال استودیو خود را اجرا کرده و یک پروژه از نوع ASP.NET MVC ایجاد می کنیم .

 Empty   را انتخاب کرده و گزینه MVC   را انتخاب می کنیم .

مرحله دوم – ایجاد مدل

در این قسمت میخواهیم یک مدل ایجاد کنیم ، برای این کار بر روی پوشه Models کلیک راست کرده و یک کلاس به نام EmpModel.cs   ایجاد کنید .

کد زیر مدل های پروژه را در بر دارد ، یکی از آنها EmpMolde  و دیگری FileDetails   نام دارد .

 public class EmpModel
    {
        [Required]
        [DataType(DataType.Upload)]
        [Display(Name ="انتخاب فایل")]
        public HttpPostedFileBase files { get; set; }
    }

    public class FileDetailsModel
    {
        public int Id { get; set; }
        [Display(Name = "فایل های آپلو شده")]
        public String FileName { get; set; }
        public byte[] FileContent { get; set; }


    }

مرحله سوم – ایجاد جدول و Stored Procedure

برای ذ خیره فایل ها به صورت باینری و نمایش آنها به جدول و Store Procedure  نیاز داریم ، با استفاده از قطعه کد زیر آنها را ایجاد کنید .

کد ایجاد جدول:

CREATE TABLE [dbo].[FileDetails](  
•      [Id] [int] IDENTITY(1,1) NOT NULL,  
•      [FileName] [varchar](60) NULL,  
•      [FileContent] [varbinary](max) NULL  
•  ) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY] 

کد بالایی یک ستون به عنوان Id قرار می دهد و دو فیلد به نام FileName و FileContent ایجاد می دهد که FileContent فایل باینری شده را در خود قرار می دهد .

ساخت Stored Procedure  برای افزودن فایل به FileDetails   با استفاده از قطعه کد زیر :

Create Procedure [dbo].[AddFileDetails]  
•  (  
•  @FileName varchar(60),  
•  @FileContent varBinary(Max)  
•  )  
•  as  
•  begin  
•  Set NoCount on  
•  Insert into FileDetails values(@FileName,@FileContent)  
•    
•  End 

مرحله چهارم – افزودن Controller

برای افزودن کنترلر بر روی پوشه Controllers کلیک راست کرده و مانند تصویر زیر یک کنترلر خالی ایجاد کنید .

قطعه کد هایی که در بالا وارد کردیم برای دانلود و آپلود PDF از بانک اطاعاتی می باشند.

using FileUploadDownLoadInMVC.Models;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using Dapper;
using System.Configuration;
using System.Data.SqlClient;
using System.Data;

namespace FileUploadDownLoadInMVC.Controllers
{
    public class HomeController : Controller
    {
        
        #region Upload Download file
        public ActionResult FileUpload()
        {
            return View();
        }

       
        [HttpPost]
        public ActionResult FileUpload(HttpPostedFileBase files)
        {

         String FileExt=Path.GetExtension(files.FileName).ToUpper();

            if (FileExt == ".PDF")
            {
                Stream str = files.InputStream;
                BinaryReader Br = new BinaryReader(str);
                Byte[] FileDet = Br.ReadBytes((Int32)str.Length);

                FileDetailsModel Fd = new Models.FileDetailsModel();
                Fd.FileName = files.FileName;
                Fd.FileContent = FileDet;
                SaveFileDetails(Fd);
                return RedirectToAction("FileUpload");
            }
            else
            {

                ViewBag.FileStatus = "فرمت فایل معتبر نمی باشد.";
                return View();

            }
           
        }
       
        [HttpGet]
        public FileResult DownLoadFile(int id)
        {


            List<FileDetailsModel> ObjFiles = GetFileList();

            var FileById = (from FC in ObjFiles
                            where FC.Id.Equals(id)
                            select new { FC.FileName, FC.FileContent }).ToList().FirstOrDefault();

            return File(FileById.FileContent, "application/pdf", FileById.FileName);

        }
        #endregion

        #region View Uploaded files
        [HttpGet]
        public PartialViewResult FileDetails()
        {
            List<FileDetailsModel> DetList = GetFileList();

            return PartialView("FileDetails", DetList);


        }
        private List<FileDetailsModel> GetFileList()
        {
            List<FileDetailsModel> DetList = new List<FileDetailsModel>();

            DbConnection();
            con.Open();
            DetList = SqlMapper.Query<FileDetailsModel>(con, "GetFileDetails", commandType: CommandType.StoredProcedure).ToList();
            con.Close();
            return DetList;
        }

        #endregion

        #region Database related operations
        private void SaveFileDetails(FileDetailsModel objDet)
        {

            DynamicParameters Parm = new DynamicParameters();
            Parm.Add("@FileName", objDet.FileName);
            Parm.Add("@FileContent", objDet.FileContent);
            DbConnection();
            con.Open();
            con.Execute("AddFileDetails", Parm, commandType: System.Data.CommandType.StoredProcedure);
            con.Close();


        }
        #endregion

        #region Database connection

        private SqlConnection con;
        private string constr;
        private void DbConnection()
        {
             constr =ConfigurationManager.ConnectionStrings["dbcon"].ToString();
             con = new SqlConnection(constr);

        }
        #endregion
    }
}

مرحله پنجم – ایجاد strongly typed View

برای آپلود و دانلود ، به دو View    نیاز داریم که یکی از آنها Partial View  است ،  کد های زیر شامل View ها هستند .

FileUpload.cshtml 

@model FileUploadDownLoadInMVC.Models.EmpModel

@{
    ViewBag.Title = "www.barnamebevisan.com";
}

@using (Html.BeginForm("FileUpload", "Home", FormMethod.Post, new { enctype = "multipart/form-data" }))
{

    @Html.AntiForgeryToken()

    <div class="form-horizontal">
        <hr />
        @Html.ValidationSummary(true, "", new { @class = "text-danger" })
        <div class="form-group">
            @Html.LabelFor(model => model.files, htmlAttributes: new { @class = "control-label col-md-2" })
            <div class="col-md-10">
                @Html.TextBoxFor(model => model.files, "", new { @type = "file", @multiple = "multiple" })
                @Html.ValidationMessageFor(model => model.files, "", new { @class = "text-danger" })
            </div>
        </div>
        <div class="form-group">
            <div class="col-md-offset-2 col-md-10">
                <input type="submit" value="آپلود" class="btn btn-primary" />
            </div>
        </div>
        <div class="form-group">
            <div class="col-md-offset-2 col-md-10 text-success">
                @ViewBag.FileStatus
            </div>
        </div>

        <div class="form-group">
            <div class="col-md-8">
                @Html.Action("FileDetails", "Home")

            </div>
        </div>
    </div>
}

<script src="~/Scripts/jquery-1.10.2.min.js"></script>
<script src="~/Scripts/jquery.validate.min.js"></script>
<script src="~/Scripts/jquery.validate.unobtrusive.min.js"></script>

FileDetails.cshtml

@model IEnumerable<FileUploadDownLoadInMVC.Models.FileDetailsModel>


<table class="table table-bordered">
    <tr>
        <th class="col-md-4">
            @Html.DisplayNameFor(model => model.FileName)
        </th>
        
        <th class="col-md-2"></th>
    </tr>

@foreach (var item in Model) {
    <tr>
        <td>
            @Html.DisplayFor(modelItem => item.FileName)
        </td>
        
        <td>
            @Html.ActionLink("Downlaod", "DownLoadFile", new { id=item.Id }) 
           
        </td>
    </tr>
}

</table>

مرحله ششم – اجرای برنامه

بعد از اجرای برنامه تصویر زیر را مشاهده می کنید .

حال یک فایل PDF انتخاب کرده و بر روی آپلود کلیک می کنیم ، همان طور که مشاهده می کنید در قسمت پایینی فایل های آپلود شده نمایش داده شده اند و یک لینک برای دانلود آنها وجود دارد .

اگر به بانک اطلاعاتی خود مراجعه کنید مشاهده می کنید که عکس با فرمت باینری در بانک اطلاعاتی ذخیره شده است .

بعد از این که بر روی لینک دانلود هر یک از فایل های آپلود شده کلیک کنید  به صورت خودکار دانلود می شوند .

میتوان فایل دانلود شده را باز کرده و محتوای آن را مشاهده کنید .

آموزش asp.net mvc

فایل های ضمیمه

برنامه نویسان

نویسنده 3355 مقاله در برنامه نویسان

کاربرانی که از نویسنده این مقاله تشکر کرده اند

در صورتی که در رابطه با این مقاله سوالی دارید، در تاپیک های انجمن مطرح کنید