Envoi de fichiers volumineux

Pris en charge par

TsgcWebSocketHTTPServer

TsgcWebSocketServer_HTTPAPI

Lorsqu'un client HTTP envoie un flux multipart/form-data, ce flux est sauvegardé par le serveur en mémoire. Lorsque les fichiers sont volumineux, le serveur peut rencontrer une exception de type mémoire insuffisante. Pour éviter ces exceptions, le serveur dispose d'une propriété appelée HTTPUploadFiles qui permet de configurer la manière dont les flux POST sont traités : en mémoire ou sous forme de flux fichier. Si les flux sont traités comme des flux fichier, les flux reçus sont stockés directement sur le disque dur, ce qui évite les problèmes de mémoire.

Pour configurer votre serveur afin de sauvegarder les flux multipart/form-data en tant que flux fichier, suivez les étapes suivantes :

1. Définissez la propriété HTTPUploadFiles.StreamType = pstFileStream. Avec cette configuration, le serveur stockera ces flux sur le disque dur.

2. Vous pouvez configurer la taille minimale en octets à partir de laquelle les fichiers seront stockés en tant que flux fichier. Par défaut, la valeur est zéro, ce qui signifie que tous les flux seront stockés en tant que flux fichier.

3. Le dossier dans lequel les flux sont stockés est défini via SaveDirectory ; s'il n'est pas renseigné, ils seront stockés dans le même dossier que l'application.

4. Lorsqu'un client envoie un multipart/form-data, le contenu est encodé à l'intérieur de délimiteurs (boundaries) ; si la propriété RemoveBoundaries est activée, le contenu des délimiteurs sera extrait automatiquement une fois le flux complet reçu.

Exemple de code

Créez d'abord une nouvelle instance du serveur et configurez les flux pour qu'ils soient sauvegardés en tant que flux fichier.


oServer := TsgcWebSocketHTTPServer.Create(nil);
oServer.Port := 5555;
oServer.HTTPUploadFiles.StreamType := pstFileStream;
oServer.Active := True;

Créez ensuite un nouveau fichier HTML avec la configuration suivante

<html>

<head><title>sgcWebSockets - Upload Big File</title></head>

<body>

<form action="http://127.0.0.1:5555/file" method="post" enctype="multipart/form-data" accept-charset="UTF-8">

<input type="file" name="file_1" />

<input type="submit" />

</form>

</body>

</html>

Ouvrez enfin le fichier HTML dans un navigateur web et envoyez un fichier au serveur. Le serveur créera un nouveau flux fichier avec l'extension ".sgc_ps" et, une fois le flux entièrement reçu, il extraira le fichier des délimiteurs.

Événements

Il existe 2 événements qui peuvent être utilisés pour personnaliser le flux de téléversement de fichiers (nécessite que la propriété HTTPUploadFiles.RemoveBoundaries soit activée)

OnHTTPUploadBeforeSaveFile

Cet événement est déclenché AVANT la sauvegarde du fichier et permet de personnaliser le nom du fichier reçu.


procedure OnHTTPUploadBeforeSaveFileEvent(Sender: TObject; var aFileName: string; var aFilePath: string);
begin
  if aFileName = "test.jpg" then
    aFileName := "custom_test.jpg";
end;

OnHTTPUploadAfterSaveFile

Cet événement est déclenché APRÈS la sauvegarde du fichier et vous permet de connaître le nom du fichier sauvegardé.


procedure OnHTTPUploadBeforeSaveFileEvent(Sender: TObject; const aFileName: string; const aFilePath: string);
begin
  DoLog("File Received: " + aFileName);end;

OnHTTPUploadReadInput

Cet événement est déclenché lorsque le décodeur lit une valeur d'entrée reçue différente de l'entrée fichier (exemple : si le formulaire contient des variables telles que nom, date...).


procedure OnHTTPUploadReadInputEvent(Sender: TObject; const aName: string; const aValue: string);
begin
  DoLog("Input value received: " + aName + ":" + aValue);end;