Как передать файл с помощью wininet, который читается с помощью сценария php? - PullRequest
4 голосов
/ 03 октября 2008

Я хотел бы перенести текстовый файл на веб-сервер, используя 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 выполняется, но, похоже, он не получает правильные данные.

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

Ответы [ 3 ]

2 голосов
/ 03 октября 2008

Давайте сделаем один шаг за раз.

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

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

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

file = filename.txt
<Теперь вы добавляете содержимое файла после возврата каретки>

Вы вычисляете длину этой строки и помещаете 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:

<code><?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 "
"; ?>

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

1 голос
/ 03 октября 2008

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

  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";
0 голосов
/ 03 октября 2008

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...