FilesService.ts 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. import type { HttpContextContract } from '@ioc:Adonis/Core/HttpContext'
  2. import Drive from '@ioc:Adonis/Core/Drive'
  3. import OSS from 'ali-oss'
  4. import Env from '@ioc:Adonis/Core/Env'
  5. import * as console from 'node:console'
  6. class FilesService {
  7. private client: OSS
  8. constructor() {
  9. this.client = new OSS({
  10. region: Env.get('OSS_REGION'),
  11. accessKeyId: Env.get('OSS_KEY'),
  12. accessKeySecret: Env.get('OSS_SECRET'),
  13. bucket: Env.get('OSS_BUCKET')
  14. })
  15. }
  16. public async generateThumbnailUrl(
  17. filePath: string,
  18. width: number = 300,
  19. expires: number = 600
  20. ): Promise<string> {
  21. try {
  22. // const exists = await Drive.exists(filePath)
  23. // if (!exists) {
  24. // throw new Error('文件不存在')
  25. // }
  26. return this.client.signatureUrl(filePath, {
  27. expires,
  28. process: `image/resize,w_${width}`
  29. })
  30. } catch (error) {
  31. throw new Error(`生成缩略图URL失败: ${error.message}`)
  32. }
  33. }
  34. public async batchDelete(filePaths: string[]) {
  35. if (!Array.isArray(filePaths) || filePaths.length === 0) {
  36. throw new Error('请提供要删除的文件路径数组')
  37. }
  38. const results = {
  39. success: [] as string[],
  40. failed: [] as { path: string; error: string }[]
  41. }
  42. // 删除
  43. for (const filePath of filePaths) {
  44. try {
  45. const exists = await Drive.exists(filePath)
  46. if (!exists) {
  47. results.failed.push({
  48. path: filePath,
  49. error: '文件不存在'
  50. })
  51. continue
  52. }
  53. await Drive.delete(filePath)
  54. results.success.push(filePath)
  55. } catch (error) {
  56. results.failed.push({
  57. path: filePath,
  58. error: error.message || '删除失败'
  59. })
  60. }
  61. }
  62. return results
  63. }
  64. }
  65. export default new FilesService()