Вопрос по php, iphone, objective-c, xcode – Отправка файла из iOS в PHP с помощью POST

4

Я пытаюсь отправить аудиофайл на сервер PHP. Вот код Objective-C:

NSData *data = [NSData dataWithContentsOfFile:filePath];

NSLog(@"File Size: %i",[data length]);

//set up request
NSMutableURLRequest *request= [[NSMutableURLRequest alloc] init];
[request setURL:[NSURL URLWithString:urlString]];
[request setHTTPMethod:@"POST"];

//required xtra info
NSString *boundary = @"---------------------------14737809831466499882746641449";
NSString *contentType = [NSString stringWithFormat:@"multipart/form-data; boundary=%@", boundary];
[request addValue:contentType forHTTPHeaderField: @"Content-Type"];

//body of the post
NSMutableData *postbody = [NSMutableData data];
[postbody appendData:[[NSString stringWithFormat:@"\r\n--%@--\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]];
[postbody appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"thefile\"; filename=\"recording\"\r\n"] dataUsingEncoding:NSUTF8StringEncoding]];
[postbody appendData:[[NSString stringWithString:@"Content-Type: application/octet-stream\r\n"] dataUsingEncoding:NSUTF8StringEncoding]];
[postbody appendData:data];
[postbody appendData:[[NSString stringWithFormat:@"\r\n--%@--\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]];

[request setHTTPBody:postbody];
apiConnection = [[NSURLConnection alloc] initWithRequest:request delegate:self];

И вот код PHP:

if (is_uploaded_file($_FILES['thefile']['tmp_name'])) {
    echo "FILE NAME: ".$_FILES['thefile']['name'];
} else {
    echo "Nothing";
}

Размер файла зависит от длины записываемого аудио, но данные есть.

Я получаю ответ "Ничего".

Ваш Ответ

3   ответа
1

binary данные, прежде чем отправить их по каналу (а затем декодировать, когда он попадает на другой конец). Увидетьэто так нить для идей для кода кодировки Base64.

0

    func wsPostData(apiString: String, jsonData: String) -> Void
    {
         //apiString means base URL
        let postData = jsonData.dataUsingEncoding(NSASCIIStringEncoding, allowLossyConversion: true)
        let postLenth = "\(UInt((postData?.length)!))"
        let request = NSMutableURLRequest()
        request.URL = NSURL(string: apiString)
        request.HTTPMethod = "POST"
        request.setValue(postLenth, forHTTPHeaderField: "Content-Lenth")
        request.setValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type")
        request.HTTPBody = postData
        NSURLConnection.sendAsynchronousRequest(request, queue: NSOperationQueue.mainQueue()) { (response: NSURLResponse?, data: NSData?, error:NSError?) in

            print("response\(response)")
            var dict:NSDictionary!
            do {
                dict = try NSJSONSerialization.JSONObjectWithData(data!, options: []) as? [String: AnyObject]
                print(" responce data is \(dict)")
            }
            catch let error as NSError
            {
                print("Something went wrong\(error)")
            }

        }
    }
7

$file = $_POST['name'];
echo $file

Попробуйте следующий фрагмент кода вместо вашего текущего кода. Измените URL (www.yourWebAddress.com) и имя сценария на соответствующие значения для вашей проблемы.

NSData *data = [NSData dataWithContentsOfFile:filePath];
NSMutableString *urlString = [[NSMutableString alloc] initWithFormat:@"name=thefile&&filename=recording"];
[urlString appendFormat:@"%@", data];
NSData *postData = [urlString dataUsingEncoding:NSASCIIStringEncoding 
                                   allowLossyConversion:YES];
NSString *postLength = [NSString stringWithFormat:@"%d", [postData length]];
NSString *baseurl = @"https://www.yourWebAddress.com/yourServerScript.php"; 

NSURL *url = [NSURL URLWithString:baseurl];
NSMutableURLRequest *urlRequest = [NSMutableURLRequest requestWithURL:url];
[urlRequest setHTTPMethod: @"POST"];
[urlRequest setValue:postLength forHTTPHeaderField:@"Content-Length"];
[urlRequest setValue:@"application/x-www-form-urlencoded" 
          forHTTPHeaderField:@"Content-Type"];
[urlRequest setHTTPBody:postData];

NSURLConnection *connection = [NSURLConnection connectionWithRequest:urlRequest delegate:self];
[connection start];

NSLog(@"Started!");

На стороне сервера у меня есть следующий код:

<?php

    $name  = $_POST['name'];
    $filename  = $_POST['filename'];
    echo "Name = '" . $name . "', filename = '" . $filename . "'.";

    error_log ( "Name = '" . $name . "', filename = '" . $filename . "'." );

?>

Я получил следующий вывод:

[23-Май-2012 11:56:18] Имя = «thefile», имя файла = «запись».

Я не знаю, почему это не работает для вас. У тебя должен быть пропущенный шаг. Попробуйте закомментировать две строки в приведенном выше POST-коде URL, который ссылается на «данные»; чтобы увидеть, что вы можете получить хотя бы простой текст для имени и имени файла на вашем сервере.

Удачи!

Тоже пусто. Чтобы убедиться, что он достигает сервера, я добавил FILE NAME: в эхо. Chris
К сожалению. Я исправил опечатку из вырезания и вставки для: "NSMutableString * urlString = [[NSMutableString alloc] initWithFormat: @ & quot; имя = файл & amp; имя файла = запись & quot;]; & quot;
Солнечный, имя файла пустое. Chris
Хорошо, я обновил свой ответ. Попробуйте мой код, чтобы увидеть, как он работает для вас.
Я проверил вашу ссылку несколько минут назад. Я вернулся "Имя =" thefile ", имя файла =" запись "." в моем приложении NSURLConnection - (пустое) соединение: (NSURLConnection *) соединение didReceiveData: (NSData *) делегат данных. Однако, если ваш сайт не поддерживает https, убедитесь, что вы изменили baseURL с & quot; NSString * baseurl = @ & quot; https: //.." ;; & quot; на "NSString * baseurl = @" http: //..." ;; & quot; Также убедитесь, что вы объявили, что ваш viewController реализует NSURLConnectionDelegate. Удачи!

Похожие вопросы