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コア記事に内側に分類されます。
ます。https://www.cnblogs.com/SpiritWalker/p/8195653.htmlで再現