Publier de gros fichiers

Pris en charge par

 

TsgcWebSocketHTTPServer

TsgcWebSocketServer_HTTPAPI

 

Lorsqu'un client HTTP envoie un flux multipart/form-data, le flux est enregistré par le serveur en mémoire. Lorsque les fichiers sont volumineux, le serveur peut générer une exception out of memory. 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 de fichiers. Si les flux sont traités comme des flux de fichiers, 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 qu'il enregistre les flux multipart/form-data sous forme de flux de fichiers, 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 sous forme de flux de fichiers. Par défaut, la valeur est zéro, ce qui signifie que tous les flux seront stockés sous forme de flux de fichiers.

3. Le dossier où les flux sont stockés à l'aide de SaveDirectory ; s'il n'est pas défini, 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 de serveur et définissez que les flux sont enregistrés sous forme de flux de fichiers.

 


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>

 

Enfin, ouvrez le fichier html avec un navigateur web et envoyez un fichier au serveur. Le serveur créera un nouveau flux de 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 d'envoi de fichiers (nécessite que la propriété HTTPUploadFiles.RemoveBoundaries soit activée)

 

OnHTTPUploadBeforeSaveFile

 

Cet événement est déclenché AVANT l'enregistrement 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 l'enregistrement du fichier et vous permet de connaître le nom du fichier enregistré.


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 de fichier (exemple : si le formulaire contient des variables telles que name, date...).


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