草庐IT

php - 嵌入位于 webroot 之外的 flv 和 swf

coder 2024-04-19 原文

我有一个在 webroot 之外上传的脚本。然后,我通过该网站将用户链接到图像文档等。

因此对于图像,链接将是:

media.php?file=nameoffile.jpg&user=userid&folder=images

然后用于显示图像:

<img src="media.php?file=nameoffile.jpg&user=userid&folder=images" width="100" border="0">

这适用于图像并提供下载文档的链接。

我面临的问题是嵌入,我使用 ffmpeg 将所有允许的视频类型转换为 flv(这些视频已经过测试并且效果很好),但是当我尝试嵌入 flv 视频时它永远不起作用(它适用于直接链接文件只是不通过 media.php)。如果可能,我还想嵌入 .swf。

我正在使用 jwplayer 嵌入(使用文件的直接链接而不是通过 media.php)

        <!-- START OF THE PLAYER EMBEDDING TO COPY-PASTE --> 
            <object id="player" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" name="player" width="328" height="200"> 
            <param name="movie" value="player.swf" /> 
            <param name="allowfullscreen" value="true" /> 
            <param name="allowscriptaccess" value="always" /> 
            <param name="flashvars" value="media.php?file=nameoffile.flv&user=userid&folder=videos" /> 
            <embed 
                type="application/x-shockwave-flash"
                id="player2"
                name="player2"
                src="player.swf"
                width="328" 
                height="200"
                allowscriptaccess="always" 
                allowfullscreen="true"
                flashvars="file=media.php?file=nameoffile.flv&user=userid&folder=videos"
            /> 
            </object> 
            <script type="text/javascript" src="jwplayer.js"></script>
            <!-- END OF THE PLAYER EMBEDDING --> 

这是 media.php:

        $path_parts = pathinfo($_SERVER['REQUEST_URI']);
        $file = basename(urldecode($_GET['file']));
        $user = basename(urldecode($_GET['user']));
        $folder = basename(urldecode($_GET['folder']));
        $ext = pathinfo($file, PATHINFO_EXTENSION);

        $fileDir = 'pathoutsidewebroot';
        $filePath = $fileDir . $file;

        switch(
        $ext) {
            case "flv": $ctype="video/x-flv"; break;
            // adobe
            case "pdf": $ctype="application/pdf"; break;
            // ms office
            case "doc": $ctype="application/msword"; break;
            case "rtf": $ctype="application/rtf"; break;
            case "xls": $ctype="application/vnd.ms-excel"; break;
            case "ppt": $ctype="application/vnd.ms-powerpoint"; break;
            // open office
            case "odt": $ctype="application/vnd.oasis.opendocument.text"; break;
            case "ods": $ctype="application/vnd.oasis.opendocument.spreadsheet"; break;
            default: $ctype = "application/force-download"; break; 
}

        if(in_array($ext, $valid_formats_vid)){
            if (file_exists($filePath)) {
                header('Content-Type: ' . mime_content_type($filePath));
                header('Content-Length: ' . filesize($filePath));
                readfile($filePath);
        }
        }

        else if(in_array($ext, $valid_formats_img)) {
            if (file_exists($filePath)) {
                header('Content-Type: ' . mime_content_type($filePath));
                header('Content-Length: ' . filesize($filePath));
                readfile($filePath);
            }
        }
        else if(in_array($ext, $valid_formats_docs)) {
                    if (file_exists($filePath))
                    {
            header("Pragma: public");
            header("Expires: 0");
            header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
            header("Cache-Control: private",false);
            header("Content-Type: $ctype");
            header("Content-Disposition: attachment; filename=\"".basename($filePath)."\";");
            header("Content-Transfer-Encoding: binary");
            header("Content-Length: ".@filesize($filePath));
            set_time_limit(0);
            @readfile($filePath) or die("File not found.");                 }
        }

通过 media.php 嵌入的 header

Cache-Control:no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Connection:Keep-Alive
Content-Disposition:filename=encoded_2012-10-19_22.37.09_1359032866.flv
Content-Length:0
Content-Type:video/x-flv
Date:Thu, 24 Jan 2013 16:26:32 GMT
Expires:Thu, 19 Nov 1981 08:52:00 GMT
Keep-Alive:timeout=5, max=88
Pragma:no-cache
Server:Apache/2.2.20 (Ubuntu)
X-Powered-By:PHP/5.3.6-13ubuntu3.8

从直接链接到文件的 header (有效的那个)

Accept-Ranges:bytes
Connection:Keep-Alive
Content-Length:2428614
Content-Type:video/x-flv
Date:Thu, 24 Jan 2013 16:23:54 GMT
ETag:"26ca3d8-250ec6-4d4087c796500"
Keep-Alive:timeout=5, max=100
Last-Modified:Thu, 24 Jan 2013 13:07:00 GMT
Server:Apache/2.2.20 (Ubuntu)

设法通过 media.php 将其更改为此(但仍然无法正常工作)

            header("Content-Type: $ctype");
            header('Content-Length: ' . filesize($filePath));
            header('Accept-Ranges: bytes');
            $now = time( );
            $then = gmstrftime("%a, %d %b %Y %H:%M:%S GMT", $now + 365*86440);
            header("Expires: $then");
            ob_clean();
            flush();
            readfile($filePath);



Accept-Ranges:bytes
Cache-Control:no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Connection:Keep-Alive
Content-Length:2428614
Content-Type:video/x-flv
Date:Thu, 24 Jan 2013 16:44:18 GMT
Expires:Fri, 24 Jan 2014 20:47:38 GMT
Keep-Alive:timeout=5, max=79
Pragma:no-cache
Server:Apache/2.2.20 (Ubuntu)
X-Powered-By:PHP/5.3.6-13ubuntu3.8

最佳答案

问题出在这里:

flashvars="file=media.php?file=nameoffile.flv&user=userid&folder=videos"

flashvars 收到一个查询字符串,所以这被解释为

file   : media.php?file=nameoffile.flv
user   : userid
folder : videos

您需要对文件参数进行urlencode:

flashvars="file=media.php?file=nameoffile.flv&amp;user=userid&amp;folder=videos"

关于php - 嵌入位于 webroot 之外的 flv 和 swf,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14435451/

有关php - 嵌入位于 webroot 之外的 flv 和 swf的更多相关文章

  1. ruby - 为什么允许在 Ruby 类之外定义全局方法? - 2

    我读过这个:Let’sstartwithasimpleRubyprogram.We’llwriteamethodthatreturnsacheery,personalizedgreeting.defsay_goodnight(name)result="Goodnight,"+namereturnresultend我的理解是,方法是定义在类中的函数或子程序,可以关联到类(类方法)或对象(实例方法)。那么,如果它不是在类中定义的,怎么可能是方法呢? 最佳答案 当你在Ruby中以这种方式在全局范围内定义一个函数时,它在技术上变成了Obje

  2. Ruby 服务器在本地主机(teambox)之外非常慢 - 2

    我刚刚在我的Ubuntu9.10服务器上安装了TeamBox。我使用提供的服务器脚本在端口3000上启动并运行它。它的运行速度非常慢,从另一台计算机连接时每个HTTP请求最多需要30秒。我使用链接从shell加载TeamBox,一点也不花时间。然后我设置了一个SSH隧道,它再次运行得非常快。我通过此服务器上的apache以及SAMBA等运行了大约30个虚拟主机,没有任何问题。我该如何解决这个问题? 最佳答案 我的redmine(ruby,webrick)太慢了。现在我解决了这个问题:apt-getinstallmongrelruby

  3. ruby-on-rails - 当需要 active_support 时,cattr_accessor 不工作(在 rails 之外)? - 2

    我不熟悉active_support,所以请多多包涵!Fox'slibrary允许通过谷歌的API进行搜索,但它需要积极的支持。我似乎无法让它工作!有什么想法吗?require'rubygems'require'active_support'require'google_search'pGoogleSearch.web:q=>"HelloWorld!"给我:NoMethodError:undefinedmethod‘cattr_accessor’forGoogleSearch:Class知道我做错了什么吗? 最佳答案 通过更多的谷歌

  4. ruby-on-rails - 如何解析位于 Amazon S3 存储桶中的 CSV 文件 - 2

    下面是我用来从应用程序中解析CSV的代码,但我想解析位于AmazonS3存储桶中的文件。当推送到Heroku时它也需要工作。namespace:csvimportdodesc"ImportCSVDatatoInventory."task:wiwt=>:environmentdorequire'csv'csv_file_path=Rails.root.join('public','wiwt.csv.txt')CSV.foreach(csv_file_path)do|row|p=Wiwt.create!({:user_id=>row[0],:date_worn=>row[1],:inven

  5. ruby - 在 ruby​​ 中对字符串进行排序以使空字符串位于末尾的好方法是什么? - 2

    在Ruby中,默认排序将空字符串放在第一位。['','g','z','a','r','u','','n'].sort给予:["","","a","g","n","r","u","z"]但是,在end处需要空字符串是很常见的。做类似的事情:['','g','z','a','r','u','','n'].sort{|a,b|a[0]&&b[0]?ab:a[0]?-1:b[0]?1:0}工作并给予:["a","g","n","r","u","z","",""]但是,这不是很可读,也不是很灵活。在Ruby中是否有一种合理且干净的方法让sort将空字符串放在最后?只映射到一个没有空字符串的数组,

  6. ruby-on-rails - 这个 C 和 PHP 程序员如何学习 Ruby 和 Rails? - 2

    按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visitthehelpcenter指导。关闭9年前。我来自C、php和bash背景,很容易学习,因为它们都有相同的C结构,我可以将其与我已经知道的联系起来。然后2年前我学了Python并且学得很好,Python对我来说比Ruby更容易学。然后从去年开始,我一直在尝试学习Ruby,然后是Rails,我承认,直到现在我还是学不会,讽刺的是那些打着简单易学的烙印,但是对于我这样一个老练的程序员来说,我只是无法将它

  7. Ruby,我如何访问 do - end 循环之外的局部变量 - 2

    我有一个循环,我在远程机器上执行一系列命令:ssh.exec('cd/vmfs/volumes/4c6d95d2-b1923d5d-4dd7-f4ce46baaadc/ghettoVCB;./ghettoVCB.sh-fvms_to_backup-ddryrun')do|ch,stream,data|if#{stream}=~/vmupgrade/putsvalue_hosts+"is"+dataputs#{stream}putsdataendend我想在do-end循环之外访问#{stream}和数据如果有任何帮助,我将不胜感激。谢谢,嗨,约格,我实现了您的建议,但现在出现错误:Wr

  8. ruby - 使用 Foreman 启动位于不同目录的 Rack App - 2

    我有一个成功运行多个进程的Procfile设置:#/Procfileredis:bundleexecredis-serversidekiq:bundleexecsidekiq-v-C./config.ymlforward:forward4567mock-api我需要再添加一个进程-一个位于我机器上不同目录中的Sinatra应用程序。如果我cd到该目录,我可以从终端启动它:$rackup-p4567我可以使用终端从不同的目录启动它:$sh-c'cd/Path/to/project/&&execrackup-p4567'但是我应该如何使用工头来做到这一点。我尝试添加以下内容,但它无声地失败

  9. ruby - 在描述之外使用 RSpec 的 "expect"等...它会阻止 - 2

    我正在构建一个网络应用程序自动化框架,旨在允许:当然是自动化任务轻松构建测试场景我正在使用Capybara与浏览器通信,我有一个组件库,其中包含许多辅助函数(login_to_the_back_office、create_customer等)。现在我希望我的组件可以独立使用,也可以在RSpec测试中使用。这意味着我的组件(包含在库中)没有环绕describe...it...默认情况下会阻塞,但在测试使用它们时它们会在某个时候出现,因此它们应该使用expect和friend尽可能多。我关注了rspec's.shouldfails(outsidedescribe/itblock)inRub

  10. ruby-on-rails - 我如何在邮件程序之外使用 Devise 的 `confirmation_url`? - 2

    我在Rails项目中使用Devise。我想将确认网址传递给第三方。该url由以下DeviseMailerView中的表达式confirmation_url(@resource,confirmation_token:@token)生成:https://github.com/plataformatec/devise/blob/master/app/views/devise/mailer/confirmation_instructions.html.erb我已经grep了Devise的整个源代码,试图找出confirmation_url定义的人或位置,但我找不到任何东西;它只出现在View中

随机推荐