遇到未捕获的异常类型:ImagickException消息:无法在Codeigniter中读取文件

时间:2018-08-04 16:00:41

标签: php codeigniter

下面的php pdf到imageigniter框架中的imagick图像代码在控制器中有问题,imagick无法读取我的文件pdf。

错误:

  

[codeigniter] 遇到未捕获的异常类型:ImagickException消息:无法在Codeigniter中读取文件。

控制器:

<?php defined('BASEPATH') OR exit('No direct script access allowed');
class Files_upload extends CI_Controller {
    function  __construct() {
        parent::__construct();
        $this->load->model('files');
    }    

    function index(){
        $data['gallery'] = $this->db->query("select * from gallery order by id desc limit 10")->result();
        $data = array();
        if($this->input->post('submitForm') && !empty($_FILES['upload_Files']['name'])){
            $filesCount = count($_FILES['upload_Files']['name']);
            for($i = 0; $i < $filesCount; $i++){
                $_FILES['upload_File']['name'] = $_FILES['upload_Files']['name'][$i];
                $_FILES['upload_File']['type'] = $_FILES['upload_Files']['type'][$i];
                $_FILES['upload_File']['tmp_name'] = $_FILES['upload_Files']['tmp_name'][$i];
                $_FILES['upload_File']['error'] = $_FILES['upload_Files']['error'][$i];
                $_FILES['upload_File']['size'] = $_FILES['upload_Files']['size'][$i];
                $uploadPath = 'uploads/files/';
                $config['upload_path'] = $uploadPath;
                $config['allowed_types'] = 'gif|jpg|png|pdf|mp4|avi';                
                $this->load->library('upload', $config);
                $this->upload->initialize($config);
                if($this->upload->do_upload('upload_File')){
                    $fileData = $this->upload->data();
                    $uploadData[$i]['file_name'] = $fileData['file_name'];
                    $uploadData[$i]['created'] = date("Y-m-d H:i:s");
                    $uploadData[$i]['modified'] = date("Y-m-d H:i:s");
                }
            }            
            if(!empty($uploadData)){
                //Insert file information into the database
                $insert = $this->files->insert($uploadData);
                $statusMsg = $insert?'Files uploaded successfully.':'Some problem occurred, please try again.';
                $this->session->set_flashdata('statusMsg',$statusMsg);
            }

            $this->load->helper('url');

            $ImageName      = $_FILES['upload_File']['name'];
            $loc =  base_url().$uploadPath.$ImageName;   

            echo $ImageName;
            echo $loc;                                

            $im = new imagick($loc);
            $noOfPagesInPDF = $im->getNumberImages(); 

            if ($noOfPagesInPDF) { 
                for ($i = 0; $i < 1; $i++) { 
                    $url = $loc.'['.$i.']'; 
                    $image = new Imagick($url);
                    $image->setImageFormat("jpg"); 
                    $image->setImageCompressionQuality(80); 
                    $image->writeImage("uploads/files/img/".($i+1).'-'.$ImageName.'.jpg'); 
                }
            }
            for($i = 0; $i<1;$i++) {
                $img = "uploads/files/img/".($i+1).'-'.$ImageName.'.jpg';
                $display .= "<img src='$img' title='Page-$i' /><br>";            
            }
            $message = "PDF converted to JPEG sucessfully!!";
        }
        //Get files data from database
        $data['gallery'] = $this->files->getRows();
        //Pass the files data to view
        $this->load->view('files_upload/index', $data);
    }
}

已解决

是正确的密码

$ImageName= $fileData['file_name'];
$loc =  realpath(APPPATH.'../uploads/files/').'/'.$ImageName;

或者您可以做

$loc = $fileData['full_path'];

1 个答案:

答案 0 :(得分:0)

这将起作用(经过测试):

    //$data['gallery'] = $this->db->query("select * from gallery order by id desc limit 10")->result(); // same at bottom??
    $message = '';
    $display = '';
    if ($this->input->post('submitForm') && !empty($_FILES['userfile']['name'])) {
        $uploadPath = FCPATH . 'uploads/files/';
        if (!is_dir($uploadPath) && mkdir($uploadPath, DIR_WRITE_MODE, true) == false) {
            show_error('Folder cannot be made!');
        }
        $config['upload_path'] = $uploadPath;
        $config['allowed_types'] = 'gif|jpg|png|pdf|mp4|avi';
        $this->load->library('upload', $config);
        // change input field to <input type="file" name="userfile">
        if (!$this->upload->do_upload()) {
            $this->session->set_flashdata('statusMsg', $this->upload->display_errors());
        } else {
            $fileData = $this->upload->data();
            $uploadData['file_name'] = $fileData['file_name'];
            $uploadData['created'] = date("Y-m-d H:i:s");
            $uploadData['modified'] = date("Y-m-d H:i:s");
            $insert = $this->files->insert($uploadData);
            $insert = true;
            if (!$insert) {
                @unlink($fileData['full_path']); // remove orphan
                $this->session->set_flashdata('statusMsg', 'Database error. Please try again');
            } else {
                $this->session->set_flashdata('statusMsg', 'Files uploaded successfully.');
                if ($fileData['file_ext'] == '.pdf') {
                    try {
                        $newPath = $uploadPath . 'img/';
                        if (!is_dir($newPath) && mkdir($newPath, DIR_WRITE_MODE, true) == false) {
                            throw new Exception('Folder cannot be made!');
                        }
                        $ImageName = $fileData['raw_name'];
                        $loc = $fileData['full_path'];
                        $im = new Imagick($loc);
                        $pdfPageCount = $im->getNumberImages();
                        if ($pdfPageCount > 0) {
                            for ($i = 0; $i < $pdfPageCount; $i++) {
                                $url = $loc . '[' . $i . ']';
                                $image = new Imagick($url);
                                $image->setImageFormat("jpg");
                                $image->setImageCompressionQuality(80);
                                $image->writeImage($newPath . ($i + 1) . '-' . $ImageName . '.jpg');
                                $img = base_url("uploads/files/img/" . ($i + 1) . '-' . $ImageName . '.jpg');
                                $display .= "<img src='$img' title='Page-$i' /><br>";
                            }
                            echo $display; // debugging
                            $this->session->set_flashdata('statusMsg', "PDF converted to JPEG(s) sucessfully!");
                        }
                    } catch (Exception $e) {
                        @unlink($fileData['full_path']); // remove orphan
                        $this->session->set_flashdata('statusMsg', $e->getMessage());
                    }
                } else {
                    echo 'not a pdf'; // debugging only
                }
            }
        }
    }
    //Get files data from database
    $data['gallery'] = $this->files->getRows();
    //Pass the files data to view
    $this->load->view('files_upload/index', $data);

请注意,输入文件字段现在应如下所示:

<input type="file" name="userfile" />

您还必须进行修改:

$this->files->insert($uploadData)功能