Destekleyen
Bir HTTP istemcisi bir multipart/form-data akışı gönderdiğinde, akış sunucu tarafından bellekte saklanır. Dosyalar büyük olduğunda, sunucu bir bellek yetersiz istisnası alabilir. Bu istisnaları önlemek için, sunucunun HTTPUploadFiles adlı bir özelliği vardır; burada POST akışlarının nasıl işleneceğini yapılandırabilirsiniz: bellekte veya dosya akışları olarak. Akışlar dosya akışları olarak işlenirse, alınan akışlar doğrudan sabit diske kaydedilir, böylece bellek sorunları önlenir.
Sunucunuzu multipart/form-data akışlarını dosya akışları olarak kaydedecek şekilde yapılandırmak için aşağıdaki adımları izleyin:
1. HTTPUploadFiles.StreamType = pstFileStream özelliğini ayarlayın. Bu kurulumu kullanarak, sunucu bu stream'leri sabit diskte saklar.
2. Dosyaların dosya akışı olarak saklanacağı bayt cinsinden minimum boyutu yapılandırabilirsiniz. Varsayılan olarak değer sıfırdır, bu da tüm akışların dosya akışı olarak saklanacağı anlamına gelir.
3. Stream'lerin SaveDirectory kullanılarak saklandığı klasör; ayarlanmamışsa, uygulamanın bulunduğu aynı klasörde saklanır.
4. Bir istemci bir multipart/form-data gönderdiğinde, içerik sınırların içinde kodlanır; eğer RemoveBoundaries özelliği etkinse, sınırların içeriği tam stream alındıktan sonra otomatik olarak çıkarılır.
Örnek Kod
Önce yeni bir sunucu örneği oluşturun ve Stream'lerin Dosya Stream'leri olarak kaydedildiğini ayarlayın.
oServer := TsgcWebSocketHTTPServer.Create(nil);
oServer.Port := 5555;
oServer.HTTPUploadFiles.StreamType := pstFileStream;
oServer.Active := True;
Ardından aşağıdaki yapılandırmaya sahip yeni bir html dosyası oluşturun
<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>
Son olarak html dosyasını bir web tarayıcısıyla açın ve sunucuya bir dosya gönderin. Sunucu, ".sgc_ps" uzantılı yeni bir dosya akışı oluşturur ve akış tamamen alındığında, dosyayı sınırlardan çıkarır.
Dosya yükleme akışını özelleştirmek için kullanılabilecek 2 olay vardır (HTTPUploadFiles.RemoveBoundaries özelliğinin etkinleştirilmesini gerektirir)
OnHTTPUploadBeforeSaveFile
Bu olay, dosya kaydedilmeden ÖNCE tetiklenir ve alınan dosyanın adının özelleştirilmesine olanak tanır.
procedure OnHTTPUploadBeforeSaveFileEvent(Sender: TObject; var aFileName: string; var aFilePath: string);
begin
if aFileName = "test.jpg" then
aFileName := "custom_test.jpg";
end;
OnHTTPUploadAfterSaveFile
Bu olay, dosya kaydedildikten SONRA tetiklenir ve kaydedilen dosyanın adını bilmenize olanak tanır.
procedure OnHTTPUploadBeforeSaveFileEvent(Sender: TObject; const aFileName: string; const aFilePath: string); begin DoLog("File Received: " + aFileName);end;
OnHTTPUploadReadInput
Bu olay, çözücü dosya girişinden farklı alınan bir giriş değeri okuduğunda tetiklenir (örneğin: formun name, date... gibi bazı değişkenleri varsa).
procedure OnHTTPUploadReadInputEvent(Sender: TObject; const aName: string; const aValue: string); begin DoLog("Input value received: " + aName + ":" + aValue);end;