Multipart / Formdata изображение загрузить, получить файл - PullRequest
2 голосов
/ 19 декабря 2011

в моем приложении я хочу загрузить изображение, выбранное с помощью UIImagePickerController, в базу данных, которая принимает только изображения JPEG. Я просмотрел много вопросов здесь и на других форумах, но я все еще не получил его на работу. Я надеюсь, что вы можете проверить мой код, если есть ошибка, которую я не вижу. Это полный метод загрузки с описанием изображения, заголовком изображения и геоданными для этого изображения:

- (void) uploadPic{
    NSArray  *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    NSString *destinationFilePath = [[NSString alloc] initWithFormat: @"%@/%@.jpeg", documentsDirectory, self.chosenImage.imgTitle];
    NSURL *fileURL = [[NSURL alloc]initWithString:destinationFilePath];
    NSLog(@"will upload file: %@", destinationFilePath);

    NSData *imageURLdata = [[NSData alloc]initWithContentsOfURL:fileURL];   (*1) 
    NSData *imageData = UIImageJPEGRepresentation(self.chosenImage, 90);    (*2) 
    //Here i tried 2 ways of getting the data for uploading, but both don't work.

    // create the URL
    NSURL *postURL = [NSURL URLWithString:@"http://*********/PictureUpload"];

    // create the connection
    NSMutableURLRequest *postRequest = [NSMutableURLRequest requestWithURL:postURL cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:20.0];

    // change type to POST (default is GET)
    [postRequest setHTTPMethod:@"POST"];

    // just some random text that will never occur in the body
    NSString *stringBoundary = @"0xKhTmLbOuNdArY---This_Is_ThE_BoUnDaRyy---pqo";

    // header value, user session ID added
    NSString *headerBoundary = [NSString stringWithFormat:@"multipart/form-data; boundary=%@",
                                sessionID];

    // set header
    [postRequest addValue:headerBoundary forHTTPHeaderField:@"Content-Type"];
    // create data
    NSMutableData *postBody = [NSMutableData data];

    // title part
    [postBody appendData:[[NSString stringWithFormat:@"--%@\r\n", stringBoundary] dataUsingEncoding:NSUTF8StringEncoding]];
    [postBody appendData:[[NSString stringWithString:@"Content-Disposition: form-data; name=\"title\"\r\n\r\n"] dataUsingEncoding:NSUTF8StringEncoding]];
    [postBody appendData:[self.chosenImage.imgTitle dataUsingEncoding:NSUTF8StringEncoding]];
    [postBody appendData:[@"\r\n" dataUsingEncoding:NSUTF8StringEncoding]];

    // desc part
    [postBody appendData:[[NSString stringWithFormat:@"--%@\r\n", stringBoundary] dataUsingEncoding:NSUTF8StringEncoding]];
    [postBody appendData:[[NSString stringWithString:@"Content-Disposition: form-data; name=\"desc\"\r\n\r\n"] dataUsingEncoding:NSUTF8StringEncoding]];
    [postBody appendData:[self.chosenImage.imgDescription dataUsingEncoding:NSUTF8StringEncoding]];
    [postBody appendData:[@"\r\n" dataUsingEncoding:NSUTF8StringEncoding]];


    // latitude part
    [postBody appendData:[[NSString stringWithFormat:@"--%@\r\n", stringBoundary] dataUsingEncoding:NSUTF8StringEncoding]];
    [postBody appendData:[[NSString stringWithString:@"Content-Disposition: form-data; name=\"latitude\"\r\n\r\n"] dataUsingEncoding:NSUTF8StringEncoding]];
    [postBody appendData:[self.chosenImage.latitude dataUsingEncoding:NSUTF8StringEncoding]];
    [postBody appendData:[@"\r\n" dataUsingEncoding:NSUTF8StringEncoding]];

    // longitude part
    [postBody appendData:[[NSString stringWithFormat:@"--%@\r\n", stringBoundary] dataUsingEncoding:NSUTF8StringEncoding]];
    [postBody appendData:[[NSString stringWithString:@"Content-Disposition: form-data; name=\"longitude\"\r\n\r\n"] dataUsingEncoding:NSUTF8StringEncoding]];
    [postBody appendData:[self.chosenImage.longitude dataUsingEncoding:NSUTF8StringEncoding]];
    [postBody appendData:[@"\r\n" dataUsingEncoding:NSUTF8StringEncoding]];

    // media part
    [postBody appendData:[[NSString stringWithFormat:@"--%@\r\n", stringBoundary] dataUsingEncoding:NSUTF8StringEncoding]];
    [postBody appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"file\"; filename=\"%@.jpeg\"\r\n", self.chosenImage.imgTitle ] dataUsingEncoding:NSUTF8StringEncoding]];
    [postBody appendData:[@"Content-Type: image/jpeg\r\n" dataUsingEncoding:NSUTF8StringEncoding]];
    [postBody appendData:[NSData dataWithData:imageURLdata]];
    [postBody appendData:[@"Content-Transfer-Encoding: binary\r\n\r\n" dataUsingEncoding:NSUTF8StringEncoding]];

    // final boundary
    [postBody appendData:[[NSString stringWithFormat:@"--%@--\r\n", stringBoundary] dataUsingEncoding:NSUTF8StringEncoding]];
    NSString *s = [[NSString alloc] initWithData:postBody encoding:NSASCIIStringEncoding];
    NSLog(@"%@", s);

    // add body to post
    [postRequest setHTTPBody:postBody];

    // pointers to some necessary objects
    NSURLResponse* response;
    NSError* error;

    // synchronous filling of data from HTTP POST response
    NSData *responseData = [NSURLConnection sendSynchronousRequest:postRequest returningResponse:&response error:&error];

    if (error)
    {
        NSLog(@"Error: %@", [error localizedDescription]);
    }

    // convert data into string
    NSString *responseString = [[NSString alloc] initWithBytes:[responseData bytes]
                                                        length:[responseData length]
                                                      encoding:NSUTF8StringEncoding];

    // see if we get a welcome result
    NSLog(@"%@", responseString);
    [self responseHandler:responseString];

}

GEOimage chosenImage создается через CGImageRef после выбора UIImage в ImagePickerController. № метода * 1, чтобы получить NSData для загрузки, не самый лучший, потому что здесь изображение выбирается из каталога документов, и здесь вся EXIF-информация об изображении удаляется. С обоими методами я получаю ответ из базы данных, что тип файла изображения не поддерживается (ожидается JPEG). Я думал, с помощью метода Nr. * 2 Я отправляю изображение в формате JPEG, но, возможно, у меня ошибка во всем процессе multipart / formdata.

Я пытался получить URL-адрес исходного файла в файловой системе, но это довольно сложно для меня. Я получил только URL ресурса с картинки.

Заранее спасибо

S4lfish

Ответы [ 2 ]

2 голосов
/ 18 июня 2012

Вы, вероятно, уже решили это самостоятельно, но я думаю, что вижу вашу проблему.

NSString *stringBoundary = @"0xKhTmLbOuNdArY---This_Is_ThE_BoUnDaRyy---pqo";

// header value, user session ID added
NSString *headerBoundary = [NSString stringWithFormat:@"multipart/form-data; boundary=%@",
                            sessionID];

Когда вы определяете границу внутри заголовка MIME, вы используете свой sessionID в качестве границы. Затем внизу вы используете переменную stringBoundary для создания фактических границ.

[postBody appendData:[[NSString stringWithFormat:@"--%@\r\n", stringBoundary] dataUsingEncoding:NSUTF8StringEncoding]];

Также может быть хорошей идеей предоставить Content-Length каждого MIME-блока, чтобы помочь в обработке кода, но я не думаю, что это здесь проблема.

0 голосов
/ 24 ноября 2013

// Попробуйте это ---- >>>

   NSMutableDictionary *post_dic=[[NSMutableDictionary
   alloc]initWithCapacity:20]; [post_dic setObject:firstName_txtFld.text
   forKey:@"firstname"]; [post_dic setObject:lastName_txtFld.text
   forKey:@"lastname"]; [post_dic setObject:email_txtFld.text
   forKey:@"email"]; [post_dic setObject:password_txtFld.text
   forKey:@"password"]; [post_dic setObject:country_txtFld.text
   forKey:@"address"]; [post_dic setObject:state_txtFld.text
   forKey:@"state"]; [post_dic setObject:city_txtFld.text
   forKey:@"city"]; [post_dic setObject:zip_txtFld.text forKey:@"zip"];
   [post_dic setObject:phoneNumber_txtFld.text forKey:@"phonenumber"];   
   NSURL *url = [NSURL URLWithString:@"Enter your url"];
   NSMutableURLRequest *urlRequest = [NSMutableURLRequest
   requestWithURL:url]; [urlRequest setHTTPMethod:@"POST"]; [urlRequest
   setHTTPBody:[urlString dataUsingEncoding:NSUTF8StringEncoding]];
            NSString *boundary = @"--------------------------14737809831466499882746641449"; NSString
   *contentType = [NSString stringWithFormat:@"multipart/form-data; boundary=%@",boundary];
   [urlRequest addValue:contentType
   forHTTPHeaderField: @"Content-Type"];
          NSMutableData *postbody = [NSMutableData data];
          for (NSString *param in post_dic) {
        [postbody appendData:[[NSString stringWithFormat:@"--%@\r\n", boundary]
  dataUsingEncoding:NSUTF8StringEncoding]];
        [postbody appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data;
   name=\"%@\"\r\n\r\n", param]
   dataUsingEncoding:NSUTF8StringEncoding]];
        [postbody appendData:[[NSString stringWithFormat:@"%@\r\n", [post_dic objectForKey:param]]
   dataUsingEncoding:NSUTF8StringEncoding]];
            }
       [postbody appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n",boundary]
   dataUsingEncoding:NSUTF8StringEncoding]];
       [postbody appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data;
   name=\"filedata\";
   filename=\"%@.jpg\"\r\n",@"text"]
   dataUsingEncoding:NSUTF8StringEncoding]];
       [postbody appendData:[@"Content-Type: application/octet-stream\r\n\r\n"
   dataUsingEncoding:NSUTF8StringEncoding]];
       //NSLog(@" image -->%@",imageData);
       [postbody appendData:[NSData dataWithData:imageData]];
       [postbody appendData:[[NSString stringWithFormat:@"\r\n--%@--\r\n",boundary]
   dataUsingEncoding:NSUTF8StringEncoding]];
        [urlRequest setHTTPBody:postbody]; [urlRequest setURL:url]; 
        NSURLConnection *connection=[[NSURLConnection alloc] initWithRequest:urlRequest  delegate:self]; 
[connection start];
...