序文:
Vueでelement-ui-adminの使い方を学び始めてから約2年になりますが、以前の開発では、ファイル選択直後にelement-uiアップロードコンポーネントel-uploadを直接使用してファイルを選択していました。以前のものと同様のファイルアップロード要件ですが、今回は手動でボタンをクリックしてデータをインポートするためにファイルをサーバーにアップロードする必要があり、アップロード用に選択できるファイルは1つだけです。リストデータは消去されます。ここで、サーバーはASP.NET Core WEB APIを使用して、ファイルストリームデータを受信および保存します。
1. el-uploadファイルアップロードコンポーネントの概要:
el-uploadコンポーネントの詳細については、公式の説明を確認してください。
一般的に使用される基本的な属性:
パラメータ | 解説 | タイプ | オプションの値 | デフォルト値 |
---|---|---|---|---|
アクション | 必須パラメーター、アップロードアドレス | ストリング | — | — |
ヘッダー | アップロードリクエストヘッダーを設定する | オブジェクト | — | — |
複数 | 複数選択ファイルをサポートするかどうか | ブール | — | — |
データ | アップロードに追加されたパラメーター | オブジェクト | — | — |
名前 | アップロードされたファイルのフィールド名 | ストリング | — | ファイル |
資格情報付き | Cookie資格情報の送信をサポート | ブール | — | 偽 |
show-file-list | アップロードされたファイルのリストを表示するかどうか | ブール | — | 本当 |
引っ張る | ドラッグアンドドロップアップロードを有効にするかどうか | ブール | — | 偽 |
受け入れる | アップロードされたファイルのタイプを受け入れる(このパラメーターはサムネイルモードモードでは無効です) | ストリング | — | — |
オンプレビュー | ファイルリストでアップロードされたファイルをクリックしたときにフック | 関数(ファイル) | — | — |
削除中 | ファイルを削除するときのファイルリストフック | 関数(ファイル、ファイルリスト) | — | — |
成功 | ファイルが正常にアップロードされたときにフックする | 関数(応答、ファイル、ファイルリスト) | — | — |
エラー時 | ファイルのアップロードが失敗したときにフックする | 関数(エラー、ファイル、ファイルリスト) | — | — |
進行中 | ファイルをアップロードする際のフック | 関数(イベント、ファイル、ファイルリスト) | — | — |
変更中 | ファイルのステータスが変化したときのフック。ファイルが追加されたときに呼び出され、アップロードは成功し、アップロードは失敗します。 | 関数(ファイル、ファイルリスト) | — | — |
アップロード前 | ファイルをアップロードする前のフック。パラメータはアップロードされたファイルです。falseまたはPromiseが返されて拒否された場合、アップロードは停止されます。 | 関数(ファイル) | — | — |
削除前 | ファイルを削除する前のフック。パラメータはアップロードされたファイルとファイルリストです。falseを返すか、Promiseに戻って拒否された場合、削除は停止します。 | 関数(ファイル、ファイルリスト) | — | — |
リストタイプ | ファイルリストの種類 | ストリング | テキスト/写真/絵カード | テキスト |
自動アップロード | ファイルを選択した直後にアップロードするかどうか | ブール | — | 本当 |
ファイルリスト | アップロードされたファイルのリスト。例:[{name: 'food.jpg'、url: 'https://xxx.cdn.com/xxx.jpg'}] | アレイ | — | [] |
http-request | デフォルトのアップロード動作をオーバーライドし、アップロードの実装をカスタマイズできます | 関数 | — | — |
無効 | 無効にするかどうか | ブール | — | 偽 |
限定 | 許可されるアップロードの最大数 | 数 | — | — |
第二に、達成される効果:
ファイルアップロードボタンをクリックすると、ダイアログファイル選択ボックスがポップアップ表示され、ファイル選択ボタンをクリックしてインポートするExcelファイルを選択し、データインポートボタンをクリックして、ExcelファイルストリームをPostリクエストを通じてASP.NET Coreバックグラウンドサービスに転送できます。 、データを保存します。
ポップアップボックスの効果を以下に示します。
3、コードの実装:
フロントエンドVueコードの実装:
アップロードしたファイルのリストをクリアしてください:
ref = "upload"およびfile-list = "fileList"の2つの属性が同時に存在する必要があります。それ以外の場合、このメソッドは機能しません。$ Refs.upload.clearFiles()が呼び出されます
テンプレートコード:
<template> <div> <el-dialog title="数据导入" :visible.sync="dialogVisible" width="30%" :before-close="handleClose"> <el-upload class="upload-demo" ref="upload" :action="actionRequestUrl" :on-preview="handlePreview" :on-remove="handleRemove" :on-success="fileUploadSuccess" :on-error="fileUploadFail" :on-change="fileChange" :file-list="fileList" :limit="1" :auto-upload="false" :headers="headers"> <el-button slot="trigger" size="small" type="primary">选取文件</el-button> <el-button size="small" @click="downloadTemplate">导入模板下载</el-button> <div slot="tip" class="el-upload__tip">请按照导入模板中的数据格式导入</div> </el-upload> <span slot="footer" class="dialog-footer"> <el-button @click="dialogVisible = false">取 消</el-button> <!-- <el-button type="primary" @click="dialogVisible = false">确 定</el-button> --> <el-button style="margin-left: 10px;" type="success" @click="submitUpload">数据导入</el-button> <!-- <div slot="tip" class="el-upload__tip">只能上传jpg/png文件,且不超过500kb</div> --> </span> </el-dialog> </div> </template>
Js中代码:
<script> data() { return { fileList: [], //文件列表 dialogVisible: false,//Dialog显示状态 headers: { "X-Token": jwtToken }//设置上传的请求头部 fileDownloadUrl:'www.xxxx.com',//文件下载地址 actionRequestUrl:'www.xxxx.com/fileUpload'//请求服务器接口地址 }}, //执行相关的方法 methods: { //打开导入弹窗 openImporDialog() { this.dialogVisible = true; }, //关闭弹窗 handleClose() { this.dialogVisible = false; }, //上传到服务器 submitUpload() { console.log(this.fileList); if (this.fileList.length <= 0) { this.$message.error("请先选择需要上传的文件!"); return false; } this.$refs.upload.submit(); }, //文件上传服务端失败时的钩子 fileUploadFail: function(err, file, fileList) { console.log("文件上传失败", file, fileList); }, // 文件上传服务端成功时的钩子 fileUploadSuccess: function(response, file, fileList) { console.log("上传成功"); console.log(response); //清空已上传的文件列表 this.$refs.upload.clearFiles(); if (response.result) { this.dialogVisible = false; this.$message({ message: response.message, type: "success" }); } else { this.$message.error(response.message); } }, //文件状态改变时的钩子,添加文件、上传成功和上传失败时都会被调用 fileChange(file, fileList) { //解决无法判断el-upload是否上传过文件问题 this.fileList = fileList; console.log("选择文件上传成功后显示的内容》", file, fileList); }, //文件列表移除文件时的钩子 handleRemove(file, fileList) { this.fileList = []; // return this.$confirm(`确定移除 ${file.name}?`); },
//点击文件列表中已上传的文件时的钩子 handlePreview(file) { console.log(file); }, //导入模板下载 downloadTemplate() { window.location.href =this.fileDownloadUrl+"/xxxExcel导入模板.xlsx"; } } </script>
服务端ASP.NET Core WEB API来进行文件流数据接收和保存:
using System; using System.IO; using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; namespace FileUploadManage.Controllers { /// <summary> /// 图片,视频,音频,文档等相关文件通用上传服务类 /// </summary> public class FileUploadController : Controller { private static IHostingEnvironment _hostingEnvironment; public FileUploadController(IHostingEnvironment hostingEnvironment) { _hostingEnvironment = hostingEnvironment; } /// <summary> /// Form表单之单文件上传 /// </summary> /// <param name="formFile">form表单文件流信息</param> /// <returns></returns> public JsonResult FormSingleFileUpload(IFormFile formFile) { var currentDate = DateTime.Now; var webRootPath = _hostingEnvironment.WebRootPath;//>>>相当于HttpContext.Current.Server.MapPath("") try { var filePath = $"/UploadFile/{currentDate:yyyyMMdd}/"; //创建每日存储文件夹 if (!Directory.Exists(webRootPath + filePath)) { Directory.CreateDirectory(webRootPath + filePath); } if (formFile != null) { //文件后缀 var fileExtension = Path.GetExtension(formFile.FileName);//获取文件格式,拓展名 //判断文件大小 var fileSize = formFile.Length; if (fileSize > 1024 * 1024 * 10) //10M TODO:(1mb=1024X1024b) { return new JsonResult(new { isSuccess = false, resultMsg = "上传的文件不能大于10M" }); } //保存的文件名称(以名称和保存时间命名) var saveName = formFile.FileName.Substring(0, formFile.FileName.LastIndexOf('.')) + "_" + currentDate.ToString("HHmmss") + fileExtension; //文件保存 using (var fs = System.IO.File.Create(webRootPath + filePath + saveName)) { formFile.CopyTo(fs); fs.Flush(); } //完整的文件路径 var completeFilePath = Path.Combine(filePath, saveName); return new JsonResult(new { isSuccess = true, returnMsg = "上传成功", completeFilePath = completeFilePath }); } else { return new JsonResult(new { isSuccess = false, resultMsg = "上传失败,未检测上传的文件信息~" }); } } catch (Exception ex) { return new JsonResult(new { isSuccess = false, resultMsg = "文件保存失败,异常信息为:" + ex.Message }); } } } }