Загрузить файл на веб-сервер Delphi + Stack Overflow

Я работаю над программой, и мне нужно загрузить ‘log.txt’ на веб-сервер .. по http

Я искал и добрался до этого: —

Delphi XE:

procedure TForm1.Button1Click(Sender: TObject);
begin
idhttp1.Post('http://127.0.0.1/GET2.php', 'C:\Users\Someone\Desktop\log.txt')
end;

php: —

<?php
$uploaddir = "uploads/";
$uploadfile = $uploaddir . basename( $_FILES['file']['name']);

if(move_uploaded_file($_FILES['file']['tmp_name'], $uploadfile))
{
echo "The file has been uploaded successfully";
}
else
{
echo "There was an error uploading the file";
}
?>

но файлы не загружаются

Спасибо за вашу помощь

1

Решение

Прочитайте документацию PHP.

Ваш код PHP использует $_FILES, который ожидает, что клиент разместит веб-форму HTML в MIME multipart/form-data формат:

Обработка загрузки файлов > POST метод загрузки

PHP способен принимать загрузки файлов с любого RFC-1867 совместимый браузер.

Загрузка файла в формате RFC 1867 в формате HTML

Но этот формат совсем не тот, который публикует ваше приложение. Он просто публикует необработанное содержимое файла как есть без метаданных MIME для описания файла. Вот почему ваш PHP-код не работает.

Чтобы опубликовать multipart/form-data HTML веб-форма с использованием TIdHTTP.Post(), вы должны использовать TIdMultipartFormDataStream класс, например:

uses
..., IdHTTP, IdMultipartFormDataStream;

procedure TForm1.Button1Click(Sender: TObject);
var
PostData: TIdMultipartFormDataStream;
begin
PostData := TIdMultipartFormDataStream.Create;
try
PostData.AddFile('file', 'C:\Users\Someone\Desktop\log.txt');
idhttp1.Post('http://127.0.0.1/GET2.php', PostData)
finally
PostData.Free;
end;
end;

Кроме того, PHP также поддерживает HTTP PUT запросы на загрузку файлов:

Обработка загрузки файлов > Поддержка метода PUT

procedure TForm1.Button1Click(Sender: TObject);
var
FS: TFileStream;
begin
FS := TFileStream.Create('C:\Users\Someone\Desktop\log.txt', fmOpenRead or fmShareDenyWrite);
try
idhttp1.Put('http://127.0.0.1/log.txt', FS);
finally
FS.Free;
end;
end;

<?php
/* PUT data comes in on the stdin stream */
$putdata = fopen("php://input", "r");

/* Open a file for writing */
$fp = fopen("log.txt", "w");

/* Read the data 1 KB at a time
and write to the file */
while ($data = fread($putdata, 1024))
fwrite($fp, $data);

/* Close the streams */
fclose($fp);
fclose($putdata);
?>
12

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]