[予約] ASP.NETコアファイルのアップロードとダウンロードが(さまざまな方法をアップロードします)

ASP.NETコアファイルのアップロードとダウンロード(さまざまな方法をアップロードします)

 
序文

いくつかの時間前にオンラインプロジェクト、忙しすぎて、最近の調査研究は最終的にASP.NETコアを開始することができます。

シリーズを書くつもりが、私はそれの後ろに仕上げ、先着順、今日、ディレクトリを考え出したていません。

現在のASP.NETコア2.0は、非常に成熟してきました。それを使用するための次のプロジェクト。

 

テキスト

1.アップロードファイル(公式例)結合モデルを使用して

機械翻訳の公式アドレスします。https://docs.microsoft.com/en-us/aspnet/core/mvc/models/file-uploads

ここではTucaoについて - - それTMの機械翻訳..ないEのテキストを見て、自分のように..

まず、次のようにフォームのフォームを作成する必要があります。

コードをコピー
    <フォームメソッド= "ポスト" のenctype = "マルチパート/フォームデータ" ASP-コントローラ= "UpLoadFile" ASP-ACTION = "のFileSave">
        <div>
            <div>
                <P>フォームフォームの複数のアップロードファイル:</ P>
                <input type = "ファイル" 名= "ファイル" 複数の/>
                <input type = "提出" 値= "上传" />
            </ div>
        </ div>
    </フォーム>
コードをコピー

これは、ASP-コントローラおよびASP-アクションは、(これが話した後、TagHelperプレイで)コントローラと、我々がアクセスしたい方法です。

私たちのinputタグに加えて、複数の特性を与える、複数のファイルのアップロードをサポートすること。

コントローラを作成し、我々は次のようにアップロード方法は書き込み:

コードをコピー
 タスク非同期公共<IActionResult>のFileSave(一覧<IFormFile>ファイル)
        {
            VARファイル= Request.Form.Files。
            長いサイズ(=> f.Length F)= files.Sum。
            文字列webRootPath = _hostingEnvironment.WebRootPath。
            文字列contentRootPath = _hostingEnvironment.ContentRootPath。
            foreachの(ファイル内のvar FORMFILE)
            {
                (formFile.Length> 0)であれば
                {

                    文字列fileExt = GetFileExt(formFile.FileName); //ファイルの拡張子は自由です ""。
                    長いFILESIZE = formFile.Length; //バイト単位でファイルサイズを取得します
                    。 "" 文字列newFileName = System.Guid.NewGuid()のToString()+ + fileExt; //ランダムに生成し、新しいファイル名
                    VARファイルパス= webRootPath + "/アップロード/" + newFileName。
                    使用して(VARストリーム=新しいFileStreamを(filePathに、FileMode.Create))
                    {
                        
                        formFile.CopyToAsync(ストリーム)を待ちます。
                    }
                }
            }

            OK(新しい{カウント= files.Count、サイズ})を返します。
        }
コードをコピー

ここでは、次のようにIFormFileが定義されている、新しいインターフェースAsp.NETコアIFormFileを使用します。

コードをコピー
パブリックインターフェイスIFormFile
{
    文字列のContentTypeを{取得します。}
    文字列ContentDisposition {取得します。}
    IHeaderDictionaryヘッダ{取得します。}
    長い長さ{取得します。}
    文字列の名前{取得します。}
    文字列filename {取得します。}
    ストリームOpenReadStream()。
    空のCopyTo(ストリーム対象)。
    タスクCopyToAsync(ストリームターゲット、CancellationToken cancellationToken = NULL);
}
コードをコピー

上記のコードは、プロジェクトのルートディレクトリのアドレスを取得するためにIHostingEnvironmentを使用しています。

コンストラクタインジェクションのコードは次のとおりです。

コードをコピー
        プライベート読み取り専用IHostingEnvironment _hostingEnvironment。

        公共UpLoadFileController(IHostingEnvironment hostingEnvironment)
        {
            _hostingEnvironment = hostingEnvironment。
        }
コードをコピー

次のような効果がある..このように、我々は、コントローラの準備を完了した後、ファイルをアップロードし、前に実行します。

CopyToAsync方法のIFormFileことで、私たちは、このファイルを入れて、ローカルコピーをすることができ流下するためにそれを保存することができます。

 

2. Ajaxのアップロードファイル

我々はアップロードフォームが、プロジェクトのコースを使用している上に、ほとんどの場合は、アップロードするためにAjaxを使用しますので、我々はアップロードするアヤックスを使用する方法についての何かを言うことができます。

最初の書き込みHTMLコードは次のとおりです。

コードをコピー
<div>
    <フォームID = "uploadForm">
        AJAXは、複数のファイルをアップロードします。<入力タイプ=「ファイル」名=「ファイル」複数の/>
        <input type = "ボタン" 値= "上传" のonclick = "doUpload()" />
    </フォーム>
</ div>
コードをコピー

JSコードを書く(ここでは、我々はアップロードするいるFormDataオブジェクトを使用)、次のとおりです。

コードをコピー
 機能doUpload(){
        VAR FORMDATA =新しいいるFormData($( "#のuploadForm")[0]);
        $アヤックス({
            URL: '@のUrl.Action( "のFileSave")'、
            タイプ: 'POST'、
            データ:FORMDATA、
            非同期:偽、
            キャッシュ:偽、
            contentType:偽、
            PROCESSDATA:偽、
            成功:機能(returndata){
                警告(returndata)。
            }、
            エラー:関数(returndata){
                警告(returndata)。
            }
        });
        }
コードをコピー

変更を加えることなく、背景のコード。私たちは、直接検索します<IFormFile>ファイルが一覧ファイルを取得することはできません。

試運転することにより、我々はなく、上の、ファイルが正常にアップロードされていることがわかりますRequest.Form.Filesそれら。

次のように背景ので、コードを変更しました:

コードをコピー
タスク非同期公共<IActionResult>のFileSave()
{
            VAR日=リクエスト。
            VARファイル= Request.Form.Files。
            長いサイズ(=> f.Length F)= files.Sum。
            文字列webRootPath = _hostingEnvironment.WebRootPath。
            文字列contentRootPath = _hostingEnvironment.ContentRootPath。
            foreachの(ファイル内のvar FORMFILE)
            {
                (formFile.Length> 0)であれば
                {

                    文字列fileExt = GetFileExt(formFile.FileName); //ファイルの拡張子は自由です ""。
                    長いFILESIZE = formFile.Length; //バイト単位でファイルサイズを取得します
                    。 "" 文字列newFileName = System.Guid.NewGuid()のToString()+ + fileExt; //ランダムに生成し、新しいファイル名
                    VARファイルパス= webRootPath + "/アップロード/" + newFileName。
                    使用して(VARストリーム=新しいFileStreamを(filePathに、FileMode.Create))
                    {
                        
                        formFile.CopyToAsync(ストリーム)を待ちます。
                    }
                }
            }

            OK(新しい{カウント= files.Count、サイズ})を返します。
 }
コードをコピー

直接には、Request.Form.Filesファイルのコレクションを取得します。〜

 

3. webUploaderアップロードファイル

.. ..ええと、ずっと前に、私はJS webUploaderのパッケージを持っていた、次のとおりです。

BaiduのWebUploaderは、二次包装アップロードコントロールを開いて、コードのフロントエンドを合理化(2つのコードがアップロードされます)

百度WebUploader二次パッケージは、フロントエンドコードプレビュー画像のアップロードの合理化(2つのコードをアップロードします)

...我々はまた、から直接の背後にあるコードを変更、またはする必要があり、以下のカプセル化された.HTMLやJS JSコードを使用しようとしませRequest.Form.Filesに取得します:

<DIV ID = "upfliediv"> </ div>
コードをコピー
$(関数(){


        //ファイルのアップロードをインスタンス化

        $( "#のupfliediv")。powerWebUpload({
                オート:真、fileNumLimit:1
            });
        。$( "#のupfliediv")CleanUpload();

    })
コードをコピー

アップロード効果が示されています:

 

4.ファイルをダウンロードしてください。

ファイルをアップロードし、我々は確かにダウンロードする必要があります。

URL +アドレス経由で直接ダウンロードは非常に安全でない方法である。ここでは、リターンの形をしているダウンロードして流れています。

背景コードは次のよう:

 

コードをコピー
        /// <要約>
        ///モード出力ファイルストリーム/// </要約>
        /// <リターン> </リターン>
        public IActionResult DownLoad(string file)
        {
            var addrUrl = file;
            var stream = System.IO.File.OpenRead(addrUrl);
            string fileExt = GetFileExt(file);
            //获取文件的ContentType
            var provider = new FileExtensionContentTypeProvider();
            var memi = provider.Mappings[fileExt];
            return File(stream, memi, Path.GetFileName(addrUrl));
        }  
コードをコピー

这里值得注意的是,以前我们想获取ContentType直接使用MimeMapping.GetMimeMapping(file);就好了.

但是这个类是在System.Web下的,core已经抛弃了现有的System.Web.

所以在ASP.NET Core中我们需要通过新的类FileExtensionContentTypeProvider来获取文件的ContentType

编写HTML+JS代码如下(PS:因为是demo,所以写的比较简陋):

<div>
    <input type="text" id="filename" /><button onclick="downLoad()">下载</button>
</div>
 function downLoad() {
            VARファイル名= $( "#ファイル名")のval();
            window.location.href = "@のUrl.Action(" ダウンロード ")ファイル=?" +ファイル名。

        }

効果はのようになります。

 

 

 

最後に書かれました

この本明細書中で、これはオーバー、興味を持ってください、信者やオスス​​メです。〜ブログも追加記事のカテゴリASP.NETコア。ありがとう、そして後にASP.NETコア記事に内側に分類されます。

著者:区インド出典:のhttp://www.cnblogs.com/GuZhenYin/あなたは助けるために、この記事を読んでいると考えられる場合は、「お勧め」ボタンをクリックしてください、あなたの「推奨」私の最大の記録パワーになります!この記事では、著者とブログパークの合計に属し転載を歓迎しますが、この節で宣言され、著者の同意なしに保持されなければならない、と記事のページで

ます。https://www.cnblogs.com/SpiritWalker/p/8195653.htmlで再現

おすすめ

転載: blog.csdn.net/weixin_33775572/article/details/94228050