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

1

Я работаю над программой, и мне нужно загрузить "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";
}
?>

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

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

Теги:
indy
delphi-xe

1 ответ

12
Лучший ответ

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

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

Загрузка файлов > Загрузка POST-метода

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

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

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

Чтобы опубликовать веб-форму HTML с TIdHTTP.Post() multipart/form-data с помощью 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);
?> 
  • 0
    вот и отвечает на мой вопрос, решено.
  • 0
    Если это так, отметьте ответ как принятый.
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню