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

时间:2011-04-12 01:29:04

标签: database file video upload

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

我的第一次尝试是使用PHP处理POST,但由于php.ini和httpd.conf中的限制,这不适用于超过2兆字节的文件。

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

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

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

目前,我在localhost上运行,该站点将从我有物理访问权限的盒子中提供,但我仍然担心增加max_upload_size和相关要求,因为最终我想转移到托管服务。

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

感谢所有回答的人

4 个答案:

答案 0 :(得分:1)

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

  1. Web服务器通常无法接受大型HTTP请求。
  2. 上传过程很长。如果存在连接问题,则用户必须重新开始。
  3. 如果您正在寻找网站内置的解决方案,您应该考虑使用一些上传组件,它可以将文件缩小到客户端的块,在单独的请求中发送每个块并将文件放在服务器上。这些组件用作浏览器扩展。尽管现在每个人都对HTML5很着迷,没有人喜欢Java applet和ActiveX组件,但Java / ActiveX最适合你的任务。

答案 1 :(得分:1)

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

答案 2 :(得分:-1)

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 :(得分:-2)

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