使用Cake版本2.4.3稳定
所以我有时间在这里,我修改了这个插件,将文件保存到app文件夹https://github.com/srs81/CakePHP-AjaxMultiUpload/
上传的文件正保存到/ public_html / app / files
现在奇怪的是,当尝试将这些文件提供给视图时,我可以读取文件名,文件大小,但不能读取文件本身,图像,pdf等。
当我尝试通过直接网址访问该文件时,我收到此错误:
错误:找不到FilesController。
我怎么能读取文件名,文件大小,而不是文件本身?
需要将文件保存在app文件夹中。这些文件应受到保护,因此只有登录到应用程序的用户才能访问。我试过使用cake send file response没有结果。
编辑:我想这里真正的问题是如何从APP读取文件。 DS。 '文件'?
查看代码:
public function view ($model, $id, $edit=false) {
$results = $this->listing ($model, $id);
$directory = $results['directory'];
$baseUrl = $results['baseUrl'];
$files = $results['files'];
$str = "<dt>" . __("Pictures") . "</dt>\n<dd>";
$count = 0;
$webroot = Router::url("/") . "ajax_multi_upload";
foreach ($files as $file) {
$type = pathinfo($file, PATHINFO_EXTENSION);
$filesize = $this->format_bytes (filesize ($file));
$f = basename($file);
$url = $baseUrl . "/$f";
if ($edit) {
$baseEncFile = base64_encode ($file);
$delUrl = "$webroot/uploads/delete/$baseEncFile/";
$str .= "<a href='$delUrl'><img src='" . Router::url("/") .
"ajax_multi_upload/img/delete.png' alt='Delete' /></a> ";
}
$str .= "<img src='$url' /> ";
$str .= "<a href='$url'>" . $f . "</a> ($filesize)";
$str .= "<br />\n";
}
$str .= "</dd>\n";
return $str;
}
上传/保存
public function upload($dir=null) {
// max file size in bytes
$size = Configure::read ('AMU.filesizeMB');
if (strlen($size) < 1) $size = 20;
$relPath = Configure::read ('AMU.directory');
if (strlen($relPath) < 1) $relPath = "files";
$sizeLimit = $size * 1024 * 1024;
$this->layout = "ajax";
Configure::write('debug', 0);
$directory = APP . DS . $relPath;
if ($dir === null) {
$this->set("result", "{\"error\":\"Upload controller was passed a null value.\"}");
return;
}
// Replace underscores delimiter with slash
$dir = str_replace ("___", "/", $dir);
$dir = $directory . DS . "$dir/";
if (!file_exists($dir)) {
mkdir($dir, 0777, true);
}
$uploader = new qqFileUploader($this->allowedExtensions,
$sizeLimit);
$result = $uploader->handleUpload($dir);
$this->set("result", htmlspecialchars(json_encode($result), ENT_NOQUOTES));
}
原始插件的唯一真正变化是将WWWROOT更改为APP以进行切换。保存工作很好,很可爱。但奇怪的是,我可以读取文件名,视图中的文件大小没问题,但无法查看图像,pdf等。
答案 0 :(得分:4)
问题:
您无法通过直接网址显示webroot之外的文件 - 这是将它们置于首先位于webroot之上的重点 - 使其无法直接访问。
因此,首先在控制器中构建图像src路径(无论如何都不是好的做法)不会改变当该路径到达浏览器时的事实,并且它会在尝试从上方拉出图像时读取图像的来源webroot,它不会/不能。
解决方案:
解决方案是使用CakePHP's Sending files(曾经是Media Views)。然后,将img的“src”设置为控制器/动作。在该动作中,它基本上表示“将此动作显示为图像”(或pdf,或其他任何内容)。
在Controller中使用的路径:
从我的一个应用程序中获取了这个,这正是上面所做的,这里是我用于“文件”中文件的路径(与webroot相同):
file_exists(APP . 'files' . DS . $your_filename)
答案 1 :(得分:1)
创建指向webroot内部文件夹的符号链接; - )