Как передать файл с помощью wininet, читаемый сценарием php?

Я хотел бы передать текстовый файл на веб-сервер с помощью wininet, как если бы файл передавался с помощью веб-формы, которая отправляет файл на сервер.

На основании полученных ответов я попробовал следующий код:

 static TCHAR hdrs[] = "Content-Type: multipart/form-data\nContent-Length: 25";
 static TCHAR frmdata[] = "file=filename.txt\ncontent";

   HINTERNET hSession = InternetOpen("MyAgent",
      INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0);
   HINTERNET hConnect = InternetConnect(hSession, "example.com",
      INTERNET_DEFAULT_HTTP_PORT, NULL, NULL, INTERNET_SERVICE_HTTP, 0, 1);
   HINTERNET hRequest = HttpOpenRequest(hConnect, "POST", "test.php", NULL, NULL, NULL, 0, 1);
   HttpSendRequest(hRequest, hdrs, strlen(hdrs), frmdata, strlen(frmdata));");

Сценарий test.php запущен, но, похоже, он не получает правильные данные.

Может ли кто-нибудь дать мне дополнительную помощь или где-нибудь посмотреть? Спасибо.

Мне жаль, что я не добавил эту маленькую информацию: HTTP работает с \ r \ n. Так что вам придется добавить еще один и увеличить до 26.

Gustavo Carreno 04.10.2008 15:26

То же самое и с заголовками.

Gustavo Carreno 04.10.2008 15:26
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
4
2
3 749
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Здесь - общее описание того, что в этом участвует. По сути, вам нужно создать HTTP-запрос на веб-адрес, прикрепить информацию к запросу и затем отправить его. В вашем случае запрос должен быть POST-запросом.

Давайте делать это шаг за шагом.

Сначала задействованы HTTP-заголовки:

  1. Тип содержимого: multipart / form-data
  2. Content-Length: <это зависит от суммы байтов содержимого>

Затем вам нужно создать строку с содержимым формы POST. Предположим, у вас есть входной файл с именем:

file=filename.txt
<You now add the content of the file after that carriage return>

Вы вычисляете длину этой строки и указываете Content-Length выше.

Хорошо, полный HTTP-запрос будет выглядеть так:

POST /file_upload.php HTTP/1.0
Content-type: multipart/form-data
Content-length: <calculated string's length: integer>

file=filename.txt
...File Content...

Теперь немного кода из руководства по PHP:

<?php
// In PHP versions earlier than 4.1.0, $HTTP_POST_FILES should be used instead
// of $_FILES.

$uploaddir = '/var/www/uploads/';
$uploadfile = $uploaddir . basename($_FILES['file']['name']);

echo '<pre>';
if (move_uploaded_file($_FILES['file']['tmp_name'], $uploadfile)) {
    echo "File is valid, and was successfully uploaded.\n";
} else {
    echo "Possible file upload attack!\n";
}

echo 'Here is some more debugging info:';
print_r($_FILES);

print "</pre>";

?>

Зная меня, я, вероятно, испортил формат контента, но это общая идея.

Ответ принят как подходящий

Изменение данных формы и заголовков, которые у меня были выше, на следующее, решило проблему:

  static TCHAR frmdata[] = "-----------------------------7d82751e2bc0858\nContent-Disposition: form-data; name=\"uploadedfile\"; filename=\"file.txt\"\nContent-Type: text/plain\n\nfile contents  here\n-----------------------------7d82751e2bc0858--";
  static TCHAR hdrs[] = "Content-Type: multipart/form-data; boundary=---------------------------7d82751e2bc0858";

Видишь ли, у меня был неправильный формат контента. Я сказал вам multipart, но дал вам другой формат :(

Gustavo Carreno 04.10.2008 15:28

Да, но вы определенно помогли мне посмотреть в правильном направлении :)

Rob 05.10.2008 22:23

О, спасибо, дружище. Очень рад, что указал вам в правильном направлении :)

Gustavo Carreno 29.03.2012 00:19

Другие вопросы по теме