应无所住,而生其心
排名
1
文章
860
粉丝
112
评论
163
net core webapi post传递参数
庸人 : 确实坑哈,我也是下班好了好几次,发现后台传递对象是可以的,但...
百度编辑器自定义模板
庸人 : 我建议换个编辑器,因为现在百度富文本已经停止维护了,用tinymec...
ICP备案 :渝ICP备18016597号-1
网站信息:2018-2025TNBLOG.NET
技术交流:群号656732739
联系我们:contact@tnblog.net
公网安备:50010702506256
欢迎加群交流技术

.net core 接收 el-upload 文件上传。el-upload配合.net core webapi 文件上传。vue3文件上传,图片上传。文件上传类型限制,文件删除,文件预览。element plus 图片上传

10522人阅读 2022/8/3 17:26 总访问:5194809 评论:0 收藏:0 手机
分类: .NET Core

前端就是vue 3的elemnt ui

  1. <template>
  2. <div class="upload-container">
  3. <!-- <vab-upload
  4. ref="vabUploadRef"
  5. :limit="50"
  6. name="file"
  7. :size="2"
  8. url="/upload"
  9. /> -->
  10. <vab-upload
  11. ref="vabUploadRef"
  12. :limit="50"
  13. name="file"
  14. :size="2"
  15. url="http://localhost:8002/api/upload"
  16. />
  17. <el-button type="primary" @click="handleShow()">模拟上传</el-button>
  18. </div>
  19. </template>
  20. <script>
  21. import VabUpload from '@/plugins/VabUpload'
  22. export default defineComponent({
  23. name: 'Upload',
  24. components: {
  25. VabUpload,
  26. },
  27. setup() {
  28. const vabUploadRef = ref()
  29. const handleShow = () => {
  30. vabUploadRef.value.handleShow()
  31. }
  32. return {
  33. vabUploadRef,
  34. handleShow,
  35. }
  36. },
  37. })
  38. </script>

VabUpload:

  1. <template>
  2. <el-dialog
  3. v-model="dialogFormVisible"
  4. :before-close="handleClose"
  5. :close-on-click-modal="false"
  6. :title="title"
  7. width="909px"
  8. >
  9. <div class="upload">
  10. <el-alert
  11. :closable="false"
  12. :title="`支持jpg、jpeg、png格式,单次可最多选择${limit}张图片,每张不可大于${size}M,如果大于${size}M会自动为您过滤`"
  13. type="info"
  14. />
  15. <el-upload
  16. ref="uploadRef"
  17. accept="image/png, image/jpeg"
  18. :action="action"
  19. :auto-upload="false"
  20. class="upload-content"
  21. :close-on-click-modal="false"
  22. :data="data"
  23. :file-list="fileList"
  24. :headers="headers"
  25. :limit="limit"
  26. list-type="picture-card"
  27. :multiple="true"
  28. :name="name"
  29. :on-change="handleChange"
  30. :on-error="handleError"
  31. :on-exceed="handleExceed"
  32. :on-preview="handlePreview"
  33. :on-progress="handleProgress"
  34. :on-remove="handleRemove"
  35. :on-success="handleSuccess"
  36. >
  37. <template #trigger>
  38. <vab-icon icon="add-line" />
  39. </template>
  40. <el-dialog v-model="dialogVisible" append-to-body title="查看大图">
  41. <div>
  42. <el-image :src="dialogImageUrl" />
  43. </div>
  44. </el-dialog>
  45. </el-upload>
  46. </div>
  47. <template #footer>
  48. <div
  49. v-if="show"
  50. style="position: absolute; top: 10px; left: 15px; color: #999"
  51. >
  52. 正在上传中... 当前上传成功数:{{ imgSuccessNum }}张 当前上传失败数:{{
  53. imgErrorNum
  54. }}张
  55. </div>
  56. <el-button type="primary" @click="handleClose">关闭</el-button>
  57. <el-button
  58. :loading="loading"
  59. style="margin-left: 10px"
  60. type="success"
  61. @click="submitUpload"
  62. >
  63. 开始上传2
  64. </el-button>
  65. </template>
  66. </el-dialog>
  67. </template>
  68. <script>
  69. import { useUserStore } from '@/store/modules/user'
  70. import _ from 'lodash'
  71. export default defineComponent({
  72. name: 'VabUpload',
  73. props: {
  74. url: {
  75. type: String,
  76. default: 'http://localhost:8002/upload222',
  77. required: true,
  78. },
  79. name: {
  80. type: String,
  81. default: 'file',
  82. required: true,
  83. },
  84. limit: {
  85. type: Number,
  86. default: 50,
  87. required: true,
  88. },
  89. size: {
  90. type: Number,
  91. default: 1,
  92. required: true,
  93. },
  94. },
  95. setup(props) {
  96. const userStore = useUserStore()
  97. const { token } = storeToRefs(userStore)
  98. const $baseMessage = inject('$baseMessage')
  99. const state = reactive({
  100. uploadRef: null,
  101. show: false,
  102. loading: false,
  103. dialogVisible: false,
  104. dialogImageUrl: '',
  105. action: '',
  106. headers: {},
  107. fileList: [],
  108. picture: 'picture',
  109. imgNum: 0,
  110. imgSuccessNum: 0,
  111. imgErrorNum: 0,
  112. typeList: null,
  113. title: '上传',
  114. dialogFormVisible: false,
  115. data: {},
  116. })
  117. const submitUpload = () => {
  118. state.uploadRef.submit()
  119. }
  120. const handleProgress = () => {
  121. state.loading = true
  122. state.show = true
  123. }
  124. const handleChange = (file, fileList) => {
  125. if (fileList && fileList.length > 0) {
  126. if (file.size > 1048576 * state.size) {
  127. fileList.filter((item) => item !== file)
  128. state.fileList = fileList
  129. } else {
  130. state.allImgNum = fileList.length
  131. }
  132. }
  133. }
  134. const handleSuccess = (response, file, fileList) => {
  135. state.imgNum = state.imgNum + 1
  136. state.imgSuccessNum = state.imgSuccessNum + 1
  137. if (fileList.length === state.imgNum) {
  138. setTimeout(() => {
  139. $baseMessage(
  140. `上传完成! 共上传${fileList.length}张图片`,
  141. 'success',
  142. 'vab-hey-message-success'
  143. )
  144. }, 1000)
  145. }
  146. setTimeout(() => {
  147. state.loading = false
  148. state.show = false
  149. }, 1000)
  150. }
  151. const handleError = (err, file) => {
  152. state.imgNum = state.imgNum + 1
  153. state.imgErrorNum = state.imgErrorNum + 1
  154. $baseMessage(
  155. `文件[${file.raw.name}]上传失败,文件大小为${_.round(
  156. file.raw.size / 1024,
  157. 0
  158. )}KB`,
  159. 'error',
  160. 'vab-hey-message-error'
  161. )
  162. setTimeout(() => {
  163. state.loading = false
  164. state.show = false
  165. }, 1000)
  166. }
  167. const handleRemove = () => {
  168. state.imgNum = state.imgNum - 1
  169. state.allNum = state.allNum - 1
  170. }
  171. const handlePreview = (file) => {
  172. state.dialogImageUrl = file.url
  173. state.dialogVisible = true
  174. }
  175. const handleExceed = (files) => {
  176. $baseMessage(
  177. `当前限制选择 ${state.limit} 个文件,本次选择了
  178. ${files.length}
  179. 个文件`,
  180. 'error',
  181. 'vab-hey-message-error'
  182. )
  183. }
  184. const handleShow = (data) => {
  185. state.title = '上传'
  186. state.data = data
  187. state.dialogFormVisible = true
  188. }
  189. const handleClose = () => {
  190. state.fileList = []
  191. state.picture = 'picture'
  192. state.allImgNum = 0
  193. state.imgNum = 0
  194. state.imgSuccessNum = 0
  195. state.imgErrorNum = 0
  196. state.headers['Authorization'] = `Bearer ${token}`
  197. state.dialogFormVisible = false
  198. }
  199. onMounted(() => {
  200. state.headers['Authorization'] = `Bearer ${token}`
  201. //这里给上传地址
  202. state.action = props.url
  203. })
  204. const percentage = computed(() => {
  205. if (state.allImgNum === 0) return 0
  206. return _.round(state.imgNum / state.allImgNum, 2) * 100
  207. })
  208. return {
  209. ...toRefs(state),
  210. submitUpload,
  211. handleProgress,
  212. handleChange,
  213. handleSuccess,
  214. handleError,
  215. handleRemove,
  216. handlePreview,
  217. handleExceed,
  218. handleShow,
  219. handleClose,
  220. percentage,
  221. }
  222. },
  223. })
  224. </script>
  225. <style lang="scss" scoped>
  226. .upload {
  227. height: 500px;
  228. .upload-content {
  229. .el-upload__tip {
  230. display: block;
  231. height: 30px;
  232. line-height: 30px;
  233. }
  234. :deep() {
  235. .el-upload--picture-card {
  236. width: 128px;
  237. height: 128px;
  238. margin: 3px 8px 8px 8px;
  239. border: 2px dashed #c0ccda;
  240. .ri-add-line {
  241. font-size: 24px;
  242. }
  243. }
  244. .el-upload-list--picture {
  245. margin-bottom: 20px;
  246. }
  247. .el-upload-list--picture-card {
  248. .el-upload-list__item {
  249. width: 128px;
  250. height: 128px;
  251. margin: 3px 8px 8px 8px;
  252. }
  253. }
  254. }
  255. }
  256. }
  257. </style>

文件上传的类型配置,要加什么类型继续让后面加就行了

  1. accept="image/png,image/jpeg,.xls,.xlsx,.txt"

.net core webapi后端

和其他上传图片的方式几乎都是一样的。从Request.Form.Files中取出来文件处理保存即可。核心代码如下:

  1. using Microsoft.AspNetCore.Authorization;
  2. using Microsoft.AspNetCore.Http;
  3. using Microsoft.AspNetCore.Mvc;
  4. using System;
  5. using System.Collections;
  6. using System.Collections.Generic;
  7. using System.IO;
  8. using System.Linq;
  9. using System.Threading.Tasks;
  10. namespace WY.JBLand.API.API.V1
  11. {
  12. [Route("api/[controller]")]
  13. [ApiController]
  14. public class UpLoadController : ControllerBase
  15. {
  16. /// <summary>
  17. /// 上传多个文件
  18. /// </summary>
  19. /// <param name="Files"></param>
  20. /// <returns></returns>
  21. [HttpPost]
  22. [AllowAnonymous]
  23. public string Post(IFormCollection Files)
  24. {
  25. try
  26. {
  27. string dd = Files["File"];
  28. var form = Files;//定义接收类型的参数
  29. Hashtable hash = new Hashtable();
  30. IFormFileCollection cols = Request.Form.Files;
  31. if (cols == null || cols.Count == 0)
  32. {
  33. return "没有上传文件";
  34. }
  35. foreach (IFormFile file in cols)
  36. {
  37. //定义图片数组后缀格式
  38. string[] LimitPictureType = { ".JPG", ".JPEG", ".GIF", ".PNG", ".BMP" };
  39. //获取图片后缀是否存在数组中
  40. string currentPictureExtension = Path.GetExtension(file.FileName).ToUpper();
  41. if (LimitPictureType.Contains(currentPictureExtension))
  42. {
  43. //这里暂时不重新生成文件名称,图片重命名使用guid或者时间都可以
  44. // var new_path = DateTime.Now.ToString("yyyyMMdd")+ file.FileName;
  45. //var newName = Guid.NewGuid().ToString().Replace("-", "") + currentPictureExtension.ToLower();
  46. var new_path = Path.Combine("uploads/images/", file.FileName);
  47. var path = Path.Combine(Directory.GetCurrentDirectory(), "wwwroot", new_path);
  48. //这步之前最好做一下文件夹是否存在的判断,如果不存在就创建一下
  49. using (var stream = new FileStream(path, FileMode.Create))
  50. {
  51. file.CopyTo(stream);
  52. stream.Flush();
  53. }
  54. }
  55. else
  56. {
  57. return "请上传指定格式的图片";
  58. }
  59. }
  60. return "上传成功";
  61. }
  62. catch (Exception ex)
  63. {
  64. return "上传失败";
  65. }
  66. }
  67. }
  68. }

其实简单点来说就是这样使用而已(使用原生的element plus 的可以从这里开始看,没有经过封装的)

后端写好一个上传图片文件的接口,这个一般项目里边都是封装好的模块(.net的上传后台可以参考:https://www.tnblog.net/aojiancc2/article/details/8595
前端也非常简单,主要的核心代码就是这点:

  1. <el-form-item label="封面" prop="CoverImg">
  2. <el-upload class="avatar-uploader"
  3. :show-file-list="false"
  4. action="/oss/api/TnblogFiles/UpLoadFormFile"
  5. :headers="getHeaderToken()"
  6. accept="image/*"
  7. :data="{
  8. bucketName: 'education',
  9. filePath: 'course/imgs',
  10. FileType: 1,
  11. }"
  12. :on-success="handleAvatarSuccess"
  13. :before-upload="beforeAvatarUpload"
  14. >
  15. <img v-if="editFromData.coverImg" :src="getImgUrl(editFromData.coverImg)" class="coverImg">
  16. <el-icon v-else class="avatar-uploader-icon"><Plus /></el-icon>
  17. </el-upload>
  18. </el-form-item>
  19. <script setup lang="ts" >
  20. import { Plus } from '@element-plus/icons-vue'
  21. import { getHeaderToken,getImgUrl } from '/@/utils/toolsFunctions';
  22. </script>
  • action就是你后端封装的上传的接口
  • headers 就是提供一个token嘛,后台接口一般都需要身份验证的,token一般前端都会统一封装一个获取token的方法的
  • accept 就是限制一下文件的类型嘛
  • data 提供一些额外的数据,比如封装的oss文件上传接口,要提供一些桶的名称,文件存储位置什么的额外信息
  • before-upload一个事件嘛,一般就是用来做上传前的验证比如验证一下文件是否超大等
    1. const beforeAvatarUpload = (file:any)=>{
    2. const isMoreThanSize = file.size / 1024 / 1024 < 10
    3. if (!isMoreThanSize) {
    4. ElMessage.error('上传封面图片大小不能超过 10MB!');
    5. }
    6. return isMoreThanSize
    7. }
  • on-success 也是一个事件上传成功后的事件,比如做上传封面什么的,可以在这个事件里边处理上传成功后马上显示图片
    1. const handleAvatarSuccess = (res:any, file:any)=>{
    2. if (res.success) {
    3. // 上传成功之后给变量赋值,显示出来需要上传的图片
    4. state.editFromData.coverImg = res.data.id
    5. }
    6. }

这个上传封面的效果图

样式也贴一下(如果样式没有作用的话,检查一下弹窗里边是否使用了:append-to-body="true"

  1. <style scoped="scoped" lang="scss">
  2. // 最外层的样式自己修改一下
  3. .sub-program-update-container {
  4. .coverImg{
  5. width: 109px;
  6. height: 109px;
  7. }
  8. }
  9. </style>
  10. <!-- 这里不要scoped="scoped", 因为涉及到修改element plus 上传组件的样式,当然加上scoped也可以,就要用到样式穿透了 -->
  11. <style lang="scss">
  12. // 最外层的样式自己修改一下
  13. .sub-program-update-container {
  14. .avatar-uploader .el-upload {
  15. border: 1px dashed var(--el-border-color);
  16. border-radius: 6px;
  17. cursor: pointer;
  18. position: relative;
  19. overflow: hidden;
  20. transition: var(--el-transition-duration-fast);
  21. }
  22. .avatar-uploader .el-upload:hover {
  23. border-color: var(--el-color-primary);
  24. }
  25. .el-icon.avatar-uploader-icon {
  26. font-size: 28px;
  27. color: #8c939d;
  28. width: 98px;
  29. height: 98px;
  30. text-align: center;
  31. }
  32. }
  33. </style>

只允许上传一个文件,并且后上传的覆盖前面上传的

官方文档:https://element-plus.org/zh-CN/component/upload.html#%E8%A6%86%E7%9B%96%E5%89%8D%E4%B8%80%E4%B8%AA%E6%96%87%E4%BB%B6

设置 limit 和 on-exceed 可以在选中时自动替换上一个文件。
核心代码如下

  1. <el-upload
  2. ref="uploadVedioRef"
  3. :limit="1"
  4. :on-exceed="handleVedioExceed"
  5. >
  6. <el-button type="primary" size="default">请选择视频上传</el-button>
  7. </el-upload>
  8. const uploadVedioRef = ref<UploadInstance>()
  9. const handleVedioExceed: UploadProps['onExceed'] = (files) => {
  10. uploadVedioRef.value!.clearFiles()
  11. const file = files[0] as UploadRawFile
  12. file.uid = genFileId()
  13. uploadVedioRef.value!.handleStart(file)
  14. // 直接自动上传,覆盖前面一个文件
  15. uploadVedioRef.value!.submit()
  16. }

处理文件预览

使用自带的handlePreview事件实现文件预览

先绑定好handlePreview事件

  1. <el-upload
  2. ref="uploadVedioRef"
  3. :on-preview="handleVedioPreview"
  4. >
  5. <el-button type="primary" size="default">请选择视频上传</el-button>
  6. </el-upload>

然后在handlePreview事件中就可以实现文件预览了

  1. const handleVedioPreview: UploadProps['onPreview'] = (uploadFile:any) => {
  2. console.log(uploadFile)
  3. // 如果有vedioId属性就直接调用封装的视频预览方法去视频预览
  4. if(uploadFile.vedioId){
  5. openFileNewWindow(uploadFile.vedioId)
  6. }
  7. }

具体的预览逻辑自己去实现我这里的视频预览其实就是使用视频的id去调用接口获取视频预览的地址,然后在浏览器的新标签打开一个地址即可

注意上面那个只是基础的核心代码,真正要处理预览需要自己去实现,比如要预览上次已经上传好了的文件
应该从接口从获取以前已经上次好了的文件绑定给upload,核心代码如下

  1. <template>
  2. <el-upload
  3. ref="uploadVedioRef"
  4. :file-list="state.vedioFileList"
  5. :on-preview="handleVedioPreview"
  6. >
  7. <el-button type="primary" size="default">请选择视频上传</el-button>
  8. </el-upload>
  9. </template>
  10. <script setup lang="ts" name="sub-program-update">
  11. const state = reactive({
  12. vedioFileList:[],
  13. })
  14. const initData = (selectRowData: any) => {
  15. let row = selectRowData
  16. // 给已经上传的文件添加到文件列表中进行管理
  17. state.vedioFileList.push({
  18. name:row.vedioInfo,
  19. vedioId:row.vedio
  20. })
  21. }
  22. const handleVedioPreview: UploadProps['onPreview'] = (uploadFile:any) => {
  23. console.log(uploadFile)
  24. // 如果有vedioId属性就直接调用封装的视频预览方法去视频预览
  25. if(uploadFile.vedioId){
  26. openFileNewWindow(uploadFile.vedioId)
  27. }
  28. }
  29. </script>

如果是预览新上传的文件,可以在上传成功的事件里边给文件对象中添加一个vedioId的属性,方便在预览的时候保持和预览前面已经上次的文件逻辑一致

  1. <template>
  2. <el-upload
  3. ref="uploadVedioRef"
  4. :file-list="state.vedioFileList"
  5. :on-preview="handleVedioPreview"
  6. :show-file-list="true"
  7. :on-success="handleVedioSuccess"
  8. >
  9. <el-button type="primary" size="default">请选择视频上传</el-button>
  10. </el-upload>
  11. </template>
  12. <script setup lang="ts" name="sub-program-update">
  13. const state = reactive({
  14. vedioFileList:[],
  15. })
  16. const initData = (selectRowData: any) => {
  17. let row = selectRowData
  18. // 给已经上传的文件添加到文件列表中进行管理
  19. state.vedioFileList.push({
  20. name:row.vedioInfo,
  21. vedioId:row.vedio
  22. })
  23. }
  24. // 视频上传成功的处理,给相关内容赋值
  25. const handleVedioSuccess = (res: any, file: any) => {
  26. if (res.success) {
  27. // 上传成功之后给变量赋值,点击保存的时候才能更新到数据库去
  28. state.editFromData.vedio = res.data.id
  29. state.editFromData.vedioInfo = file.name
  30. // *** 给文件对象中添加一个vedioId的属性,方便在预览的时候保持和预览前面已经上次的文件逻辑一致***
  31. file.vedioId = res.data.id
  32. }
  33. }
  34. const handleVedioPreview: UploadProps['onPreview'] = (uploadFile:any) => {
  35. console.log(uploadFile)
  36. if(uploadFile.vedioId){
  37. openFileNewWindow(uploadFile.vedioId)
  38. }
  39. else{
  40. ElMessage.error('预览失败,请检查文件是否存在!')
  41. }
  42. }
  43. </script>

自己去写模板自己去解析filelist的方式

在 Element Plus 中,el-upload 组件的 file-list 属性允许你自定义文件列表的显示,你可以通过插槽(slots)来自定义文件列表,并手动添加点击事件进行你想要的操作。

下面是一个简单的示例,实现图片预览的:

处理删除的逻辑

如果不想让文件可以点击自带的删除按钮删除,可以这样做

主要就是绑定一个before-remove事件,当然还要设置一下show-file-list为true,才会显示文件列表右边就有删除的操作按钮

  1. <el-upload
  2. :before-remove="beforeVedioRemove"
  3. :show-file-list="true"
  4. >
  5. <el-button type="primary" size="default">请选择视频上传</el-button>
  6. </el-upload>

事件里边提示一句话,在返回false阻止删除行为即可

  1. const beforeVedioRemove: UploadProps['beforeRemove'] = (uploadFile, uploadFiles) => {
  2. ElMessage.error('暂不支持删除,可以重新上传覆盖!');
  3. return false
  4. }


当然如果不想让文件被删除,可以直接把show-file-list设置为false就没有删除的操作了,但是有些时候即想要显示文件的上传进度,又不想要文件被删除就可以这样做,因为自带的show-file-list里边有自带的文件上传进度显示使用起来体验还是不错的

如果想要真正的删除文件,就可以这样去写逻辑

调用接口去删除存储的文件以及更新需要更新的数据,具体逻辑根据自己的修改即可

  1. const beforeVedioRemove: UploadProps['beforeRemove'] = (uploadFile, uploadFiles) => {
  2. return ElMessageBox.confirm(`是否删除文件视频`).then(
  3. () => {
  4. let updateData = { id: state.editFromData.id, Vedio: '', VedioInfo: '' }
  5. // 调用接口去删除存储的文件以及更新需要更新的数据,具体逻辑根据自己的修改即可
  6. request.post('/xxxApi/api/TrainingSubProgram/UpdateVedio', updateData).then(
  7. (res: any) => {
  8. if (res.success) {
  9. emitWays('refreshData')
  10. ElMessage.success('视频删除成功!')
  11. }
  12. },
  13. (res) => {
  14. ElMessage.error('视频删除失败!')
  15. }
  16. )
  17. return true
  18. },
  19. () => {
  20. return false
  21. }
  22. )
  23. }

常用的文件限制

图片相关

  1. accept="image/*"
  2. accept="image/png, image/jpeg"

压缩包相关

  1. accept=".zip,.rar,.tar,.7z"

各种类型的组合

  1. accept="image/png,image/jpeg,.xls,.xlsx,.txt"

欢迎加群讨论技术,1群:677373950(满了,可以加,但通过不了),2群:656732739。有需要软件开发,或者学习软件技术的朋友可以和我联系~(Q:815170684)

评价

net core 使用 EF Code First

下面这些内容很老了看这篇:https://www.tnblog.net/aojiancc2/article/details/5365 项目使用多层,把数据库访问...

.net mvc分部页.net core分部页

.net分部页的三种方式第一种:@Html.Partial(&quot;_分部页&quot;)第二种:@{ Html.RenderPartial(&quot;分部页&quot;);}...

StackExchange.Redis操作redis(net core支持)

官方git开源地址https://github.com/StackExchange/StackExchange.Redis官方文档在docs里边都是官方的文档通过nuget命令下...

.net core 使用session

tip:net core 2.2后可以直接启用session了,不用在自己添加一次session依赖,本身就添加了使用nuget添加引用Microsoft.AspN...

通俗易懂什么是.net?什么是.net Framework?什么是.net core?

朋友圈@蓝羽 看到一篇文章写的太详细太通俗了,搬过来细细看完,保证你对.NET有个新的认识理解原文地址:https://www.cnblo...

asp.net core2.0 依赖注入 AddTransient与AddScoped的区别

asp.net core主要提供了三种依赖注入的方式其中AddTransient与AddSingleton比较好区别AddTransient瞬时模式:每次都获取一...

.net core 使用 Kestrel

Kestrel介绍 Kestrel是一个基于libuv的跨平台web服务器 在.net core项目中就可以不一定要发布在iis下面了Kestrel体验可以使...

net core中使用cookie

net core中可以使用传统的cookie也可以使用加密的cookieNET CORE中使用传统cookie设置:HttpContext.Response.Cookies.Appe...

net core项目结构简单分析

一:wwwrootwwwroot用于存放网站的静态资源,例如css,js,图片与相关的前端插件等lib主要是第三方的插件,例如微软默认引用...

net core使用EF之DB First

一.新建一个.net core的MVC项目新建好项目后,不能像以前一样直接在新建项中添加ef了,需要用命令在添加ef的依赖二.使用Nug...

.net core使用requestresponse下载文件下载excel等

使用request获取内容net core中request没有直接的索引方法,需要点里边的Query,或者formstringbase64=Request.Form[&quot;f...

iframe自适应高度与配合net core使用

去掉iframe边框frameborder=&quot;0&quot;去掉滚动条scrolling=&quot;no&quot;iframe 自适应高度如果内容是固定的,那么就...

net core启动报错Unable to configure HTTPS endpoint. No server certificate was specified

这是因为net core2.1默认使用的https,如果使用Kestrel web服务器的话没有安装证书就会报这个错其实仔细看他的错误提示,其...

net core中使用url编码与解码操作

net core中暂时还没有以前asp.net与mvc中的server对象。获取url的编码与解码操作不能使用以前的server对象来获取。使用的是...

下载net core

官方下载地址:https://dotnet.microsoft.com/download 进来之后就可以看到最新的下载版本可以直接点击下载,也可以下载其...

net core使用依赖注入来装载EF的上下文对象

妹子情人节快乐~.net core中用了不少的依赖注入,官方文档中也推荐使用。这样使用依赖注入来管理ef对象,还是比较科学,比如...