Как расширить IOS SimpleURLConnections HTTP POST для отправки описания, декодируемого CGI Perl - PullRequest
0 голосов
/ 28 сентября 2011

Я хотел бы расширить пример кода ios под названием SimpleURLConnections. Этот пример кода может загрузить файл, используя HTTP POST. Я включил свой веб-сервер apache с помощью скрипта cgi, написанного на Perl, для получения HTTP POST, который обращается к скрипту cgi и успешно загружает файл. Расширение, которое я хотел бы сделать, это добавить заголовок или описание загруженного файла. Я попытался обновить данные составной формы в примере кода и соответствующее изменение в моем сценарии cgi, чтобы перенести это описание, но это не удается. Сценарий cgi не может прочитать описание, используя метод cgi.pm, называемый param (). Я надеюсь, что кто-то может помочь. Вот подробности:

Данные составной формы ДО того, как моя модификация выглядит следующим образом (ПРИМЕЧАНИЕ: процедура SimpleURLConnections вставляет файл изображения между Content-Type и 2-й границей на лету):

--Boundary-D4AFFBA9-AD92-4697-9184-7BDA128C3B97
Content-Disposition: form-data; name="fileContents"; filename="1234567/TestImage1.png"
Content-Type: image/png

--Boundary-D4AFFBA9-AD92-4697-9184-7BDA128C3B97
Content-Disposition: form-data; name="uploadButton"

Upload File
--Boundary-D4AFFBA9-AD92-4697-9184-7BDA128C3B97--

Данные составной формы ПОСЛЕ моей модификации выглядят следующим образом:

--Boundary-D4AFFBA9-AD92-4697-9184-7BDA128C3B97
Content-Disposition: form-data; name="Title"; title="Hello World"
Content-Type: text/plain
--Boundary-D4AFFBA9-AD92-4697-9184-7BDA128C3B97
Content-Disposition: form-data; name="fileContents"; filename="1234567/TestImage1.png"
Content-Type: image/png


--Boundary-D4AFFBA9-AD92-4697-9184-7BDA128C3B97
Content-Disposition: form-data; name="titleButton"
my Title

--Boundary-D4AFFBA9-AD92-4697-9184-7BDA128C3B97
Content-Disposition: form-data; name="uploadButton"

Upload File
--Boundary-D4AFFBA9-AD92-4697-9184-7BDA128C3B97--

Мой скрипт cgi выглядит следующим образом:

#!/usr/bin/perl -wT
use strict;use CGI;
use CGI::Carp qw ( fatalsToBrowser );
use File::Basename;

my $upload_dir = "/Library/WebServer/Documents/upload";

my $query = new CGI;

my $title = $query->param("Title");

#if (!$title) {
#    die "the title is $title. $!";
#}

if ( !$filename ) {
        print $query->header ( );
        die "There was a problem uploading your photo (try a smaller file). : $!";
        exit;
}
...

open ( UPLOADFILE, ">$upload_dir/$filename" ) or die "$!";
while ( <$upload_filehandle> ) {
    print UPLOADFILE;
}

close UPLOADFILE;

Этот код работает нормально, и загруженный файл записывается в каталог upload_.

Но, если я раскомментирую этот небольшой блок кода:

if (!$title) {
    die "the title is $title. $!";
}

скрипт умирает с ошибкой, которая указывает, что $ title не имеет значения:

[Tue Sep 27 17:09:17 2011] [error] [client 10.0.1.2] [Tue Sep 27 17:09:17 2011] upload.cgi: Use of uninitialized value $title in print at /Library/WebServer/CGI-Executables/upload.cgi line 79.

Итак, это проблема с моими данными многочастной формы, сценарием cgi, или невозможно передать эти данные в данные многочастной формы? Есть ли альтернативный способ?

Спасибо

Хорошо, после получения справки от @ AFresh1 я обнаружил проблему. Проблема заключалась в деталях того, как были созданы данные из нескольких частей. Сначала я покажу неправильный путь.

NSString *title = @"Hello World";
bodySuffixStr = [NSString stringWithFormat:     // create the footer for the POST message
            @
            "\r\n"
            "--%@\r\n"
            "Content-Disposition: form-data; name=\"titleButton\"\r\n"
            "%@\r\n\r\n"
            "--%@\r\n"
            "Content-Disposition: form-data; name=\"uploadButton\"\r\n"
            "\r\n"
            "Upload File\r\n"
            "--%@--\r\n" 
            "\r\n",
            boundaryStr,
            title,
            boundaryStr, 
            boundaryStr
        ];

Теперь правильный путь (очень тонкое изменение в 7-й строке - перемещен CR / LF):

NSString *title = @"Hello World";
bodySuffixStr = [NSString stringWithFormat:     // create the footer for the POST message
            @
            "\r\n"
            "--%@\r\n"
            "Content-Disposition: form-data; name=\"titleButton\"\r\n"
            "\r\n%@\r\n"
            "--%@\r\n"
            "Content-Disposition: form-data; name=\"uploadButton\"\r\n"
            "\r\n"
            "Upload File\r\n"
            "--%@--\r\n" 
            "\r\n",
            boundaryStr,
            title,
            boundaryStr, 
            boundaryStr
        ];

1 Ответ

1 голос
/ 28 сентября 2011

Я считаю, что содержимое идет в пробел после заголовка и до следующей границы не в атрибуте заголовка. Заголовок детали - все, что находится после границы и до пустой строки.

Если вы хотите получить «Hello World» в $ title, используя $query->param('Title') Я думаю, вам понадобится что-то более похожее на это (обратите внимание, что тип контента по умолчанию равен text / plain):

--Boundary-D4AFFBA9-AD92-4697-9184-7BDA128C3B97
Content-Disposition: form-data; name="Title"

Hello World
--Boundary-D4AFFBA9-AD92-4697-9184-7BDA128C3B97
...