将大型视频文件上传到服务器,解决方案?

Posted

技术标签:

【中文标题】将大型视频文件上传到服务器,解决方案?【英文标题】:Uploading Large Video Files to server, solution? 【发布时间】:2011-08-03 12:28:21 【问题描述】:

我花了几个小时阅读有关如何将大文件上传到服务器的信息。这些视频文件将有数百兆字节,并且是 .mp4 格式。

我的第一次尝试是使用 php 处理 POST,但由于 php.ini 和 httpd.conf 的限制,这不适用于 2 MB 以上的文件。

一些用户只是将这些限制增加到他们需要的级别,并希望上传能够正常工作。

一些网站似乎在使用 Flash 上传器,但我尝试过的那些很难,并且从未明确提及它们是否解决了上传大小问题。

我还研究了使用 PHP 作为客户端的 FTP,但我发现的所有示例都只是在文件发布后将文件传输到 FTP 服务器。使用单独客户端的 FTP 是不可能的,因为文件名和相关数据存储在数据库中。

目前,我在 localhost 上运行,该站点将由我可以物理访问的盒子提供服务,但我仍然对增加 max_upload_size 和相关要求持谨慎态度,因为最终我想转移到托管服务。

最好的解决方案是什么?有没有办法严格通过 PHP 和 html 上传大文件?如果没有,在上传大文件的同时仍然能够将文件名传递给数据库的最佳解决方案是什么?

感谢所有回答的人

【问题讨论】:

不确定是谁否决了这个问题,但我认为这是一个有效的问题!尽管在 asp.net 上我们也面临同样的问题,但同样的 Web 服务器规则和 HTTP 限制适用。 我已将 Apache 上传限制增加到 1GB,然后告诉我的用户如何在上传之前压缩视频***.com/a/19630697/74585 【参考方案1】:

我认为使用 PHP 进行编程总是会以 HTTP 文件上传的限制而告终。我会使用像 Simple2FTP 这样的应用程序,而不是尝试编写在 PHP 中可行的东西。 http://www.simple2ftp.com 使用 PHP 脚本来处理用户和管理文件,使用 javascript 来通过 FTP 进行实际上传。

【讨论】:

谁知道有没有像 Simple2FTP for asp.net 这样的解决方案?【参考方案2】:
NSString *LAction=@"post_add";
            NSString *urlstring=[appDelegate.SmartAutoString stringByAppendingPathComponent:[NSString stringWithFormat:@"smartautoXml.php"]];
            //NSLog(@"urlstring....%@",urlstring);
            NSURL *nsurl =[NSURL URLWithString:urlstring];
            NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init];
            [request setURL:nsurl];
            [request setHTTPMethod:@"POST"];
            NSString *boundary = @"---------------------------14737809831466499882746641449";
            NSString *contentType = [NSString stringWithFormat:@"multipart/form-data; boundary=%@",boundary];
            [request addValue:contentType forHTTPHeaderField: @"Content-Type"];
            NSMutableData *body = [NSMutableData data];

  NSData *videoData;
            NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory , NSUserDomainMask, YES);
            NSString *documentsDir = [paths objectAtIndex:0];
            NSString *pdfPath=[documentsDir stringByAppendingFormat:@"/video.mp4"];
            NSLog(@"%@",pdfPath);
            if ([[NSFileManager defaultManager] fileExistsAtPath:pdfPath])
            
                NSLog(@"exist");

                videoData = [NSData dataWithContentsOfFile:pdfPath];


            


            if (videoData)
            

                [body appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]];
                NSString *temp=[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"video\"; filename=\"video.mp4\"\r\n"];
                [body appendData:[[NSString stringWithString:temp] dataUsingEncoding:NSUTF8StringEncoding]];
                NSLog(@"temp %@",temp);

                [body appendData:[@"Content-Type:  video/mp4\r\n\r\n" dataUsingEncoding:NSUTF8StringEncoding]];
                [body appendData:[NSData dataWithData:videoData]];
                [body appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]];


            else
            

                NSLog(@"NOT Data");

            
            videoData=nil;

            [request setHTTPBody:body];
            NSLog(@"logoooooooo---q-%@",request);

            NSLog(@"URLTwo Vedio==> %@?action=%@&userId=%@&postId=%@",urlstring,LAction,appDelegate.userId,stringReturnXmlOne);

            con = [[NSURLConnection alloc] initWithRequest:request delegate:self];
                   
            if (con)
            
                self.receivedData = [[NSMutableData alloc]init];
                NSMutableData *data = [[NSMutableData alloc] init];
                self.receivedData = data;
                NSLog(@"RECIEVED DATA Video %@",self.receivedData);
            
            else
            
                [activityIndicator stopAnimating];
                UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Error"   message:@"Error connecting to remote server"  delegate:self
                                                      cancelButtonTitle:@"OK"  otherButtonTitles:nil];
                [alert show];
            


    

    NSLog(@"Finish Video");

    

【讨论】:

【参考方案3】:

标准的基于表单的文件上传不适用于您,因为文件是在单个 HTTP POST 请求中上传的。

    Web 服务器通常无法接受大型 HTTP 请求。 上传过程很长。如果出现连接问题,用户必须重新开始。

如果您正在寻找网站内置的解决方案,您应该考虑使用一些上传组件,它可以在客户端将文件压缩成块,在单独的请求中发送每个块并将文件放在服务器上。这些组件用作浏览器扩展。尽管现在每个人都沉迷于 HTML5,没有人喜欢 Java 小程序和 ActiveX 组件,但 Java/ActiveX 最适合您的任务。

【讨论】:

【参考方案4】:

尝试使用 http 请求作为字节手动上传文件。并且当您控制双方(客户端和服务器)时。您可以在标题中传递完整的文件名。

【讨论】:

这只是一种通用的方法,更不用说一种适用的技术了。

以上是关于将大型视频文件上传到服务器,解决方案?的主要内容,如果未能解决你的问题,请参考以下文章

SpringCloud上传大型视频文件到服务器,解决方案

csharp上传大型视频文件到服务器,解决方案

csharp上传大型视频文件到服务器,解决方案

PHP上传大型视频文件到服务器,解决方案

PHP上传大型视频文件到服务器,解决方案

使用 iOS SDK 将大型视频上传到 Facebook