Как программно выполнить форму скрипта CGI, содержащую поле ввода типа «файл»? - PullRequest
0 голосов
/ 14 апреля 2009

Я только что написал (на Perl) простой веб-сервис, который отображает веб-форму, содержащую одно поле загрузки типа «файл» и одну кнопку «Отправить». Я сделал эту простую веб-страницу с намерением, чтобы человек мог использовать ее, а также чтобы сценарий на другом компьютере мог также выполнять его программно. Я получил человеческую часть, все было сделано и протестировано, и теперь я только что понял, что понятия не имею, как создать URL на второй машине, которая успешно выполняет этот скрипт cgi на первой машине (и получает файл, загруженный со второй машины на первая машина).

У меня есть некоторый опыт создания URL, которые содержат поля формы, но я никогда раньше не использовал поле ввода типа «file» для загрузки, поэтому я немного с этим борюсь. Может быть, я использую это неправильно.

Если мой простой веб-сервис представляет собой скрипт cgi-bin с именем «myscript.pl» и если поле загрузки файла называется «uploadthis» и если файл на втором компьютере, который я хочу загрузить программным способом, находится в «C» : \ myfile.txt ", тогда я не смогу просто создать URL в скрипте на втором компьютере вида" http://machine1/cgi-bin/myscript.pl?uploadthis=C:\myfile.txt", и этот файл загружается программно, как если бы человек нажал на кнопку просмотра в веб-форме вручную, выберите этот файл и нажмите кнопку «Отправить»?

Работает нормально, когда я запускаю форму сценария cgi на первом компьютере, просматриваю файл и нажимаю Submit. Кажется, что файл загружен веб-браузером просто отлично. Но когда я ввожу вышеупомянутый URL-адрес в свой браузер, чтобы проверить URL-адрес загрузки файла вручную, прежде чем я запрограммирую этот URL-адрес в сценарий на другом компьютере, загружаемый файл будет файлом нулевой длины. Он создает файл, но он полностью пуст. Те же результаты, если я использую известное неверное имя файла, например "http://machine1/cgi-bin/myscript.pl?uploadthis=C:\myfilethatdoesntexist.txt". Что я делаю не так?

Я пытаюсь выполнить эту задачу на нескольких компьютерах с Windows XP с Apache 2.2 и ActivePerl 5.10.0, а метод формы - "post".

Ответы [ 3 ]

1 голос
/ 27 апреля 2009

Вы должны использовать такие модули как LWP и HTTP :: Request :: Common или WWW :: Mechanize . У обоих есть примеры с загрузкой файлов. WWW :: Mechanize проще, но вы должны устанавливать его только из ppm. LWP входит в ActiveState.

1 голос
/ 14 апреля 2009

Прежде всего, параметры публикации не заканчиваются в конце URL. Кроме того, невозможно загрузить файл полностью автоматически из браузера (даже с помощью JavaScript), просто чтобы пользователи не могли загружать его с диска.

Если вы хотите загрузить из браузера, вам всегда нужно будет выбрать файл или ввести имя файла в поле или нажать кнопку отправки вручную. Если все это автоматизировано, файл не будет загружен.

Чтобы проверить загрузку файлов программно, вы можете использовать curl:

curl -F "uploadthis=@C:\myfile.txt" http://machine1/cgi-bin/myscript.pl

Конечно, вы можете написать программу, которая также отправляет файлы как multipart / form-data.

0 голосов
/ 27 апреля 2009

Фраза «multipart / form-data» была тем, что я полностью пропустил. Когда я запустил эту фразу в Google, я нашел свой ответ.

Примером, приведенным ниже, является то, как я решил свою проблему из сценария Perl:

use HTTP::Request::Common;
use LWP::UserAgent;

$ua = LWP::UserAgent->new;

my $response = $ua->request(
    POST 'http://machine1/cgi-bin/myscript.pl',
    Content_Type => 'form-data',
    Content      => [ 
                        uploadthis => ["C:\myfile.txt"],
                    ]
    );

if ($response->is_success) {
    print "Success.";
}
else {
    print "Failure.";
}
...