Invoke-WebRequest не загружает файл на сервер

Я пытаюсь отправить файлы HTTP на сервер из Powershell на моем компьютере с Windows. На сервере используется скрипт PHP (вырезанный из версии w3schools здесь: https://www.w3schools.com/php/php_file_upload.asp):

<?php
$target_dir = "uploads/";
$target_file = $target_dir . basename($_FILES["fileToUpload"]["name"]);
$uploadOk = 1;
} else {
    if (move_uploaded_file($_FILES["fileToUpload"]["tmp_name"], $target_file)) {
        echo "The file ". basename( $_FILES["fileToUpload"]["name"]). " has been uploaded.";
    } else {
        echo "Sorry, there was an error uploading your file.";
    }
}
?>

Используя файл HTML, показанный в учебнике w3schools, и Chrome в качестве браузера, я могу без проблем загружать файлы с помощью этого скрипта. Однако я не могу загрузить с помощью Invoke-WebRequest.

Вот команда, которую я использую:

Invoke-WebRequest -InFile "C:\test.txt" -ContentType "text/plain" -Method post -Uri http://example.com/upload/upload.php

И сегмент вывода:

StatusCode        : 200
StatusDescription : OK 
Content           : Sorry, there was an error uploading your file.

Что я делаю не так?


person Connor Varney    schedule 28.01.2019    source источник
comment
-InFile будет потреблять все тело POST. Однако PHP не увидит никаких $_FILES, если только запрос не пришел с полезной нагрузкой multipart/form-data.   -  person mario    schedule 28.01.2019
comment
@марио, как мне этого добиться? Этот пост охватывает аналогичную проблему, но я не вижу, как ответ относится к моей проблеме. Извините, но я действительно понятия не имею, что я делаю.   -  person Connor Varney    schedule 28.01.2019
comment
@ConnorVarney попробуй использовать Invoke-RestMethod   -  person HariHaran    schedule 28.01.2019
comment
PD stackoverflow.com/questions/25075010/, но см. пример 4 в документации MSDN для более современного подхода.   -  person mario    schedule 28.01.2019
comment
@HariHaran попробовал два способа с Invoke-RestMethod, но безуспешно. Команды, которые я пробовал, находятся здесь: pastebin.com/g4EP8XbV   -  person Connor Varney    schedule 28.01.2019
comment
@mario - Под примером 4 вы имеете в виду тот, в котором используется аргумент -Form?   -  person Connor Varney    schedule 28.01.2019
comment
Нет. Тот, в котором -Body состоит из [System.Net.Http.MultipartFormDataContent]::new()   -  person mario    schedule 28.01.2019
comment
Моя версия powershell (5.1), кажется, не поддерживает это? Я получаю Unable to find type [System.Net.Http.Headers.ContentDispositionHeaderValue].   -  person Connor Varney    schedule 28.01.2019
comment
Тогда может быть PSCore/6. В противном случае используйте один из ужасных ручных примеров составных конструкций MIME. Или выберите запрос PUT, сохраните -InFile, но php прочитает необработанную полезную нагрузку из php://input (простые данные загрузки, тогда без имени файла).   -  person mario    schedule 28.01.2019
comment
Да, составная конструкция работала нормально. Привет @Марио.   -  person Connor Varney    schedule 28.01.2019


Ответы (1)


Из-за моей версии Powershell лучше всего работало решение @mario, представляющее собой ручную конструкцию MIME, как показано в примере 2 документации v5.1: https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.utility/invoke-webrequest?view=powershell-5.1

Ваше здоровье.

person Connor Varney    schedule 28.01.2019