国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

Heim Web-Frontend js-Tutorial Optimierung gro?er Datei-Uploads: Sichere clientseitige mehrteilige Uploads auf AWS S3

Optimierung gro?er Datei-Uploads: Sichere clientseitige mehrteilige Uploads auf AWS S3

Nov 08, 2024 am 07:22 AM

Das Hochladen gro?er Dateien in die Cloud kann eine Herausforderung sein – Netzwerkunterbrechungen, Browsereinschr?nkungen und gro?e Dateigr??en k?nnen den Prozess leicht st?ren. Amazon S3 (Simple Storage Service) ist ein skalierbarer, webbasierter Hochgeschwindigkeits-Cloud-Speicherdienst, der für die Online-Sicherung und Archivierung von Daten und Anwendungen entwickelt wurde. Das Hochladen gro?er Dateien auf S3 erfordert jedoch eine sorgf?ltige Handhabung, um Zuverl?ssigkeit und Leistung sicherzustellen.

Nutzen Sie den mehrteiligen Upload von AWS S3: eine leistungsstarke L?sung, die gro?e Dateien in kleinere Teile aufteilt und so schnellere und zuverl?ssigere Uploads erm?glicht, indem sie jeden Teil unabh?ngig angeht und Teile sogar parallel hochl?dt. Diese Methode überwindet nicht nur Dateigr??enbeschr?nkungen (S3 erfordert einen mehrteiligen Upload für Dateien, die gr??er als 5 GB sind), sondern minimiert auch das Fehlerrisiko und eignet sich daher perfekt für Anwendungen, die nahtlose, robuste Datei-Uploads ben?tigen.

In diesem Leitfaden erl?utern wir die Besonderheiten clientseitiger Multipart-Uploads auf S3 und zeigen Ihnen, warum es die kluge Wahl für den Umgang mit gro?en Dateien ist, wie Sie es sicher zum Laufen bringen und welche Herausforderungen Sie im Auge behalten müssen raus für. Ich stelle Schritt-für-Schritt-Anleitungen, Codebeispiele und Best Practices zur Verfügung, um Sie bei der Implementierung einer zuverl?ssigen clientseitigen Datei-Upload-L?sung zu unterstützen.

Sind Sie bereit, Ihr Datei-Upload-Erlebnis zu verbessern? Lasst uns eintauchen!

Server- vs. clientseitige Uploads

Beim Entwerfen eines Datei-Upload-Systems haben Sie zwei Hauptoptionen: Hochladen von Dateien über Ihren Server (serverseitig) oder Hochladen von Dateien direkt vom Client auf S3 (clientseitig). Jeder Ansatz hat seine Vor- und Nachteile.

Serverseitige Uploads

Optimizing Large File Uploads: Secure Client-Side Multipart Uploads to AWS S3

Vorteile:

  • Erh?hte Sicherheit: Alle Uploads werden vom Server verwaltet, sodass die AWS-Anmeldeinformationen sicher bleiben.

  • Bessere Fehlerbehandlung: Server k?nnen Wiederholungsversuche, Protokollierung und Fehlerbehandlung robuster verwalten.

  • Zentralisierte Verarbeitung: Dateien k?nnen auf dem Server validiert, verarbeitet oder konvertiert werden, bevor sie in S3 gespeichert werden.

Nachteile:

  • H?here Serverlast: Gro?e Uploads verbrauchen Serverressourcen (CPU, Speicher, Bandbreite), was sich auf die Leistung auswirken und die Betriebskosten erh?hen kann.

  • Potenzielle Engp?sse: Der Server kann bei hohem Upload-Verkehr zu einem Single Point of Failure oder einem Leistungsengpass werden, was zu langsamen Uploads oder Ausfallzeiten führt.

  • Erh?hte Kosten: Die serverseitige Bearbeitung von Uploads erfordert m?glicherweise eine Skalierung Ihrer Infrastruktur, um Spitzenlasten zu bew?ltigen, was zu h?heren Betriebskosten führt.

Clientseitige Uploads

Optimizing Large File Uploads: Secure Client-Side Multipart Uploads to AWS S3

Vorteile:

  • Reduzierte Serverlast: Dateien werden direkt vom Ger?t des Benutzers an S3 gesendet, wodurch Serverressourcen freigegeben werden.

  • Verbesserte Geschwindigkeit: Benutzer erleben schnellere Uploads, da sie den Anwendungsserver umgehen.

  • Kosteneffizienz: Macht eine Serverinfrastruktur zur Verarbeitung gro?er Uploads überflüssig und senkt m?glicherweise die Kosten.

  • Skalierbarkeit: Ideal zum Skalieren von Datei-Uploads, ohne Backend-Server zu belasten.

Nachteile:

  • Sicherheitsrisiken: Erfordert einen sorgf?ltigen Umgang mit AWS-Anmeldeinformationen und -Berechtigungen. Vorsignierte URLs müssen sicher generiert werden, um unbefugten Zugriff zu verhindern.

  • Eingeschr?nkte Kontrolle: Weniger serverseitige Kontrolle über Uploads; Fehlerbehandlung und Wiederholungsversuche werden oft auf dem Client verwaltet.

  • Browsereinschr?nkungen: Browser haben Speicher- und API-Einschr?nkungen, die die Verarbeitung sehr gro?er Dateien behindern oder die Leistung auf Ger?ten der unteren Preisklasse beeintr?chtigen k?nnen.

Schritt-für-Schritt-Anleitung zur Implementierung sicherer clientseitiger Uploads

Die sichere Implementierung clientseitiger Uploads erfordert die Koordination zwischen Ihrer Frontend-Anwendung und einem sicheren Backend-Dienst. Die Hauptaufgabe des Backend-Dienstes besteht darin, vorsignierte URLs zu generieren, die es dem Client erm?glichen, Dateien direkt auf S3 hochzuladen, ohne vertrauliche AWS-Anmeldeinformationen preiszugeben.

Voraussetzungen

  • AWS-Konto: Zugriff auf ein AWS-Konto mit Berechtigungen zur Verwendung von S3.
  • AWS SDK-Kenntnisse: Vertrautheit mit dem AWS SDK für JavaScript (v3) oder dem Durchführen direkter API-Aufrufe an AWS-Dienste.
  • Frontend- und Backend-Entwicklungsf?higkeiten: Verst?ndnis sowohl der clientseitigen (JavaScript, React usw.) als auch der serverseitigen (Node.js, Express usw.) Programmierung.

1. Einrichten der richtigen Architektur

Um clientseitige Uploads effektiv zu implementieren, ben?tigen Sie:

  • Frontend-Anwendung: Verwaltet die Dateiauswahl, teilt Dateien bei Bedarf in Teile auf und l?dt Teile mithilfe vorsignierter URLs in S3 hoch.
  • Backend-Dienst: Ein sicherer Server, der APIs zum Generieren vorsignierter URLs und zum Initialisieren oder Abschlie?en mehrteiliger Uploads bereitstellt. Es schützt Ihre AWS-Anmeldeinformationen und erzwingt alle erforderlichen Gesch?ftslogiken oder Validierungen.

Diese Architektur stellt sicher, dass sensible Vorg?nge sicher im Backend abgewickelt werden, w?hrend das Frontend den Upload-Prozess verwaltet.

2. Erstellen des Upload-Dienstes im Backend

Warum vorsignierte URLs verwenden?

Vordefinierte URLs erm?glichen es Clients, direkt mit S3 zu interagieren und Vorg?nge wie das Hochladen von Dateien auszuführen, ohne dass AWS-Anmeldeinformationen auf der Clientseite erforderlich sind. Sie sind sicher, weil:

  • Sie sind zeitlich begrenzt und verfallen nach einer bestimmten Dauer.
  • Sie k?nnen auf bestimmte Vorg?nge beschr?nkt werden (z. B. PUT zum Hochladen).
  • Sie sind spezifisch für einen bestimmten S3-Objektschlüssel.

Implementierung des S3UploadService

Erstellen Sie auf Ihrem Server eine Serviceklasse, die verantwortlich ist für:

a. Definieren des S3-Buckets und der Region
B. AWS-Anmeldeinformationen sicher einrichten.
C. Bereitstellung von Methoden zum Generieren vorsignierter URLs und zum Verwalten mehrteiliger Uploads.

// services/S3UploadService.js

import {
  S3Client,
  CreateMultipartUploadCommand,
  CompleteMultipartUploadCommand,
  UploadPartCommand,
  AbortMultipartUploadCommand,
  PutObjectCommand,
  GetObjectCommand,
  DeleteObjectCommand,
} from '@aws-sdk/client-s3';
import { getSignedUrl } from '@aws-sdk/s3-request-presigner';

// Import credential providers
import {
  fromIni,
  fromInstanceMetadata,
  fromEnv,
  fromProcess,
} from '@aws-sdk/credential-providers';

export class S3UploadService {
  constructor() {
    this.s3BucketName = process.env.S3_BUCKET_NAME;
    this.s3Region = process.env.S3_REGION;

    this.s3Client = new S3Client({
      region: this.s3Region,
      credentials: this.getS3ClientCredentials(),
    });
  }

  // Method to generate AWS credentials securely
  getS3ClientCredentials() {
    if (process.env.NODE_ENV === 'development') {
      // In development, use credentials from environment variables
      return fromEnv();
    } else {
      // In production, use credentials from EC2 instance metadata or another secure method
      return fromInstanceMetadata();
    }
  }

  // Generate a presigned URL for single-part upload (PUT), download (GET), or deletion (DELETE)
  async generatePresignedUrl(key, operation) {
    let command;
    switch (operation) {
      case 'PUT':
        command = new PutObjectCommand({
          Bucket: this.s3BucketName,
          Key: key,
        });
        break;
      case 'GET':
        command = new GetObjectCommand({
          Bucket: this.s3BucketName,
          Key: key,
        });
        break;
      case 'DELETE':
        command = new DeleteObjectCommand({
          Bucket: this.s3BucketName,
          Key: key,
        });
        break;
      default:
        throw new Error(`Invalid operation "${operation}"`);
    }

    // Generate presigned URL
    return await getSignedUrl(this.s3Client, command, { expiresIn: 3600 }); // Expires in 1 hour
  }

  // Methods for multipart upload
  async createMultipartUpload(key) {
    const command = new CreateMultipartUploadCommand({
      Bucket: this.s3BucketName,
      Key: key,
    });
    const response = await this.s3Client.send(command);
    return response.UploadId;
  }

  async generateUploadPartUrl(key, uploadId, partNumber) {
    const command = new UploadPartCommand({
      Bucket: this.s3BucketName,
      Key: key,
      UploadId: uploadId,
      PartNumber: partNumber,
    });

    return await getSignedUrl(this.s3Client, command, { expiresIn: 3600 });
  }

  async completeMultipartUpload(key, uploadId, parts) {
    const command = new CompleteMultipartUploadCommand({
      Bucket: this.s3BucketName,
      Key: key,
      UploadId: uploadId,
      MultipartUpload: { Parts: parts },
    });
    return await this.s3Client.send(command);
  }

  async abortMultipartUpload(key, uploadId) {
    const command = new AbortMultipartUploadCommand({
      Bucket: this.s3BucketName,
      Key: key,
      UploadId: uploadId,
    });
    return await this.s3Client.send(command);
  }
}

Hinweis: Stellen Sie sicher, dass Ihre AWS-Anmeldeinformationen sicher verwaltet werden. In der Produktion wird empfohlen, IAM-Rollen zu verwenden, die Ihren EC2-Instanzen oder ECS-Aufgaben zugeordnet sind, anstatt Anmeldeinformationen fest zu codieren oder Umgebungsvariablen zu verwenden.

3. Implementierung der Backend-API-Endpunkte

Erstellen Sie API-Endpunkte in Ihrem Backend, um Anfragen vom Frontend zu verarbeiten. Diese Endpunkte nutzen den S3UploadService, um Aktionen auszuführen.

// controllers/S3UploadController.js

import { S3UploadService } from '../services/S3UploadService';

const s3UploadService = new S3UploadService();

export const generatePresignedUrl = async (req, res, next) => {
  try {
    const { key, operation } = req.body; // key is the S3 object key (file identifier)
    const url = await s3UploadService.generatePresignedUrl(key, operation);
    res.status(200).json({ url });
  } catch (error) {
    next(error);
  }
};

export const initializeMultipartUpload = async (req, res, next) => {
  try {
    const { key } = req.body;
    const uploadId = await s3UploadService.createMultipartUpload(key);
    res.status(200).json({ uploadId });
  } catch (error) {
    next(error);
  }
};

export const generateUploadPartUrls = async (req, res, next) => {
  try {
    const { key, uploadId, parts } = req.body; // parts is the number of parts
    const urls = await Promise.all(
      [...Array(parts).keys()].map(async (index) => {
        const partNumber = index + 1;
        const url = await s3UploadService.generateUploadPartUrl(key, uploadId, partNumber);
        return { partNumber, url };
      })
    );
    res.status(200).json({ urls });
  } catch (error) {
    next(error);
  }
};

export const completeMultipartUpload = async (req, res, next) => {
  try {
    const { key, uploadId, parts } = req.body; // parts is an array of { ETag, PartNumber }
    const result = await s3UploadService.completeMultipartUpload(key, uploadId, parts);
    res.status(200).json({ result });
  } catch (error) {
    next(error);
  }
};

export const abortMultipartUpload = async (req, res, next) => {
  try {
    const { key, uploadId } = req.body;
    await s3UploadService.abortMultipartUpload(key, uploadId);
    res.status(200).json({ message: 'Upload aborted' });
  } catch (error) {
    next(error);
  }
};

Richten Sie die Routen für diese Endpunkte in Ihrer Express-App oder dem von Ihnen verwendeten Framework ein.

4. Implementierung der Frontend-Uploader-Klasse

Das Frontend übernimmt die Auswahl der Dateien, entscheidet anhand der Dateigr??e, ob ein einteiliger oder mehrteiliger Upload durchgeführt werden soll, und verwaltet den Upload-Prozess.

Im Allgemeinen empfiehlt AWS: ?Wenn Ihre Objektgr??e 100 MB erreicht, sollten Sie mehrteilige Uploads in Betracht ziehen, anstatt das Objekt in einem einzigen Vorgang hochzuladen.“ Quelle

// services/S3UploadService.js

import {
  S3Client,
  CreateMultipartUploadCommand,
  CompleteMultipartUploadCommand,
  UploadPartCommand,
  AbortMultipartUploadCommand,
  PutObjectCommand,
  GetObjectCommand,
  DeleteObjectCommand,
} from '@aws-sdk/client-s3';
import { getSignedUrl } from '@aws-sdk/s3-request-presigner';

// Import credential providers
import {
  fromIni,
  fromInstanceMetadata,
  fromEnv,
  fromProcess,
} from '@aws-sdk/credential-providers';

export class S3UploadService {
  constructor() {
    this.s3BucketName = process.env.S3_BUCKET_NAME;
    this.s3Region = process.env.S3_REGION;

    this.s3Client = new S3Client({
      region: this.s3Region,
      credentials: this.getS3ClientCredentials(),
    });
  }

  // Method to generate AWS credentials securely
  getS3ClientCredentials() {
    if (process.env.NODE_ENV === 'development') {
      // In development, use credentials from environment variables
      return fromEnv();
    } else {
      // In production, use credentials from EC2 instance metadata or another secure method
      return fromInstanceMetadata();
    }
  }

  // Generate a presigned URL for single-part upload (PUT), download (GET), or deletion (DELETE)
  async generatePresignedUrl(key, operation) {
    let command;
    switch (operation) {
      case 'PUT':
        command = new PutObjectCommand({
          Bucket: this.s3BucketName,
          Key: key,
        });
        break;
      case 'GET':
        command = new GetObjectCommand({
          Bucket: this.s3BucketName,
          Key: key,
        });
        break;
      case 'DELETE':
        command = new DeleteObjectCommand({
          Bucket: this.s3BucketName,
          Key: key,
        });
        break;
      default:
        throw new Error(`Invalid operation "${operation}"`);
    }

    // Generate presigned URL
    return await getSignedUrl(this.s3Client, command, { expiresIn: 3600 }); // Expires in 1 hour
  }

  // Methods for multipart upload
  async createMultipartUpload(key) {
    const command = new CreateMultipartUploadCommand({
      Bucket: this.s3BucketName,
      Key: key,
    });
    const response = await this.s3Client.send(command);
    return response.UploadId;
  }

  async generateUploadPartUrl(key, uploadId, partNumber) {
    const command = new UploadPartCommand({
      Bucket: this.s3BucketName,
      Key: key,
      UploadId: uploadId,
      PartNumber: partNumber,
    });

    return await getSignedUrl(this.s3Client, command, { expiresIn: 3600 });
  }

  async completeMultipartUpload(key, uploadId, parts) {
    const command = new CompleteMultipartUploadCommand({
      Bucket: this.s3BucketName,
      Key: key,
      UploadId: uploadId,
      MultipartUpload: { Parts: parts },
    });
    return await this.s3Client.send(command);
  }

  async abortMultipartUpload(key, uploadId) {
    const command = new AbortMultipartUploadCommand({
      Bucket: this.s3BucketName,
      Key: key,
      UploadId: uploadId,
    });
    return await this.s3Client.send(command);
  }
}

Anwendungsbeispiel

// controllers/S3UploadController.js

import { S3UploadService } from '../services/S3UploadService';

const s3UploadService = new S3UploadService();

export const generatePresignedUrl = async (req, res, next) => {
  try {
    const { key, operation } = req.body; // key is the S3 object key (file identifier)
    const url = await s3UploadService.generatePresignedUrl(key, operation);
    res.status(200).json({ url });
  } catch (error) {
    next(error);
  }
};

export const initializeMultipartUpload = async (req, res, next) => {
  try {
    const { key } = req.body;
    const uploadId = await s3UploadService.createMultipartUpload(key);
    res.status(200).json({ uploadId });
  } catch (error) {
    next(error);
  }
};

export const generateUploadPartUrls = async (req, res, next) => {
  try {
    const { key, uploadId, parts } = req.body; // parts is the number of parts
    const urls = await Promise.all(
      [...Array(parts).keys()].map(async (index) => {
        const partNumber = index + 1;
        const url = await s3UploadService.generateUploadPartUrl(key, uploadId, partNumber);
        return { partNumber, url };
      })
    );
    res.status(200).json({ urls });
  } catch (error) {
    next(error);
  }
};

export const completeMultipartUpload = async (req, res, next) => {
  try {
    const { key, uploadId, parts } = req.body; // parts is an array of { ETag, PartNumber }
    const result = await s3UploadService.completeMultipartUpload(key, uploadId, parts);
    res.status(200).json({ result });
  } catch (error) {
    next(error);
  }
};

export const abortMultipartUpload = async (req, res, next) => {
  try {
    const { key, uploadId } = req.body;
    await s3UploadService.abortMultipartUpload(key, uploadId);
    res.status(200).json({ message: 'Upload aborted' });
  } catch (error) {
    next(error);
  }
};

5. Sicherheitsüberlegungen und Best Practices

  • Vorsignierte URL-Berechtigungen einschr?nken: Stellen Sie sicher, dass vorsignierte URLs nur die erforderlichen Berechtigungen gew?hren (z. B. nur PUT-Vorg?nge für Uploads zulassen).
  • Geeignete Ablaufzeiten festlegen: Vorsignierte URLs sollten nach einer angemessenen Zeit (z. B. 15 Minuten bis 1 Stunde) ablaufen, um das Zeitfenster für Missbrauch zu minimieren.
  • Dateimetadaten validieren: Validieren Sie im Backend alle vom Client gesendeten Metadaten oder Parameter, um Manipulationen zu verhindern (z. B. Erzwingen zul?ssiger Dateitypen oder -gr??en).
  • HTTPS verwenden: Verwenden Sie immer HTTPS für die Kommunikation zwischen dem Client und Ihrem Backend und beim Zugriff auf S3, um Daten w?hrend der übertragung zu schützen.
  • überwachen und protokollieren: Implementieren Sie Protokollierung und überwachung sowohl im Backend als auch in S3, um ungew?hnliche Aktivit?ten oder Fehler zu erkennen.

6. Zus?tzliche überlegungen

Begrenzung der Objektgr??e

W?hrend AWS S3 Objekte mit einer Gr??e von bis zu 5 TiB (Terabyte) unterstützt, ist das Hochladen solch gro?er Dateien direkt aus einem Browser aufgrund von Browserbeschr?nkungen und clientseitigen Ressourcenbeschr?nkungen unpraktisch und oft unm?glich. Browser k?nnen abstürzen oder nicht mehr reagieren, wenn sie extrem gro?e Dateien verarbeiten, insbesondere wenn sie im Speicher verarbeitet werden müssen.

Empfehlung:
  • Praktische Grenzen festlegen: Definieren Sie eine maximale Dateigr??e, die Ihre Anwendung für clientseitige Uploads unterstützt (z. B. 100 GB oder weniger).
  • Benutzer informieren: Geben Sie den Benutzern Feedback zur maximal zul?ssigen Dateigr??e und führen Sie die Validierung auf der Clientseite durch, bevor Sie den Upload starten.

Wiederholungsstrategie

Das Hochladen gro?er Dateien erh?ht das Risiko von Netzwerkunterbrechungen oder Ausf?llen w?hrend des Upload-Vorgangs. Die Implementierung einer robusten Wiederholungsstrategie ist entscheidend, um das Benutzererlebnis zu verbessern und erfolgreiche Uploads sicherzustellen.

Strategien
  • Automatische Wiederholungsversuche: Fehlgeschlagene Teile automatisch eine begrenzte Anzahl von Malen wiederholen, bevor der Benutzer dazu aufgefordert wird.
  • Fortsetzbare Uploads: Behalten Sie den überblick über hochgeladene Teile, damit der Upload dort fortgesetzt werden kann, wo er aufgeh?rt hat, anstatt von vorne zu beginnen.
  • Fehlerbehandlung: Stellen Sie dem Benutzer informative Fehlermeldungen zur Verfügung, wenn Wiederholungsversuche fehlschlagen, und schlagen Sie m?glicherweise Aktionen wie die überprüfung seiner Netzwerkverbindung vor.

Mehrteilige Upload-Bereinigung

Unvollst?ndige mehrteilige Uploads k?nnen sich in Ihrem S3-Bucket ansammeln, Speicherplatz verbrauchen und m?glicherweise Kosten verursachen.

überlegungen
  • Unvollendete Uploads abbrechen: Wenn ein Upload fehlschl?gt oder abgebrochen wird, stellen Sie sicher, dass Ihre Anwendung die AbortMultipartUpload-API aufruft, um alle hochgeladenen Teile zu bereinigen.
  • Lebenszyklusregeln: Konfigurieren Sie S3-Lebenszyklusrichtlinien, um unvollst?ndige mehrteilige Uploads nach einem bestimmten Zeitraum (z. B. 7 Tage) automatisch abzubrechen. Dies hilft bei der Verwaltung der Lagerkosten und h?lt Ihren Eimer sauber.

Beispiel für die Konfiguration einer Lebenszyklusregel:

// services/S3UploadService.js

import {
  S3Client,
  CreateMultipartUploadCommand,
  CompleteMultipartUploadCommand,
  UploadPartCommand,
  AbortMultipartUploadCommand,
  PutObjectCommand,
  GetObjectCommand,
  DeleteObjectCommand,
} from '@aws-sdk/client-s3';
import { getSignedUrl } from '@aws-sdk/s3-request-presigner';

// Import credential providers
import {
  fromIni,
  fromInstanceMetadata,
  fromEnv,
  fromProcess,
} from '@aws-sdk/credential-providers';

export class S3UploadService {
  constructor() {
    this.s3BucketName = process.env.S3_BUCKET_NAME;
    this.s3Region = process.env.S3_REGION;

    this.s3Client = new S3Client({
      region: this.s3Region,
      credentials: this.getS3ClientCredentials(),
    });
  }

  // Method to generate AWS credentials securely
  getS3ClientCredentials() {
    if (process.env.NODE_ENV === 'development') {
      // In development, use credentials from environment variables
      return fromEnv();
    } else {
      // In production, use credentials from EC2 instance metadata or another secure method
      return fromInstanceMetadata();
    }
  }

  // Generate a presigned URL for single-part upload (PUT), download (GET), or deletion (DELETE)
  async generatePresignedUrl(key, operation) {
    let command;
    switch (operation) {
      case 'PUT':
        command = new PutObjectCommand({
          Bucket: this.s3BucketName,
          Key: key,
        });
        break;
      case 'GET':
        command = new GetObjectCommand({
          Bucket: this.s3BucketName,
          Key: key,
        });
        break;
      case 'DELETE':
        command = new DeleteObjectCommand({
          Bucket: this.s3BucketName,
          Key: key,
        });
        break;
      default:
        throw new Error(`Invalid operation "${operation}"`);
    }

    // Generate presigned URL
    return await getSignedUrl(this.s3Client, command, { expiresIn: 3600 }); // Expires in 1 hour
  }

  // Methods for multipart upload
  async createMultipartUpload(key) {
    const command = new CreateMultipartUploadCommand({
      Bucket: this.s3BucketName,
      Key: key,
    });
    const response = await this.s3Client.send(command);
    return response.UploadId;
  }

  async generateUploadPartUrl(key, uploadId, partNumber) {
    const command = new UploadPartCommand({
      Bucket: this.s3BucketName,
      Key: key,
      UploadId: uploadId,
      PartNumber: partNumber,
    });

    return await getSignedUrl(this.s3Client, command, { expiresIn: 3600 });
  }

  async completeMultipartUpload(key, uploadId, parts) {
    const command = new CompleteMultipartUploadCommand({
      Bucket: this.s3BucketName,
      Key: key,
      UploadId: uploadId,
      MultipartUpload: { Parts: parts },
    });
    return await this.s3Client.send(command);
  }

  async abortMultipartUpload(key, uploadId) {
    const command = new AbortMultipartUploadCommand({
      Bucket: this.s3BucketName,
      Key: key,
      UploadId: uploadId,
    });
    return await this.s3Client.send(command);
  }
}

Umgang mit mehrteiligen Uploads au?erhalb des Hauptthreads

Das Hochladen gro?er Dateien kann ressourcenintensiv sein und dazu führen, dass der Hauptthread des Browsers nicht mehr reagiert, was zu einer schlechten Benutzererfahrung führt.

L?sung:
  • Web Worker verwenden: Verlagern Sie den Upload-Prozess auf einen Web Worker. Web Worker werden im Hintergrund ausgeführt, getrennt vom Hauptausführungsthread der Webanwendung, sodass Sie ressourcenintensive Vorg?nge ausführen k?nnen, ohne die Benutzeroberfl?che zu blockieren.
Vorteile:
  • Verbesserte Leistung: Macht den Hauptthread frei und stellt sicher, dass die Benutzeroberfl?che w?hrend des Upload-Vorgangs reaktionsf?hig bleibt.
  • Reduzierte Speichernutzung: Hilft bei der effektiveren Speicherverwaltung, da die Verarbeitung gro?er Datenmengen innerhalb des Workers abgewickelt werden kann.
  • Verbesserte Stabilit?t: Reduziert das Risiko, dass der Browser bei gro?en Uploads nicht mehr reagiert oder abstürzt.

7. überlegungen zur Browserkompatibilit?t

Bei der Implementierung clientseitiger mehrteiliger Uploads ist die Browserkompatibilit?t tats?chlich ein Problem. Verschiedene Browser verfügen m?glicherweise über unterschiedliche Unterstützungsstufen für die APIs und Funktionen, die für die Verarbeitung gro?er Datei-Uploads erforderlich sind, wie z. B. die *Datei-API, Blob-Slicing, Web Worker und Netzwerkanfrageverarbeitung* . Die erfolgreiche Bew?ltigung dieser Unterschiede ist entscheidend, um eine konsistente und zuverl?ssige Benutzererfahrung in allen unterstützten Browsern sicherzustellen.

Kompatibilit?tsbedenken:

  • Datei-API und Blob-Methoden: Die meisten modernen Browser unterstützen Blob.slice(), ?ltere Browser verwenden jedoch m?glicherweise Blob.webkitSlice() oder Blob.mozSlice().
  • Web Worker: Wird in modernen Browsern unterstützt, jedoch nicht in einigen ?lteren oder mit Einschr?nkungen im Internet Explorer.
  • Abruf-API und XMLHttpRequest: Obwohl fetch() weithin unterstützt wird, sind Upload-Fortschrittsereignisse mit fetch() nicht in allen Browsern konsistent verfügbar.
  • Maximale gleichzeitige Verbindungen: Begrenzen Sie die Anzahl gleichzeitiger Uploads basierend auf dem kleinsten gemeinsamen Nenner Ihrer unterstützten Browser (z. B. 6 gleichzeitige Verbindungen).
  • Speicherbeschr?nkungen: Verarbeiten Sie Dateien in kleinen Bl?cken und vermeiden Sie, die gesamte Datei auf einmal in den Speicher zu laden.
  • CORS: Konfigurieren Sie S3 CORS-Richtlinien zur Unterstützung der erforderlichen HTTP-Methoden (z. B. PUT, POST) und Header.

Abschluss

Durch die Implementierung clientseitiger Uploads mit vorsignierten URLs und mehrteiligem Upload k?nnen Sie Datei-Uploads jeder Gr??e direkt in S3 effizient verarbeiten, wodurch die Serverlast reduziert und die Leistung verbessert wird. Denken Sie daran, die Sicherheit im Vordergrund zu halten, indem Sie AWS-Anmeldeinformationen sicher verwalten und die Berechtigungen und die Lebensdauer vorsignierter URLs begrenzen.

Diese Anleitung bietet einen schrittweisen Ansatz zum Einrichten eines sicheren und skalierbaren Datei-Upload-Systems mit AWS S3, dem AWS SDK für JavaScript und vorsignierten URLs. Mit den bereitgestellten Codebeispielen und Best Practices sind Sie auf dem besten Weg, die Datei-Upload-Funktionen Ihrer Anwendung zu verbessern.

Das obige ist der detaillierte Inhalt vonOptimierung gro?er Datei-Uploads: Sichere clientseitige mehrteilige Uploads auf AWS S3. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Erkl?rung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Hei?e KI -Werkzeuge

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Clothoff.io

Clothoff.io

KI-Kleiderentferner

Video Face Swap

Video Face Swap

Tauschen Sie Gesichter in jedem Video mühelos mit unserem v?llig kostenlosen KI-Gesichtstausch-Tool aus!

Hei?e Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Hei?e Themen

PHP-Tutorial
1502
276
Wie stelle ich eine HTTP -Anforderung in node.js? Wie stelle ich eine HTTP -Anforderung in node.js? Jul 13, 2025 am 02:18 AM

Es gibt drei g?ngige M?glichkeiten, HTTP-Anforderungen in Node.js zu initiieren: Verwenden Sie integrierte Module, Axios und Knotenfetch. 1. Verwenden Sie das integrierte HTTP/HTTPS-Modul ohne Abh?ngigkeiten, das für grundlegende Szenarien geeignet ist, jedoch eine manuelle Verarbeitung von Datengen?hten und Fehlerüberwachung erfordert, z. 2.Axios ist eine auf Versprechen basierende Bibliothek von Drittanbietern. Es verfügt über eine kurze Syntax und leistungsstarke Funktionen, unterstützt Async/Auseait, automatische JSON -Konvertierung, Interceptor usw. Es wird empfohlen, asynchrone Anforderungsvorg?nge zu vereinfachen. 3.Node-Fetch bietet einen Stil ?hnlich dem Browser-Abruf, basierend auf Versprechen und einfacher Syntax

JavaScript -Datentypen: Primitive VS -Referenz JavaScript -Datentypen: Primitive VS -Referenz Jul 13, 2025 am 02:43 AM

JavaScript -Datentypen sind in primitive Typen und Referenztypen unterteilt. Zu den primitiven Typen geh?ren String, Anzahl, Boolesche, Null, undefiniertes und Symbol. Die Werte sind unver?nderlich und Kopien werden bei der Zuweisung von Werten kopiert, sodass sie sich nicht gegenseitig beeinflussen. Referenztypen wie Objekte, Arrays und Funktionen speichern Speicheradressen, und Variablen, die auf dasselbe Objekt zeigen, wirkt sich gegenseitig aus. Typeof und Instanz k?nnen verwendet werden, um die Typen zu bestimmen, aber auf die historischen Probleme der TypeOfnull zu achten. Das Verst?ndnis dieser beiden Arten von Unterschieden kann dazu beitragen, einen stabileren und zuverl?ssigeren Code zu schreiben.

JavaScript Time Object, jemand erstellt eine EACTEXE, schnellere Website auf Google Chrome usw. JavaScript Time Object, jemand erstellt eine EACTEXE, schnellere Website auf Google Chrome usw. Jul 08, 2025 pm 02:27 PM

Hallo, JavaScript -Entwickler! Willkommen in den JavaScript -Nachrichten dieser Woche! Diese Woche konzentrieren wir uns auf: Oracas Markenstreit mit Deno, neue JavaScript -Zeitobjekte werden von Browsern, Google Chrome -Updates und einigen leistungsstarken Entwickler -Tools unterstützt. Fangen wir an! Der Markenstreit von Oracle mit dem Versuch von Deno Oracle, ein "JavaScript" -Marke zu registrieren, hat Kontroversen verursacht. Ryan Dahl, der Sch?pfer von Node.js und Deno, hat eine Petition zur Absage der Marke eingereicht, und er glaubt, dass JavaScript ein offener Standard ist und nicht von Oracle verwendet werden sollte

Handlingversprechen: Verkettung, Fehlerbehandlung und Versprechenkombinatoren in JavaScript Handlingversprechen: Verkettung, Fehlerbehandlung und Versprechenkombinatoren in JavaScript Jul 08, 2025 am 02:40 AM

Versprechen ist der Kernmechanismus für den Umgang mit asynchronen Operationen in JavaScript. Das Verst?ndnis von Kettenanrufen, Fehlerbehebung und Kombination ist der Schlüssel zum Beherrschen ihrer Anwendungen. 1. Der Kettenaufruf gibt ein neues Versprechen durch .then () zurück, um asynchrone Prozessverkampferung zu realisieren. Jeder. Dann () erh?lt das vorherige Ergebnis und kann einen Wert oder ein Versprechen zurückgeben; 2. Die Fehlerbehandlung sollte .Catch () verwenden, um Ausnahmen zu fangen, um stille Ausf?lle zu vermeiden, und den Standardwert im Fang zurückgeben, um den Prozess fortzusetzen. 3. Combinatoren wie Promise.All () (erfolgreich erfolgreich erfolgreich nach allen Erfolg), Versprechen.Race () (Die erste Fertigstellung wird zurückgegeben) und Versprechen.Allsettled () (Warten auf alle Fertigstellungen)

Was ist die Cache -API und wie wird sie bei Dienstangestellten verwendet? Was ist die Cache -API und wie wird sie bei Dienstangestellten verwendet? Jul 08, 2025 am 02:43 AM

Cacheapi ist ein Tool, das der Browser zur Cache -Netzwerkanfragen bereitstellt, das h?ufig in Verbindung mit dem Servicearbeiter verwendet wird, um die Leistung der Website und die Offline -Erfahrung zu verbessern. 1. Es erm?glicht Entwicklern, Ressourcen wie Skripte, Stilbl?tter, Bilder usw. Zu speichern; 2. Es kann die Cache -Antworten entsprechend den Anfragen übereinstimmen. 3. Es unterstützt das L?schen bestimmter Caches oder das L?schen des gesamten Cache. 4.. Es kann Cache -Priorit?ts- oder Netzwerkpriorit?tsstrategien durch Servicearbeiter implementieren, die sich auf Fetch -Ereignisse anh?ren. 5. Es wird h?ufig für die Offline -Unterstützung verwendet, die wiederholte Zugriffsgeschwindigkeit, die Vorspannungs -Schlüsselressourcen und den Inhalt des Hintergrundaktualisierungss beschleunigen. 6. Wenn Sie es verwenden, müssen Sie auf die Cache -Versionskontrolle, Speicherbeschr?nkungen und den Unterschied zum HTTP -Caching -Mechanismus achten.

JS Roundup: Ein tiefes Eintauchen in die JavaScript -Ereignisschleife JS Roundup: Ein tiefes Eintauchen in die JavaScript -Ereignisschleife Jul 08, 2025 am 02:24 AM

Die Ereignisschleife von JavaScript verwaltet asynchrone Vorg?nge, indem sie Call -Stapel, Webapis und Task -Warteschlangen koordinieren. 1. Der Anrufstack führt synchronen Code aus, und wenn er auf asynchrone Aufgaben begegnet, wird er zur Verarbeitung an Webapi übergeben. 2. Nachdem das Webapi die Aufgabe im Hintergrund abgeschlossen hat, wird der Rückruf in die entsprechende Warteschlange (Makroaufgabe oder Micro -Aufgabe) eingebaut. 3. Die Ereignisschleife prüft, ob der Anrufstapel leer ist. Wenn es leer ist, wird der Rückruf aus der Warteschlange herausgenommen und zur Ausführung in den Anrufstapel geschoben. V. 5. Das Verst?ndnis der Ereignisschleife hilft zu vermeiden, den Haupt -Thread zu blockieren und die Codeausführungsreihenfolge zu optimieren.

Ereignis verstehen und in JavaScript DOM -Ereignissen sprudeln und erfassen Ereignis verstehen und in JavaScript DOM -Ereignissen sprudeln und erfassen Jul 08, 2025 am 02:36 AM

Ereignisblasen verbreiten sich vom Zielelement nach au?en zum Vorfahrknoten aus, w?hrend Ereignisfassungen sich von der ?u?eren Schicht nach innen zum Zielelement ausbreiten. 1. Ereignisblasen: Nach dem Klicken auf das untergeordnete Element l?st das Ereignis den H?rer des übergeordneten Elements nach oben aus. Nach dem Klicken auf die Schaltfl?che gibt es beispielsweise zuerst die untergeordnete und dann entzündete Eltern aus. 2. Ereigniserfassung: Stellen Sie den dritten Parameter auf True ein, so dass der H?rer in der Erfassungsstufe ausgeführt wird, z. B. das Ausl?sen des Capture -Listeners des übergeordneten Elements, bevor Sie auf die Schaltfl?che klicken. 3. Praktische Verwendungszwecke umfassen ein einheitliches Management von Ereignissen für Kinderelemente, Vorverarbeitung und Leistungsoptimierung von Abfangen. V.

Eine JS-Zusammenfassung von Funktionen h?herer Ordnung jenseits der Karte und des Filters Eine JS-Zusammenfassung von Funktionen h?herer Ordnung jenseits der Karte und des Filters Jul 10, 2025 am 11:41 AM

In JavaScript -Arrays gibt es zus?tzlich zu MAP und Filter andere leistungsstarke und selten verwendete Methoden. 1. Reduzierung kann nicht nur summieren, sondern auch z?hlen, gruppen, flach Arrays ab und bauen neue Strukturen auf. 2. FindingIndex werden verwendet, um einzelne Elemente oder Indizes zu finden. 3. Einige und alles werden verwendet, um festzustellen, ob Bedingungen bestehen oder sich alle treffen. 4. SORT kann sortiert werden, wechselt aber das ursprüngliche Array. 5. Achten Sie darauf, das Array zu kopieren, wenn Sie es verwenden, um Nebenwirkungen zu vermeiden. Diese Methoden machen den Code pr?gnanter und effizienter.

See all articles