@programisto/edrm-storage 1.0.3 → 1.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -7,6 +7,12 @@ export declare class S3StorageProvider implements StorageProvider {
7
7
  constructor(region: string, accessKeyId?: string, secretAccessKey?: string);
8
8
  initUpload(bucket: string, key: string, contentType: string, expiresIn?: number): Promise<UploadInitResponse>;
9
9
  getFileMetadata(bucket: string, key: string): Promise<FileMetadata>;
10
+ /**
11
+ * Encode un nom de fichier pour l'en-tête Content-Disposition selon RFC 6266
12
+ * Gère les caractères spéciaux (accents, etc.) en utilisant l'encodage UTF-8
13
+ * AWS S3 nécessite un encodage strict pour éviter l'erreur "Header value cannot be represented using ISO-8859-1"
14
+ */
15
+ private encodeContentDispositionFilename;
10
16
  getDownloadUrl(bucket: string, key: string, filename?: string, expiresIn?: number): Promise<DownloadUrlResponse>;
11
17
  deleteFile(bucket: string, key: string): Promise<void>;
12
18
  copyFile(sourceBucket: string, sourceKey: string, destBucket: string, destKey: string): Promise<void>;
@@ -48,11 +48,34 @@ export class S3StorageProvider {
48
48
  metadata: response.Metadata
49
49
  };
50
50
  }
51
+ /**
52
+ * Encode un nom de fichier pour l'en-tête Content-Disposition selon RFC 6266
53
+ * Gère les caractères spéciaux (accents, etc.) en utilisant l'encodage UTF-8
54
+ * AWS S3 nécessite un encodage strict pour éviter l'erreur "Header value cannot be represented using ISO-8859-1"
55
+ */
56
+ encodeContentDispositionFilename(filename) {
57
+ // Vérifier si le nom de fichier contient des caractères non-ASCII
58
+ const hasNonAscii = /[^\x20-\x7E]/.test(filename);
59
+ if (hasNonAscii) {
60
+ // Pour les noms avec caractères non-ASCII, utiliser uniquement filename* avec UTF-8
61
+ // Cela évite les problèmes avec S3 qui rejette les caractères non-ASCII dans filename
62
+ const encodedFilename = encodeURIComponent(filename)
63
+ .replace(/'/g, '%27')
64
+ .replace(/\(/g, '%28')
65
+ .replace(/\)/g, '%29');
66
+ // Format RFC 6266 : utiliser uniquement filename* pour éviter les erreurs S3
67
+ return `attachment; filename*=UTF-8''${encodedFilename}`;
68
+ }
69
+ else {
70
+ // Pour les noms ASCII uniquement, utiliser le format simple
71
+ return `attachment; filename="${filename}"`;
72
+ }
73
+ }
51
74
  async getDownloadUrl(bucket, key, filename, expiresIn = 3600) {
52
75
  const command = new GetObjectCommand({
53
76
  Bucket: bucket,
54
77
  Key: key,
55
- ResponseContentDisposition: filename ? `attachment; filename="${filename}"` : undefined
78
+ ResponseContentDisposition: filename ? this.encodeContentDispositionFilename(filename) : undefined
56
79
  });
57
80
  const url = await getSignedUrl(this.client, command, {
58
81
  expiresIn
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "type": "module",
3
3
  "name": "@programisto/edrm-storage",
4
- "version": "1.0.3",
4
+ "version": "1.0.4",
5
5
  "publishConfig": {
6
6
  "access": "public"
7
7
  },