首页 > 其他分享 >.net core的WebAPI+Vue2实现调用设备拍照上传图片功能

.net core的WebAPI+Vue2实现调用设备拍照上传图片功能

时间:2024-05-28 15:34:24浏览次数:21  
标签:WebAPI core return string 文件 Vue2 error 上传 图片

在工作中有时候会遇到上传文件上传图片或者拍照上传图片功能。这时候底下的内容就有可能可以帮助到你。后端的支持上传图片和上传文件功能。前端如果你选择普通上传功能就是普通上传功能,我这里选择的是调用相机设备实现拍照上传图片功能。

1.首先这是后端的控制器接口。

 1 /// <summary>
 2 /// 文件上传
 3 /// </summary>
 4 /// <param name="formFile"></param>
 5 /// <returns></returns>
 6 [HttpPost]
 7 [Route("AndonUploadFile")]
 8 public async Task<JsonResult> AndonUploadFile(IFormFile formFile)
 9 {
10     return await _andonconfigAppService.UploadFile(formFile);
11 }

2.这是控制器调用的服务层,中间会调用一些私有方法,如获取文件位置,我会列出来。至于存储的位置,这个得根据情况自己调整。

 1 /// <summary>
 2 /// 异步图片或文件上传
 3 /// </summary>
 4 /// <param name="formFile"></param>
 5 /// <returns></returns>
 6 public async Task<JsonResult> UploadFile(IFormFile formFile)
 7 {
 8     string extensions = null;
 9     //取文件名
10     var fullName = GetFullFileName(extensions, true);
11  
12     var savePath = GetFileSavePath(fullName);
13  
14     var FolderPath = Path.GetDirectoryName(savePath);
15     
16  
17     //上传文件重命名 获取上传文件的扩展名
18     var FilePath = $"/{DateTime.Now.ToString("yyyyMMddHHmmssfff")}{Path.GetExtension(formFile.FileName)}";
19  
20     //如果 path 指向现有目录,则为 true;如果该目录不存在或者在尝试确定指定目录是否存在时出错,则为 false。
21     if (!Directory.Exists($"{_env.WebRootPath}{FolderPath}"))
22         //创建新的指定目录
23         Directory.CreateDirectory($"{_env.WebRootPath}{FolderPath}");
24  
25     //using释放非托管资源 {env.WebRootPath}{FolderPath}{FilePath} 文件路径+文件名称
26     //FileMode 指定操作系统打开文件的方式
27     //OpenOrCreate指定操作系统应打开文件(如果文件存在);否则,应创建新文件
28     using (FileStream fs = new FileStream($"{_env.WebRootPath}{FolderPath}{FilePath}", FileMode.OpenOrCreate))
29     {
30         //异步获取文件内容
31         await formFile.CopyToAsync(fs);
32     }
33  
34     //返回图片的文件夹路径+名称
35     return new JsonResult(new
36     {
37         FilePath = $"{FolderPath}{FilePath}"
38     });
39 }

 获取文件名 GetFullFileName()  (注:这是我写的一个根据日期实现文件重命名的方法,你可以使用,也可以丢弃)

 1 /// <summary>
 2 /// 获取完整的文件名
 3 /// </summary>
 4 /// <param name="extensions"></param>
 5 /// <param name="isByDate"></param>
 6 /// <returns></returns>
 7 private string GetFullFileName(string extensions, bool isByDate = true)
 8 {
 9     if (isByDate)
10         return $"{DateTime.Now.ToString("yyyyMMdd")}\\{DateTime.Now.ToString("HHmmssffff")}{extensions}";
11     else
12         return $"{DateTime.Now.ToString("yyyyMMddHHmmssffff")}{extensions}";
13 }

获取文件的路径

 1 /// <summary>
 2 /// 获取文件保存路径
 3 /// </summary>
 4 /// <param name="filePath"></param>
 5 /// <returns></returns>
 6 public string GetFileSavePath(string filePath)
 7 {
 8     return Path.Combine(GetSaveDirectory(), filePath);
 9 }
10  
11  
12 private string _saveDirectory = string.Empty;
13  
14 /// <summary>
15 /// 获取存储路径
16 /// </summary>
17 /// <returns></returns>
18 internal string GetSaveDirectory()
19 {
20     if (_saveDirectory != string.Empty)
21         return _saveDirectory;
22  
23     var dic = Directory.GetParent(AppContext.BaseDirectory)?.Parent;
24  
25     if (dic != null)
26         _saveDirectory = Path.Combine(dic.FullName, "Attachment");
27  
28     return _saveDirectory;
29 }

3.前端vue2  通过点击按钮实现拍照然后把照片传给后端接口实现上传功能。

 1 <template>
 2   <div>
 3     <video ref="video" width="300" height="300" style="display: none"></video>
 4     <canvas ref="canvas" width="300" height="300" style="display: none"></canvas>
 5     <button @click="takePhoto">拍照</button>
 6   </div>
 7 </template>
 8  
 9 <script>
10 export default {
11   mounted() {
12     navigator.mediaDevices.getUserMedia({ video: true })
13       .then(stream => {
14         this.$refs.video.srcObject = stream;
15         this.$refs.video.play();
16       })
17       .catch(error => {
18         console.error('无法访问摄像头', error);
19         alert("无法访问摄像头")
20       });
21   },
22   methods: {
23     takePhoto() {
24       const context = this.$refs.canvas.getContext('2d');
25       context.drawImage(this.$refs.video, 0, 0, 300, 300);
26       this.$refs.canvas.toBlob(blob => {
27         this.uploadPhoto(blob);
28       }, 'image/jpeg');
29     },
30     uploadPhoto(blob) {
31       const formData = new FormData();
32       formData.append('formFile', blob, 'photo.jpg');
33  
34       fetch('http://localhost:44370/api/MES/AndonConfig/AndonUploadFile', {
35         method: 'POST',
36         body: formData
37       })
38       .then(response => {
39         if (response) {
40           console.log('图片上传成功');
41           alert("图片上传成功")
42         } else {
43           console.error('图片上传失败');
44           alert("图片上传失败")
45         }
46       })
47       .catch(error => {
48         console.error('请求错误', error);
49         alert("请求错误")
50       });
51     }
52   }
53 }
54 </script>

OK,这是我实现拍照上传照片的整个过程。中间的一些存储位置、请求地址会根据自己的情况进行调整。

希望可以通过这篇文章帮助到你。

 

标签:WebAPI,core,return,string,文件,Vue2,error,上传,图片
From: https://www.cnblogs.com/2004spc/p/18218132

相关文章

  • net core 建立webservice项目
    1、创建项目  2、通过NuGet安装SoapCore 3、创建服务接口及实现类本项目会创建2个webservice服务文件用于测试,所以创建了2个model类和2个接口文件。 Model类:[DataContract]publicclassFactoryModel{///<summary>///工厂号///<......
  • netcore构建webservice以及调用的完整流程
    目录构建前置准备编写服务挂载服务处理SoapHeader调用添加服务调用服务补充内容构建前置准备框架版本要求:netcore3.1以上引入nuget包SoapCore编写服务1.编写服务接口示例usingSystem.ServiceModel;namespaceServices;[ServiceContract(Namespace="http://Demo.WebService......
  • 在 Inno Setup 中检测 .NET 5 / .NET Core 运行环境是否存在
    为了将.NET5/.NETCore应用程序部署到客户机,我们可以编写InnoSetup代码来判断客户机是否安装了必要的运行环境。.NET官方仓库 中提供了一个名为 NetCoreCheck 的项目,可以用于检测指定的.NET5/.NETCore环境是否存在。编译好的文件可以从以下两个地址下载:文件......
  • dotnet c# samples core nativeaot NativeLibrary
     如何在System.Text.Json中使用源生成 https://learn.microsoft.com/zh-cn/dotnet/standard/serialization/system-text-json/source-generation?pivots=dotnet-8-0 https://github.com/dotnet/samples/tree/main/core/nativeaot/NativeLibrary   ......
  • vue2+uni-app的实现的动态数据显示
     1:所用技术:Vue2.X,Uview2.0,确保项目上已经安装了Vue2.X 版本和组件Uview(注:其余组件:如ElementUI组件也适用,主要是样式的区别)2:template层<template> <viewclass="NavPage"> <viewclass="LoginCard"> <uni-cardis-shadow:trueclass="CardLogin"......
  • 使用.Net Core开发WPF App系列教程( 八、WPF中的常用控件(下))
    使用.NetCore开发WPFApp系列教程一、.NetCore和WPF介绍二、在VisualStudio2019中创建.NetCoreWPF工程三、与.NetFramework的区别四、WPF中的XAML五、WPF中的布局六、WPF中的常用控件(上)七、WPF中的常用控件(中)八、WPF中的常用控件(下)其它、实现多语言切换的几种方......
  • dot net core使用BackgroundService运行一个后台服务
    不管是在控制台程序还是asp.netcore程序中,我们经常会有用到一个需要长时间运行的后台任务的需求。通常最直觉的方式是使用Thread实例来新建一个线程,但是这样需要自行管理线程的启动和停止。在.netcore中提供了一个继承自IHostedService的基类BackgroudService能够方便地实现一......
  • vue2.2——cdn如何使用插槽
    <mynav><h1slot="h1">我是具名插槽</h1><h2slot="h2">我没有命名</h2></mynav>letcp_template={mynav:{template:`<divstyle="color:red;"><......
  • Vue2批量全局注册组件
    创建一个文件(例如global-components.js),并在其中实现批量注册组件的逻辑。//src/global-components.jsimportVuefrom'vue';//自动导入components目录下的所有.vue文件constrequireComponent=require.context(//组件目录的相对路径'./components',//是......
  • ASP.NET CORE kindeditor在线编辑器示例(上传多图和插入VIDEO标签)
    2024年05月26日更新以前记录都过时了,ASP.NETASPX版本的直接看他里面的示例就好,今天把自己弄的上传多图和插入video标签的代码贴上来。。以备以后需要用的时候直接复制粘贴。。。ASP.NETCORE版本,VS2022,原来里面也有个上传多图和插入视频的。。用的flash来上传多图和插入的embe......