アップロードしてPDFファイルをダウンロードする


私のプロジェクトアプリケーションのほとんどはビジネス関連であり、私はまだそのようなアプリケーションを作成する予定です.
以下は、ASPを使用して、単純なサンプルアプリケーションです.請求書管理システムのPDFファイルをアップロード/ダウンロードしてください.
アプリケーションのGithubレポはこちらです.https://github.com/zoltanhalasz/UploadFile
また、アプリケーションをテストすることができますオンラインです.https://uploadfile.zoltanhalasz.net/
必要条件:
  • ASPの初心者/中間のかみそりページ.NETコア、ここの研究材料を見てくださいhttps://mydev-journey.blogspot.com/2019/11/razor-pages-not-for-shaving.html
  • 中間のC
  • いくつかの基本エンティティフレームワークコア.
  • 私の学問の源泉は
  • アップロードのためのMVCバージョンhttps://tutexchange.com/how-to-upload-files-and-save-in-database-in-asp-net-core-mvc/
  • ダウンロードは、様々なCを使用して発見された.
    まず、uploadfileという名前のデータベースを作成し、次にテーブルを作成します.
  • CREATE TABLE [dbo].[Invoices](
        [Id] [int] IDENTITY(1,1) NOT NULL,
        [Number] [int] NOT NULL,
        [Date] [datetime] NOT NULL,
        [Value] [decimal](18, 2) NOT NULL,
        [Attachment] [varbinary](max) NULL,
     CONSTRAINT [PK_Invoices] PRIMARY KEY CLUSTERED ([Id] ASC) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
    GO
    
    アプリケーションの作成手順
    ASPを作成します.プロジェクトページ
    . NETコアバージョン3.1
    データベースを使用してデータベースに足場を作ります
    https://marketplace.visualstudio.com/items?itemName=ErikEJ.EFCorePowerTools または単に必要なデータ構造を追加している私のデータフォルダをコピー
    代わりに、より伝統的なcaffoldingメソッドを使用できます.https://www.entityframeworktutorial.net/efcore/create-model-for-existing-database-in-ef-core.aspx
    モデルとDBContext(UploadFileContextという)がデータフォルダーに格納されていることを確認します.
    起動に追加します.このメソッドは、
     services.AddDbContext<UploadfileContext>(options =>
                      options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection"),           
                        sqlServerOptions => sqlServerOptions.CommandTimeout(100))
                        );
    
    インボイスのリストを表示するインデックスページを作成する
  • ページCSHTMLファイルには、ダウンロード、アップロード、削除機能と共にインボイスのリストが含まれます
  • https://github.com/zoltanhalasz/UploadFile/blob/master/UploadFile/Pages/Index.cshtml
  • PageModelクラスには以下のメソッドが含まれます:
  • A . PDFファイルをデータベースからダウンロードします
    public async Task<IActionResult> OnPostDownloadAsync(int? id)
    {
                var myInv = await _context.Invoices.FirstOrDefaultAsync(m => m.Id == id);
                if (myInv == null)
                {
                    return NotFound();
                }
    
                if (myInv.Attachment== null)
                {
                    return Page();
                }
                else
                {
                    byte[] byteArr = myInv.Attachment;
                    string mimeType = "application/pdf";
                    return new FileContentResult(byteArr, mimeType)
                    {
                        FileDownloadName = $"Invoice {myInv.Number}.pdf"
                    };
                }
    }
    
    データベースからの添付ファイルの削除
    public async Task<IActionResult> OnPostDeleteAsync(int? id)
    {
                var myInv = await _context.Invoices.FirstOrDefaultAsync(m => m.Id == id);
                if (myInv == null)
                {
                    return NotFound();
                }
    
                if (myInv.Attachment == null)
                {
                    return Page();
                }
                else
                {
                    myInv.Attachment = null;
                    _context.Update(myInv);
                    await _context.SaveChangesAsync();
                }
    
                Invoices = await _context.Invoices.ToListAsync();
                return Page();
    }
    
    請求書データを作成するページを追加します(かみそりページ足場を介して行うことができます)
    参照https://github.com/zoltanhalasz/UploadFile/blob/master/UploadFile/Pages/Create.cshtml
    and
    https://github.com/zoltanhalasz/UploadFile/blob/master/UploadFile/Pages/Create.cshtml.cs
    PDFファイルアップロードに役立つアップロードページを作成します
    これには、フォームのHTMLタグを含むマークアップ、cshtmlファイルがあります.
    page
    @model UploadFile.Pages.UploadModel
    @{
    }
    
    <h1>Upload Invoice</h1>
    
    
    <hr />
    <div class="row">
        <div class="col-md-4">
            <form method="post" enctype="multipart/form-data">
                <div class="form-group">
                    <div class="col-md-10">
                        <p>Upload file</p>
                        <input type="hidden" asp-for="@Model.ID" value="@Model.myID" />
                        <input asp-for="file" class="form-control" accept=".pdf" type="file" />
                    </div>
                </div>
                <div class="form-group">
                    <div class="col-md-10">
                        <input class="btn btn-success" type="submit" value="Upload" />
                    </div>
                </div>
            </form>
        </div>
    </div>
    
    <div>
        <a asp-page="Index">Back to List</a>
    </div>
    
    PageModelクラスでは、アップロードされたファイルを処理するハンドラがあります.
    public class UploadModel : PageModel
    {                  
    
            private readonly UploadfileContext _context;
    
            public UploadModel(UploadfileContext context)
            {
    
                _context = context;
            }
            public int ? myID { get; set; }
    
            [BindProperty]
            public IFormFile file { get; set; }
    
            [BindProperty]
            public int ? ID { get; set; }
            public void OnGet(int? id)
            {
                myID = id;
            }
    
            public async Task<IActionResult> OnPostAsync()
            {
                if (file != null)
                {
                    if (file.Length > 0 && file.Length < 300000)
                    {
                        var myInv = _context.Invoices.FirstOrDefault(x => x.Id == ID);
    
                        using (var target = new MemoryStream())
                        {
                            file.CopyTo(target);
                            myInv.Attachment = target.ToArray();
                        }
    
                        _context.Invoices.Update(myInv);
                        await _context.SaveChangesAsync();
                    }
    
                }
    
                return RedirectToPage("./Index");
            }
    
    }
    
    結果は次のようになります.