我有一个在 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&user=userid&folder=videos"
关于php - 嵌入位于 webroot 之外的 flv 和 swf,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14435451/
我读过这个:Let’sstartwithasimpleRubyprogram.We’llwriteamethodthatreturnsacheery,personalizedgreeting.defsay_goodnight(name)result="Goodnight,"+namereturnresultend我的理解是,方法是定义在类中的函数或子程序,可以关联到类(类方法)或对象(实例方法)。那么,如果它不是在类中定义的,怎么可能是方法呢? 最佳答案 当你在Ruby中以这种方式在全局范围内定义一个函数时,它在技术上变成了Obje
我刚刚在我的Ubuntu9.10服务器上安装了TeamBox。我使用提供的服务器脚本在端口3000上启动并运行它。它的运行速度非常慢,从另一台计算机连接时每个HTTP请求最多需要30秒。我使用链接从shell加载TeamBox,一点也不花时间。然后我设置了一个SSH隧道,它再次运行得非常快。我通过此服务器上的apache以及SAMBA等运行了大约30个虚拟主机,没有任何问题。我该如何解决这个问题? 最佳答案 我的redmine(ruby,webrick)太慢了。现在我解决了这个问题:apt-getinstallmongrelruby
我不熟悉active_support,所以请多多包涵!Fox'slibrary允许通过谷歌的API进行搜索,但它需要积极的支持。我似乎无法让它工作!有什么想法吗?require'rubygems'require'active_support'require'google_search'pGoogleSearch.web:q=>"HelloWorld!"给我:NoMethodError:undefinedmethod‘cattr_accessor’forGoogleSearch:Class知道我做错了什么吗? 最佳答案 通过更多的谷歌
下面是我用来从应用程序中解析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
在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将空字符串放在最后?只映射到一个没有空字符串的数组,
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visitthehelpcenter指导。关闭9年前。我来自C、php和bash背景,很容易学习,因为它们都有相同的C结构,我可以将其与我已经知道的联系起来。然后2年前我学了Python并且学得很好,Python对我来说比Ruby更容易学。然后从去年开始,我一直在尝试学习Ruby,然后是Rails,我承认,直到现在我还是学不会,讽刺的是那些打着简单易学的烙印,但是对于我这样一个老练的程序员来说,我只是无法将它
我有一个循环,我在远程机器上执行一系列命令: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
我有一个成功运行多个进程的Procfile设置:#/Procfileredis:bundleexecredis-serversidekiq:bundleexecsidekiq-v-C./config.ymlforward:forward4567mock-api我需要再添加一个进程-一个位于我机器上不同目录中的Sinatra应用程序。如果我cd到该目录,我可以从终端启动它:$rackup-p4567我可以使用终端从不同的目录启动它:$sh-c'cd/Path/to/project/&&execrackup-p4567'但是我应该如何使用工头来做到这一点。我尝试添加以下内容,但它无声地失败
我正在构建一个网络应用程序自动化框架,旨在允许:当然是自动化任务轻松构建测试场景我正在使用Capybara与浏览器通信,我有一个组件库,其中包含许多辅助函数(login_to_the_back_office、create_customer等)。现在我希望我的组件可以独立使用,也可以在RSpec测试中使用。这意味着我的组件(包含在库中)没有环绕describe...it...默认情况下会阻塞,但在测试使用它们时它们会在某个时候出现,因此它们应该使用expect和friend尽可能多。我关注了rspec's.shouldfails(outsidedescribe/itblock)inRub
我在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中