Witam,
Chcę przesłać plik do skryptu PHP jako multipart/form-data. Wszystko co udało mi się znaleźć sprowadza się do jednego artykułu, więc się do niego zastosowałem. Użyłem MsMultiPartFormData, przekazuję wszystkie dane i upload jest w trakcie, OnWork jest wywoływane. Ale potem plik "ginie".
Skrypt PHP jest sprawny, mogę do tego samego skryptu przesyłać pliki z formularza HTML w przeglądarce i pliki się zapisują. Ale jeśli przesyłam z programu, nic się nie zapisuje. Sprawdzałem na dwóch serwerach - jednym lokalnym, jednym zdalnym.
Mój skrypt:
<?php
if (!empty($_FILES)) {
$tempFile = $_FILES['Filedata']['tmp_name'];
$targetFile = 'uploads/' . date('ymd_His') . '_' . $_FILES['Filedata']['name'];
move_uploaded_file($tempFile, $targetFile);
echo str_replace($_SERVER['DOCUMENT_ROOT'], '', $targetFile);
}
?>
Wysyłanie:
procedure TfUpload.bUploadClick(Sender: TObject);
var
ResponseStream: TMemoryStream;
MultiPartFormDataStream: TMsMultiPartFormDataStream;
i: Integer;
li: TListItem;
begin
MultiPartFormDataStream := TMsMultiPartFormDataStream.Create;
ResponseStream := TMemoryStream.Create;
try
IdClient.Request.ContentType := MultiPartFormDataStream.RequestContentType;
// dodawanie POST-ów z listy, pozostawiam pustą - nieistotne
for i := 0 to lvPost.Items.Count - 1 do
begin
li := lvPost.Items[i];
MultiPartFormDataStream.AddFormField(li.Caption, li.SubItems[0]);
end;
MultiPartFormDataStream.AddFile(eField.Text, eFile.Text, eMime.Text); //"Filedata", ścieżka, "application/octet-stream"
MultiPartFormDataStream.PrepareStreamForDispatch;
MultiPartFormDataStream.Position := 0;
IdClient.Post(eUrl.Text, MultiPartFormDataStream, ResponseStream);
finally
MultiPartFormDataStream.Free;
ResponseStream.Free;
end;
end;
Jeśli ktoś spotkał się z takim problemem, byłbym bardzo wdzięczny za podanie rozwiązania.
Pozdrawiam,
maxi