2

以下のコードを使用して、画像とテキストをサーバーに送信します。

 NSURLSessionConfiguration *defaultConfigObject = [NSURLSessionConfiguration defaultSessionConfiguration];

    self.session = [NSURLSession sessionWithConfiguration: defaultConfigObject delegate:self delegateQueue: nil];

    NSString *requestURL = @"http://www.website.com.br/receive.php?name=StackOverflow";

    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:requestURL]];

    [request setHTTPMethod:@"POST"];

    UIImage *imagem = [UIImage imageNamed:@"Image.jpg"];

    NSData *imageData = UIImageJPEGRepresentation(imagem, 1.0);

    self.uploadTask = [self.session uploadTaskWithRequest:request fromData:imageData];

    [self.uploadTask resume];


-(void)URLSession:(NSURLSession *)session
         dataTask:(NSURLSessionDataTask *)dataTask didReceiveData:(NSData *)data{

    NSString* newStr = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
    NSLog(@"%@",newStr);
}

PHP

<?php
echo $_POST['name'];
?>

このコードの問題は、didReceiveDataメソッドがサーバーに送られるデータを受信せず、NSDataこのコードを php ファイルに配置したときにのみ取得されることです。

print_r($_FILES);

それでも空の配列を返しますが、なぜこれが起こっているのでしょうか?

解決済み

さて、私は私の問題を解決しました、行きましょう.hファイルでは、このプロトコルと1つのプロパティを実装する必要があります:

< NSURLSessionDelegate, NSURLSessionTaskDelegate>
@property (nonatomic) NSURLSessionUploadTask *uploadTask;

.m ファイルには IBAction タイプのメソッドがあり、ビューに存在する特定のボタンに接続されているため、これを行うだけで済みます。

- (IBAction)start:(id)sender {

    if (self.uploadTask) {
        NSLog(@"Wait for this process finish!");
        return;
    }

   NSString *imagepath = [[self applicationDocumentsDirectory].path stringByAppendingPathComponent:@"myImage.jpg"];
    NSURL *outputFileURL = [NSURL fileURLWithPath:imagepath];


    // Define the Paths
    NSURL *icyURL = [NSURL URLWithString:@"http://www.website.com/upload.php"];

    // Create the Request
    NSMutableURLRequest* request = [NSMutableURLRequest requestWithURL:icyURL];
    [request setHTTPMethod:@"POST"];

    // Configure the NSURL Session
    NSURLSessionConfiguration *sessionConfig = [NSURLSessionConfiguration backgroundSessionConfigurationWithIdentifier:@"com.sometihng.upload"];

    NSURLSession *upLoadSession = [NSURLSession sessionWithConfiguration:sessionConfig delegate:self delegateQueue:nil];

    // Define the Upload task
    self.uploadTask = [upLoadSession uploadTaskWithRequest:request fromFile:outputFileURL];

    // Run it!
    [self.uploadTask resume];

}

そして、いくつかのデリゲート メソッドを実装します。

- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didSendBodyData:(int64_t)bytesSent totalBytesSent:(int64_t)totalBytesSent totalBytesExpectedToSend:(int64_t)totalBytesExpectedToSend {

    NSLog(@"didSendBodyData: %lld, totalBytesSent: %lld, totalBytesExpectedToSend: %lld", bytesSent, totalBytesSent, totalBytesExpectedToSend);

}

- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error { 
    if (error == nil) {
        NSLog(@"Task: %@ upload complete", task);
    } else {
        NSLog(@"Task: %@ upload with error: %@", task, [error localizedDescription]);
    }
}

最後に、次のコードで PHP ファイルを作成する必要があります。

<?php

$fp = fopen("myImage.jpg", "a");//If image come is .png put myImage.png, is the file come is .mp4 put myImage.mp4, if .pdf myImage.pdf, if .json myImage.json ...

$run = fwrite($fp, file_get_contents("php://input"));

fclose($fp);

?>
4

2 に答える 2

0

NSDataのような管理しやすい形式に変換する必要がありますNSArray。そのためには、次のようなことを試す必要があります。

NSArray *array = [NSKeyedUnarchiver unarchiveObjectWithData:data] 
于 2015-02-17T21:40:49.610 に答える