我正在尝试将大型视频从iPhone上传到具有php脚本的Web服务器。
我正在使用NSInputStream
获取文件视频块,并在每次遍历时创建一个请求(POST)
- (void)stream:(NSStream *)stream handleEvent:(NSStreamEvent)eventCode
方法,将读取的数据作为参数传递。
这是我用来获取数据块的代码
- (void)stream:(NSStream *)stream handleEvent:(NSStreamEvent)eventCode
{
switch(eventCode)
{
case NSStreamEventHasBytesAvailable:
{
NSMutableData *dataSlice;
uint8_t buf[1048576];
unsigned int len = 0;
len = [(NSInputStream *)stream read:buf maxLength:1048576];
if(len)
{
dataSlice = [NSMutableData dataWithBytes:(const void *)buf length:len];
NSMutableDictionary* params = [NSMutableDictionary dictionaryWithObjectsAndKeys:folderNameForUpload, kFolderName,
@"abcd.MOV", kFileName,
@"MOV", kFileType,
nil];
MKNetworkOperation *op = [self.networkEngine operationWithPath:@"upload.php" params:params httpMethod:@"POST"];
[op addData:dataSlice forKey: @"file"
mimeType: @"image/mov"
fileName: @"abcd"];
[op onCompletion:^(MKNetworkOperation *completedOperation) {
} onError:^(NSError *error) {
}];
[[WebRequest sharedInstance].networkEngine enqueueOperation: op];
}
else
{
NSLog(@"NO MORE BUFFER!");
}
break;
}
case NSStreamEventEndEncountered:
{
[stream close];
[stream removeFromRunLoop:[NSRunLoop currentRunLoop]
forMode:NSDefaultRunLoopMode];
[stream release];
stream = nil;
break;
}
}
}
它正在将数据发送到服务器,并且我能够将这些块写入文件中。但是,问题是,如果有多个块,文件将被损坏,而我无法打开视频文件。
我检查了服务器和客户端上的文件大小,两者完全相同。
以下是php脚本,我用于合并视频文件块。
$tmp_file = $_FILES['file']['tmp_name'];
$write_handle = fopen($fileURL, "ab+");
$read_handle = fopen($tmp_file, "rb");
$contents = fread($read_handle, filesize($tmp_file));
fwrite($write_handle, $contents);
fclose($write_handle);
fclose($read_handle);
我在这里做错了什么?,请帮忙!
我被这个问题困住了!!
提前致谢,
苏拉杰
最佳答案
我自己遇到了问题。实际上,我同时发送了不同的视频块。出现问题的原因是,随后的视频块在第一部分视频之前到达服务器。
我仅在第一个视频块到达Web服务器并且在客户端获得响应后才发送第二个视频块,从而解决了该问题。
关于php - 从iPhone将大型视频上传到Web服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13288969/