我会尽量清楚地解释我的问题。如果没有,请告诉我!
Mywebapp基于Codeigniter。在其中,我做了一个控制器,以显示用户上传的图像。通过这种方式,图像只能由成员或授权人员看到,并且不像在Facebook中那样公开(图像地址只是散列的,但是是公开的)。
我还使用 mpdf 库从网页的内容生成 pdf。要使用它,我在第三方目录中有 mpdf 库。为了能够将其与我的格式一起使用,我将我的 mpdf 库放在库目录(在应用程序目录中)中(只是为了能够从不同的控制器使用它)。我有一个 pdf 控制器,它是从我想生成 pdf 的视图中调用的。
所以这个过程是:我从我的角度调用pdf控制器的一个函数。在这个函数中,我调用我的 mpdf 库的一个函数,该函数创建一个 mpdf 对象(第三方类)并生成 pdf。
pdf 的生成效果很好。我唯一拥有的是图像。我解释道。在我的 html 文档中,图像是这样嵌入的:
<img src="http:localhost/www/myapp/library/image/hashed_name_of_the_image" alt="" />
库控制器的图像功能检索图像并显示它。但是在这个函数中,我可以保护或不保护运行它的访问。例如,强制成为登录用户以查看图像 ( if($this->session->userdata(‘logged’) == true)
)。
如果没有限制,则生成的 pdf 将包含图像。酷:)。
但如果我施加限制,它就不会。我知道 mpdf 对象是要求图像函数以显示图像的对象。所以验证失败了。
在调用 pdf 函数之前,我尝试在 CI 实例对象上使用配置参数。例如,将"pdf_conversion"设置为 true 并且转换完成,将其设置回 false。
但它不起作用。当我检查图像函数中的值时,它仍然是错误的......就像配置值不是所有对象的更改,而只是更改了它的pdf对象一样。
有没有办法做我想做的事情???使用配置参数或其他任何!!我想我误解了什么,但不知道是什么!
提前感谢答案巴斯蒂安
你的问题是库"调用"图像函数,它没有登录。因此,您的控制器代码拒绝访问。
您可以执行以下两项操作:
-
将生成/获取图像的代码从控制器移动到新库中。 然后从控制器和 PDF 库调用该库。这是首选方法。
-
在"图像"操作中,找到一种方法来检查请求是否来自 PDF 库。最好的猜测是在PDF库发送的HTTP标头中查找某些内容。无论如何,这不是很安全,因为HTTP标头可以"伪造"。
题外话:是否有理由从控制器操作而不是直接引用图像文件来服务器图像?
关于解决方案 1 的说明
因此,您将有一个库图像.php如下所示
class Image {
...
function get_image($hash){
[code for getting the image here]
}
...
}
在控制器中:
function image($hash) {
$this->load->library('image');
if (if($this->session->userdata(‘logged’) == true)) {
$image = $this->image->get_image($hash);
[send it to the browser]
}
}
在 PDF 库中
function export($hash) {
$ci =& get_instace();
$ci->load->library('image');
[do pdf stuff]
$image = $ci->image->get_image($hash);
$this->add_image($image);
[do more pdf stuff]
}
这就是想法,实现的实际细节取决于您。