Загрузить фото с iPhone на сервер 4D
Я ищу, чтобы загрузить фотографию с iPhone на сервер 4D. В частности, для загрузки фотографии, снятой на iPhone, загруженной на сервер 4D и сохраненной в виде изображения JPEG в WebFolder. Я использую 4D Server версии 12 и 13. Я просмотрел здесь другие публикации, но не могу сделать так, чтобы какие-либо из них относились к 4D. Кто-нибудь знает, как это сделать?
3 ответа
Это заняло у меня некоторое время, но я, наконец, сообразил различные процедуры, чтобы сделать эту работу. Спасибо за блог iriphon (http://www.iriphon.com/2011/11/09/ios-uploading-an-image-from-your-iphone-to-a-server/), чтобы поставить меня на правильный трек.
Вот код iOS, который я использовал:
-(IBAction)uploadPhoto:(id)sender {
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:[NSURL URLWithString:@"http://www.domain.com/4DACTION/showcaseUploadPic"]
cachePolicy:NSURLRequestUseProtocolCachePolicy
timeoutInterval:60];
[request setHTTPMethod:@"POST"];
// We need to add a header field named Content-Type with a value that tells that it's a form and also add a boundary.
// I just picked a boundary by using one from a previous trace, you can just copy/paste from the traces.
NSString *boundary = @"----WebKitFormBoundaryQkZe6RUJZ2xbzXLB";
NSString *contentType = [NSString stringWithFormat:@"multipart/form-data; boundary=%@",boundary];
[request addValue:contentType forHTTPHeaderField: @"Content-Type"];
// end of what we've added to the header.
// the body of the post.
NSMutableData *body = [NSMutableData data];
// Now we need to append the different data 'segments'. We first start by adding the boundary.
[body appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]];
// Now append the image
// Note that the name of the form field is exactly the same as in the trace ('picBLOB' in my case).
// You can choose whatever filename you want.
[body appendData:[[NSString stringWithString:@"Content-Disposition: form-data; name=\"picBLOB\" filename=\"image001.jpg\"\r\n"] dataUsingEncoding:NSUTF8StringEncoding]];
// We now need to tell the receiver what content type we have.
// In my case it's a jpg image. If you have a png, set it to 'image/png'.
[body appendData:[[NSString stringWithString:@"Content-Type: image/jpg\r\n\r\n"] dataUsingEncoding:NSUTF8StringEncoding]];
// Now we append the actual image data.
// I use a NSData object called photoData.
[body appendData:[NSData dataWithData:photoData]];
NSLog(@"photoData size = %i",[photoData length]);
// and again the delimiting boundary.
[body appendData:[[NSString stringWithFormat:@"\r\n--%@--\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]];
// adding the body we've created to the request.
[request setHTTPBody:body];
NSURLConnection * connection = [[NSURLConnection alloc] initWithRequest:request delegate:self];
NSLog(@"connection = %@",connection);
}
Не забудьте включить делегатов NSURLConnection!
Я использовал Wireshark, как описано в блоге, чтобы получить точные данные, которые мне нужны. Я использую NSData для хранения фотографии, которую я только что сделал с помощью камеры, и хочу загрузить. Из-за этого мой код немного отличается от того, если вы хотите загрузить сохраненный файл.
Вот код 4D (версия 12):
$ba:=BLOB size(picBLOB)
C_PICTURE(imageVar)
If (Undefined(picBLOB)) // in case user tries to reload /4DACTION/WEB_Set_Limits
C_BLOB(picBLOB)
End if
If (BLOB size(picBLOB)>0) // did user select a file for uploading?
C_STRING(255;$fileHeader)
$offset:=0 // BLOB to text requires a variable for the offset parameter
$fileHeader:=BLOB to text(picBLOB;Mac text without length;$offset;255)
$fileNameBegin:=Position("filename=";$fileHeader)+10
For ($i;$fileNameBegin;255)
If ($fileHeader≤$i≥=Char(Double quote))
$fileNameEnd:=$i
$i:=255
End if
End for
$fileName:=Substring($fileHeader;$fileNameBegin;$fileNameEnd-$fileNameBegin)
$contentTypeBegin:=Position("Content-Type:";$fileHeader)+14
For ($i;$contentTypeBegin;255)
If ($fileHeader≤$i≥=Char(Carriage return))
$contentTypeEnd:=$i
$i:=255
End if
End for
contentType:=Substring($fileHeader;$contentTypeBegin;$contentTypeEnd-$contentTypeBegin)
DELETE FROM BLOB(picBLOB;0;$contentTypeEnd+3)
BLOB TO PICTURE(picBLOB;imageVar;"JPEG")
$FILENAME:=":WebFolder:myPhoto.jpg"
WRITE PICTURE FILE($FILENAME;imageVar;"JPEG")
End if
Вот код 4D (версия 13):
C_BLOB(picBLOB)
C_PICTURE(imageVar)
WEB GET BODY PART(1;picBLOB;myPhoto)
If (BLOB size(picBLOB)>0)
BLOB TO PICTURE(picBLOB;imageVar;"JPEG")
$FILENAME:=":WebFolder:myPhoto.jpg"
WRITE PICTURE FILE($FILENAME;imageVar;"JPEG")
End if
На этой странице есть инструкции по работе с более ранней версией. Более поздняя публикация в iNug (список рассылки разработчиков 4D) предполагает, что это все еще работает, возможно, с несколькими твиками.
Вы получите лучший ответ на вопрос о iNug просто потому, что сообщество 4D очень мало.
Я не особенно знаком с этим "4D сервером", но, похоже, вам нужен простой PHP-скрипт на стороне сервера для загрузки фотографии, возможно, с использованием NSData.
Что именно вы пробовали или каковы ваши знания в обеих этих областях?