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