Я хотел бы расширить пример кода 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
];