2016-08-11 6 views
15

NSMutableURLRequestを使用して、SendGridを使用して電子メールを送信するサーバー側のPHPスクリプトにPOSTデータを送信しています。これはうまく動作します。しかし、UIImagedataを添付ファイルとして正しくパッケージ化する方法はわかりません。ここに私の現在のコードがあります:SendGridへのPOSTリクエストを使用して、iOSで写真の添付ファイルを送信するにはどうすればよいですか?

// Choose an image from your photo library 
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info { 
    chosenImage = info[UIImagePickerControllerEditedImage]; // chosenImage = UIImage 
    pickedData = UIImagePNGRepresentation(chosenImage); // pickedData = NSData 
    attachment = TRUE; 
    [picker dismissViewControllerAnimated:YES completion:NULL]; 
} 

-(void)sendMail { 
    toEmailAddress = @"[email protected]"; 
    subject = @"Some Subject"; 
    message = @"Some message..."; 
    fullName = @"Mister Bla Bla"; 

    if (attachment == TRUE) { 
     // Create NSData object as PNG image data from camera image 
     NSString *picAttachment = [NSString stringWithFormat:@"%lu",(unsigned long)[pickedData length]]; 
     NSString *picName = @"Photo"; 
     post = [NSString stringWithFormat:@"&toEmailAddress=%@&subject=%@&message=%@&fullName=%@&picAttachment=%@&picName=%@", toEmailAddress, subject, message, fullName, picAttachment, picName]; 
    } else { 
     post = [NSString stringWithFormat:@"&toEmailAddress=%@&subject=%@&message=%@&fullName=%@", toEmailAddress, subject, message, fullName]; 
    } 

    NSData * postData = [post dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:NO]; 
    NSString * postLength = [NSString stringWithFormat:@"%lu",(unsigned long)[postData length]]; 
    NSMutableURLRequest * request = [[[NSMutableURLRequest alloc] init] autorelease]; 
    [request setURL:[NSURL URLWithString:[NSString stringWithFormat:@"http://www.someURL.com/sendgrid.php"]]]; 
    [request setHTTPMethod:@"POST"]; 
    [request setValue:postLength forHTTPHeaderField:@"Content-Length"]; 
    [request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"]; 
    [request setHTTPBody:postData]; 

    // send the POST request, and read the reply by creating a new NSURLSession: 
    NSURLSession *conn = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]]; 
    [[conn dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) { 
     NSString *requestReply = [[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding]; 
     NSLog(@"requestReply: %@", requestReply); // Return response from PHP script on server. 
    }] resume]; 
} 

この質問を調べると、既存のiOS SendGridのlibがあることがわかります。残念ながら、これは答えではありません。 SendGridの人々は、セキュリティ上の懸念からlibを使わないように言います。

+0

あなたはSendGridを直接使用することについて話しているので、多くのアップフォースと誰も明らかにしていません。あなたはSendGridを使って電子メールを送るサーバー側のPHPスクリプトを 'SendGrid endpoint'に変更することができます。なぜなら、最初のサーバーは自分のサーバーに関するもので、もう一つはSendGridサーバーに関するものです。結局のところ、あなたは私の答えにコメントを追加することができます。 Btw、私は説明を追加し、直接ファイルをアップロードするために何をする必要があるかを説明するドキュメントにリンクします。それが役に立てば幸い。 –

答えて

3

新しい答え:

は、Web API V3を使用してdocsで説明したようにリクエストを作成する必要がありSendGridに直接電子メールの添付ファイルとしてファイルをアップロードします。

まず、add authentication headerをリクエストする必要があります。 第2に、データをJSON形式に変換する必要があります。私たちがファイルについて話している場合、あなたはbody parameters sectionで説明したように、Base64ででデータをファイルエンコードする必要があります。

JSON PARAMETER: attachements/content 
TYPE: string 
REQUIRED: Yes 
The Base64 encoded content of the attachment. 

また、dispositioncontent_idのparamsに見てみましょう:彼らは、セットアップにファイルの外観をお手伝いします郵便物。

旧答え:

パラメータやファイルの両方をアップロードする標準的な方法は、multipart messagesでPOSTリクエストを使用しています。私は、この形式のデータを作成するようにコードを変更している:あなたは、あなたのPHPスクリプトでロードされたデータへのアクセスを得るために$_POST$_FILES変数を使用することができ

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info { 
    UIImage* image = info[UIImagePickerControllerEditedImage]; 
    NSDictionary* params = @{ 
    @"toEmailAddress" : @"[email protected]", 
    @"subject" : @"Some Subject", 
    @"message" : @"Some message...", 
    @"fullName" : @"Mister Bla Bla", 
    }; 
    [picker dismissViewControllerAnimated:YES completion:^{ 
    [self sendMailWithParams:params image:image]; 
    }]; 
} 

static NSStringEncoding const kEncoding = NSUTF8StringEncoding; 

- (void)sendMailWithParams:(NSDictionary*)params image:(UIImage*)image { 
    NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init]; 
    request.URL = [NSURL URLWithString:@"http://www.someURL.com/sendgrid.php"]; 
    request.HTTPMethod = @"POST"; 

    NSString *boundary = [NSUUID UUID].UUIDString; 

    // define POST request as multipart 
    NSString *contentType = [NSString stringWithFormat:@"multipart/form-data; boundary=%@", boundary]; 
    [request addValue:contentType forHTTPHeaderField: @"Content-Type"]; 

    // prepare boundary 
    NSString *middleBoundary = [NSString stringWithFormat:@"--%@\r\n", boundary]; 
    NSData *middleBoundaryData = [middleBoundary dataUsingEncoding:kEncoding]; 

    NSMutableData* body = [NSMutableData data]; 

    // append params 
    [params enumerateKeysAndObjectsUsingBlock:^(NSString* key, NSString* value, BOOL* stop) { 
    [body appendData:middleBoundaryData]; 
    NSData* fieldData = [self dataForKey:key value:value]; 
    [body appendData:fieldData]; 
    }]; 

    // append image 
    if (image) { 
    [body appendData:middleBoundaryData]; 
    NSData* imageData = [self dataForImage:image imageName:@"photo.png"]; 
    [body appendData:imageData]; 
    } 

    // add last boundary 
    NSString* lastBoundary = [NSString stringWithFormat:@"--%@--\r\n", boundary]; 
    NSData* lastBoundaryData = [lastBoundary dataUsingEncoding:kEncoding]; 
    [body appendData:lastBoundaryData]; 

    // set body to request 
    request.HTTPBody = body; 

    // add length of body 
    NSString *length = [NSString stringWithFormat:@"%llu", (uint64_t)body.length]; 
    [request setValue:length forHTTPHeaderField:@"Content-Length"]; 

    // send request 
    NSURLSession* session = [NSURLSession sharedSession]; 
    NSURLSessionDataTask* task = [session dataTaskWithRequest:request 
              completionHandler:^(NSData *data, 
                   NSURLResponse *response, 
                   NSError *error) { 
    // handle as you want 
    }]; 
    [task resume]; 
} 

- (NSData*)dataForImage:(UIImage*)image imageName:(NSString*)imageName { 
    NSString* fieldDescription = [NSString stringWithFormat: 
     @"Content-Disposition: form-data; name=\"image\"; filename=\"%@\"\r\n" 
     @"Content-Type: image/png\r\n\r\n", imageName]; 

    NSMutableData *data = [NSMutableData data]; 
    [data appendData:[fieldDescription dataUsingEncoding:kEncoding]]; 

    NSData* imageData = UIImagePNGRepresentation(image); 
    [data appendData:imageData]; 

    NSString* newLine = @"\r\n"; 
    NSData* newLineData = [newLine dataUsingEncoding:kEncoding]; 
    [data appendData:newLineData]; 

    return data; 
} 

- (NSData*)dataForKey:(NSString*)key value:(NSString*)value { 
    NSString* fieldDescription = [NSString stringWithFormat: 
     @"Content-Disposition: form-data; name=\"%@\"\r\n\r\n" 
     @"%@\r\n", key, value]; 
    return [fieldDescription dataUsingEncoding:kEncoding]; 
} 

。 マルチパートメッセージの詳細については、docs hereをご確認ください。

+0

入力いただきありがとうございます。あなたの方法論を実装しようとします。 – Marsman

関連する問題