upload-utils.ts 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. import { axios } from '@/request'
  2. import { uploadFile } from '@/request/urls'
  3. import { ElMessage } from 'element-plus'
  4. /**
  5. * 上传文件的公共方法
  6. * @param file - 要上传的文件
  7. * @param onProgress - 上传进度回调函数
  8. * @returns Promise<{url: string, fileName: string}> 返回上传成功后的文件信息
  9. */
  10. export const uploadFileToServer = async (
  11. file: File,
  12. onProgress?: (progressEvent: any) => void
  13. ): Promise<{url: string, fileName: string}> => {
  14. try {
  15. const formData = new FormData()
  16. formData.append('file', file)
  17. const response = await axios({
  18. url: uploadFile,
  19. method: 'POST',
  20. data: { file },
  21. onUploadProgress: onProgress
  22. })
  23. if (response.code === 0 || response.code === '000000' || response.code === 200) {
  24. return {
  25. url: response.data?.url || response.data,
  26. fileName: file.name
  27. }
  28. } else {
  29. throw new Error(response.msg || '上传失败')
  30. }
  31. } catch (error) {
  32. console.error('文件上传失败:', error)
  33. ElMessage.error('文件上传失败')
  34. throw error
  35. }
  36. }
  37. /**
  38. * 将Canvas转换为Blob对象
  39. * @param canvas - Canvas元素
  40. * @param quality - 图片质量(0-1)
  41. * @param format - 图片格式
  42. * @returns Promise<Blob>
  43. */
  44. export const canvasToBlob = (
  45. canvas: HTMLCanvasElement,
  46. quality: number = 0.8,
  47. format: string = 'image/jpeg'
  48. ): Promise<Blob> => {
  49. return new Promise((resolve, reject) => {
  50. canvas.toBlob(
  51. (blob) => {
  52. if (blob) {
  53. resolve(blob)
  54. } else {
  55. reject(new Error('Canvas转换为Blob失败'))
  56. }
  57. },
  58. format,
  59. quality
  60. )
  61. })
  62. }
  63. /**
  64. * Blob转换为File对象
  65. * @param blob - Blob对象
  66. * @param fileName - 文件名
  67. * @returns File对象
  68. */
  69. export const blobToFile = (blob: Blob, fileName: string): File => {
  70. return new File([blob], fileName, { type: blob.type })
  71. }