Ich habe ja schon des Öfternen mit MultiPartFormDataStream gearbeitet, hat auch prima geklappt. Ich verwende folgenden Code, um eine Datei über ein Formular hochzuladen:
MultiPartFormDataStream: TMsMultiPartFormDataStream; ist lokal deklariert.
Site_URL ist eine Konstante mit der
URL, z.B.
http://www.google.de/MeinVerzeichnis/
Delphi-Quellcode:
Try
MultiPartFormDataStream := TMsMultiPartFormDataStream.Create;
HTTP.Request.ContentType := MultiPartFormDataStream.RequestContentType;
MultiPartFormDataStream.AddFile('f', ExtractFilePath(ParamStr(0)) + 'dir.txt', '');
MultiPartFormDataStream.PrepareStreamForDispatch;
MultiPartFormDataStream.Position := 0;
Buffer := HTTP.Post(Site_URL + 'upload.php?name=dir', MultiPartFormDataStream);
Finally
MultiPartFormDataStream.Free;
end;
Das Formular schaut wie folgt aus:
Code:
<?php
echo '<form action="'.$_SERVER['PHP_SELF'].'" method="post" enctype="multipart/form-data"><input type="file" name="f"><input name="l" type="submit"></form>';
move_uploaded_file($_FILES['f']['tmp_name'],'/srv/www/vhosts/google.de/httpdocs/MeinVerzeichnis/'.$_GET['name'].'.txt');
?>
Funktioniert auch alles prima. Jetzt habe ich aber die Datei gesplittet in 1 MB-Blöcke und möchte die nacheinander uploaden:
"Dateien" ist lokal deklariert als Integer.
SplitFile ist einfach nur eine eigene Funktion. Sie macht aus dir.txt dir_1.txt, dir_2.txt, etc.
MaxSize ist eine globale Konstante mit 1 MB als Wert, aber in Byte angegeben.
Response ist vom Typ String.
Delphi-Quellcode:
SplitFile(ExtractFilePath(ParamStr(0)) + 'dir.txt', FileGetSize(ExtractFilePath(ParamStr(0)) + 'dir.txt'));
Dateien := Ceil((FileGetSize(ExtractFilePath(ParamStr(0)) + 'dir.txt')) / MaxSize);
DeleteFile(ExtractFilePath(ParamStr(0)) + 'dir.txt');
For I := 1 to Dateien do
begin
Try
MultiPartFormDataStream := TMsMultiPartFormDataStream.Create;
HTTP.Request.ContentType := MultiPartFormDataStream.RequestContentType;
MultiPartFormDataStream.AddFile('f', ExtractFilePath(ParamStr(0)) + 'dir_' + IntToStr(I) + '.txt', '');
MultiPartFormDataStream.PrepareStreamForDispatch;
MultiPartFormDataStream.Position := 0;
Response := HTTP.Post(Site_URL + 'upload.php?name=dir' + IntToStr(I), MultiPartFormDataStream);
Finally
MultiPartFormDataStream.Free;
DeleteFile(ExtractFilePath(ParamStr(0)) + 'dir_' + IntToStr(I) + '.txt');
end;
end;
Auf dem Server liegt keine einizge Datei danach. Wieso nicht? Habe doch nur eine For-Schleife drumrumgemacht. Verzeichnis hat natürlich CHMOD 777 und wenn ich wie ganz oben nur eine Datei mache, klappt es auch. Die maximale Dateigröße liegt bei 2 MB laut phpinfo();