AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Delphi Upload großer Dateien

Upload großer Dateien

Ein Thema von OlliWW · begonnen am 10. Sep 2020 · letzter Beitrag vom 14. Sep 2020
Antwort Antwort
OlliWW

Registriert seit: 31. Aug 2011
159 Beiträge
 
#1

AW: Upload großer Dateien

  Alt 10. Sep 2020, 12:22
Vielen Dank für die vielen hilfreichen Hinweise.

Ich implementiere es gerade so:
- Intelligentes PHP Script dass immer Teile einer Datei annimmt sowas wie: upload.php?file=test.bin&chunk=4711 (auf dem Server werden die Chunks abgelegt: test.bin_4711
- Delphi teilt den Stream in 10 MB Teile und läd die an das o.g. PHP Script (idHTTP Post)
- Am Ende poste ich ein "finish" an das Script und das Script setzt (wenn die Chunks durchgehend sind) die File dann wieder zusammen

Damit muss ich das ganze nicht sequentiell abarbeiten und kann theoretisch paralell mehrere Teile übertragen (muss aber nicht)

Was ich durch das Teilen leider verliere ist die Möglichkeit einen Upload weiter durchzuführen, falls er abbricht. Normal könnte ich mit "Head" prüfen, wie groß die File auf dem Server ist und an dieser Stelle weiter machen, aber in meinem Szenario kann ich das denke ich vernachlässigen.
  Mit Zitat antworten Zitat
Benutzerbild von sakura
sakura

Registriert seit: 10. Jun 2002
Ort: Unterhaching
11.412 Beiträge
 
Delphi 12 Athens
 
#2

AW: Upload großer Dateien

  Alt 10. Sep 2020, 12:27
Vorschlag, so kenne ich es von anderen Systemen.

Im ersten Schritt den Upload registrieren mit Gesamtgröße in Bytes und einer Chunkgröße, dann kannst Du diese auch ggf. anpassen, wenn mal eine schlechte Verbindung besteht. Der Server antwortet mit einer Upload-ID. Du kannst übrigens auf modernen Windows-Rechnern direkt eine Datei mit der gewünschten Größe anlegen (dauert nur ein paar Millisekunden, FileStream.Size := AnzahlderBytes)

Dann im Upload nur die Chunk# und Upload-ID übergeben und diese dann direkt in die Zieldatei schreiben. Des Weiteren hast Du eine Bitmap für alle Chunks, und setzt das entsprechende Bit, wenn ein Chunk oben ist. Dann musst Du abschließend nicht ein "Fertig" senden. Außerdem kannst Du somit auch einen Upload fortsetzen, da der Server dem Client auch antworten kann, ob ein Chunk bereits existiert

......
Daniel Lizbeth
Ich bin nicht zurück, ich tue nur so
  Mit Zitat antworten Zitat
OlliWW

Registriert seit: 31. Aug 2011
159 Beiträge
 
#3

AW: Upload großer Dateien

  Alt 10. Sep 2020, 12:29
Cool Danke!
  Mit Zitat antworten Zitat
Beach

Registriert seit: 3. Mär 2019
Ort: Kappel
46 Beiträge
 
FreePascal / Lazarus
 
#4

AW: Upload großer Dateien

  Alt 10. Sep 2020, 12:32
Denkst du nicht, das du beim zusammensetzen mittels PHP wieder an die Grenzen stößt?
Wird außerdem sehr inperformant sein.

Vielleicht solltest du mal eher in Richtung sFTP bzw FTPS schauen?
Je nachdem was dein Server für Möglichkeiten bietet?
MfG Jürgen
  Mit Zitat antworten Zitat
OlliWW

Registriert seit: 31. Aug 2011
159 Beiträge
 
#5

AW: Upload großer Dateien

  Alt 10. Sep 2020, 12:34
Vielleicht solltest du mal eher in Richtung sFTP bzw FTPS schauen?
Je nachdem was dein Server für Möglichkeiten bietet?
Die derzeitige Lösung ist: SFTP
Das Problem ist nicht der Server, das Problem ist der Client, in manchen Fällen macht mir die Client Firewall einen Strich durch die Rechnung und darauf habe ich nicht immer Zugriff. Auch SSHd auf Port 443 laufen zu lassen löst das Problem nicht immer, da manche Firewalls mit DPI erkennen, dass dies keine richtige HTTPS Connection ist.
  Mit Zitat antworten Zitat
Blup

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.487 Beiträge
 
Delphi 12 Athens
 
#6

AW: Upload großer Dateien

  Alt 11. Sep 2020, 11:14
- Am Ende poste ich ein "finish" an das Script und das Script setzt (wenn die Chunks durchgehend sind) die File dann wieder zusammen
Vorschlag:
Am Anfang Dateiname, Länge, Chunk-Länge und Prüfsumme der Datei übertragen.
Der Server kann aufgrund dieser Informationen prüfen, ob für diese Datei schon eine Teilübertragung stattgefunden hat.
Sollte sich die gemerkte Prüfsumme der Datei unterscheiden, wurde die Datei auf dem Client inzwischen verändert und muss komplett neu übertragen werden.
Server legt die Datei sofort in der Gesamtlänge mit temporären Namen an (Speicher ist reserviert, vermindert Fragmentierung).
Server teilt mit welche Chunks noch benötigt werden.

Client überträgt Chunks, vieleicht sogar mehrere parallel (spart die Latenzzeit).
Server schreibt jeden Chunk direkt in die Datei ab der Position, an die der Chunk gehört.
Streicht die übertragenen Chunk aus seiner Liste.

Client meldet Abschluss.
Server prüft ob noch Chunk fehlen > Fehler Rückmeldung > fehlende Chunk übertragen
Server prüft CRC > Fehler Rückmeldung > Abbruch
Server benennt die temporäre Datei um und gibt die nur für die Übertragung erforderlichen Daten frei.

Es sollte auch ein Mechanismus existieren, die Übertragungen vom Client aus endgültig abzubrechen.
  Mit Zitat antworten Zitat
Benutzerbild von MyRealName
MyRealName

Registriert seit: 19. Okt 2003
Ort: Heilbronn
689 Beiträge
 
Delphi 10.4 Sydney
 
#7

AW: Upload großer Dateien

  Alt 11. Sep 2020, 11:17
Man könnte auch einfach das Torrent-Prokoll abwandeln oder gleich torrent nutzen Ist ja nicht illegal für eigene Dateien :p
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.340 Beiträge
 
Delphi 12 Athens
 
#8

AW: Upload großer Dateien

  Alt 11. Sep 2020, 12:09
oder gleich torrent nutzen
Ja, das Protokoll an sich ist nicht illegal,
aber wenn mehrere Programme auf den Handies mehrerer User sich gegenseitig die Dateien austauschen,
dann hätte da vielleicht der Datenschutz ä bissl was dagegen.

Zum Runterladen von Dateien isses OK, aber beim Hochladen "privater" Dateien sollte man aufpassen.
Zumindestens wenn es unverschlüsselt passiert und jeder es runterladen könnte (nicht nur dein "Server"), sonst könnte man es wenigstens noch als Backup deklarieren.


PS: Er will ja grade hin zu HTTP(s)-Basierendem und weg von was Anderem, weil es Probleme mit Firewalls und Dergleichen gibt,
was ein "böses" FileSharing-Protokoll nicht grade verbessern würde.
Das Problem ist nicht der Server, das Problem ist der Client, in manchen Fällen macht mir die Client Firewall einen Strich durch die Rechnung und darauf habe ich nicht immer Zugriff.
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu (11. Sep 2020 um 12:14 Uhr)
  Mit Zitat antworten Zitat
Michael II

Registriert seit: 1. Dez 2012
Ort: CH BE Eriswil
771 Beiträge
 
Delphi 11 Alexandria
 
#9

AW: Upload großer Dateien

  Alt 14. Sep 2020, 11:00
Ich kenne Indy zu wenig, aber mit ICSOverbyte (via GetIt erhältlich) ist das Übertragen von grossen Files problemlos machbar.

Mit ICS werden viele Beispielprogramme installiert. Ein ftp Beispiel findest du unter
C:\Users\...\Dokumente\Embarcadero\Studio\21.0\Cat alogRepository\ICS_FMX-8.64-Sydney\Samples\Delphi\FtpDemos ( Du schreibst, dass ftp auf einigen Systemen blockiert wird. Dann würde man wohl am besten diese Hindernisse aus dem Weg räumen.)

Auch ohne ftp, zum Beispiel via ICSOverbytes TWSocket funktioniert der Upload von sehr grossen Files problemlos. Wie weiter oben erwähnt wird, sollte deine Programm nach einem Verbindungsunterbruch nicht wieder bei 0 beginnen müssen.
Michael Gasser

Geändert von Michael II (14. Sep 2020 um 12:52 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort

 
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:18 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz