使用NSURLSessionUploadTask将文件上载到PHP服务器
I have a video upload system in an iOS app using NSURLSessionUploadTask
. The video file is saved to an NSURL
so I am using the following code in my upload method:
request.HTTPMethod = @"POST";
[request addValue:@"file" forHTTPHeaderField:@"fileName"];
// Create upload task
NSURLSessionUploadTask *task = [session uploadTaskWithRequest:request fromFile:filePath completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
if(!error) {
// handle success
} else {
// handle error
}
}];
// Run the task
[task resume];
I have a PHP server (using Laravel) running under nginx to handle this upload. I have tested it with Postman, and it accepts uploads fine (expecting a file under the name "file").
When I run the above objc code, the server tells me that no file has been uploaded (the $_FILES
array is empty).
I have tried with and without setting the "fileName" header, and I've tried setting "Content-Type" to "multipart/form-data" but none of these works.
How can I get NSURLSessionUploadTask
to properly upload these files (from an NSURL
) to the server?
This post seems to detail a similar problem: NSURLSessionUploadTask not passing file to php script
我在iOS应用程序中使用 我有一个在nginx下运行的PHP服务器(使用Laravel)来处理这个上传。 我已经用Postman对它进行了测试,它接受上传很好(期待一个名为“file”的文件)。 p>
当我运行上面的objc代码时,服务器告诉我没有文件 已经上传( 我尝试过设置“fileName”标头,但是我尝试过设置“ Content-Type“to”multipart / form-data“但这些都不起作用。 p>
如何让 这篇文章似乎详细说明了一个类似的问题: NSURLSessionUploadTask不将文件传递给php脚本 p>
div> NSURLSessionUploadTask code>创建了一个视频上传系统。 视频文件保存到
NSURL code>,因此我在上传方法中使用以下代码: p>
request.HTTPMethod = @“POST”;
[请求addValue:@“file”forHTTPHeaderField:@“fileName”];
//创建上传任务
NSURLSessionUploadTask * task = [session uploadTaskWithRequest:request fromFile:filePath completionHandler:^(NSData * data,NSURLResponse * 响应,NSError *错误){
if(!error){
// // handle success
} else {
// // handle error
}
}];
//运行任务\ n [任务恢复];
code> pre>
$ _ FILES code>数组为空)。 p>
NSURLSessionUploadTask code>正确上传这些文件(来自 NSURL code>)到服务器? p>
When using NSURLSessionUploadTask [uploadTaskWithRequest: fromFile:], the file is sent in the request body as binary.
To save that file in PHP you can simply get the request body and save it to file.
Obviously, it is best to do some sort of file format validation.
Objective-C Code:
// Define the Paths
NSURL *URL = [NSURL URLWithString:kDestinationURL];
// Create the Request
NSMutableURLRequest* request = [NSMutableURLRequest requestWithURL:URL];
[request setHTTPMethod:@"POST"];
// Configure the NSURL Session
NSURLSessionConfiguration *config = [NSURLSessionConfiguration backgroundSessionConfigurationWithIdentifier:@"com.upload"];
config.HTTPMaximumConnectionsPerHost = 1;
NSURLSession *session = [NSURLSession sessionWithConfiguration:config delegate:self delegateQueue:nil];
// Define the Upload task
NSURLSessionUploadTask *uploadTask = [session uploadTaskWithRequest:request fromFile:audioRecorder.url];
// Run it!
[uploadTask resume];
PHP Code:
<?php
// File Path to save file
$file = 'uploads/recording.m4v';
// Get the Request body
$request_body = @file_get_contents('php://input');
// Get some information on the file
$file_info = new finfo(FILEINFO_MIME);
// Extract the mime type
$mime_type = $file_info->buffer($request_body);
// Logic to deal with the type returned
switch($mime_type)
{
case "video/mp4; charset=binary":
// Write the request body to file
file_put_contents($file, $request_body);
break;
default:
// Handle wrong file type here
}
?>
I wrote a code example of recording audio and uploading it to a server here: https://github.com/gingofthesouth/Audio-Recording-Playback-and-Upload
I hope that helps.