2011-12-04 45 views
15

Trong dự án CodeIgniter của tôi, tôi đang tải lên tệp trong quá trình tạo dự án. Dưới đây là các chức năng tải lên:Tải lên nhiều tệp trong CodeIgniter

function uploadFiles(){ 

    $this->load->library('upload'); 
    $error = 0;  
    $projectName = $_POST['projectname']; 
    mkdir('./uploads/'.$projectName); 

    for($i=0; $i<count($_FILES); $i++) 
    { 

     $_FILES['userfile']['name'] = $_FILES['files']['name'][$i]; 
     $_FILES['userfile']['type'] = $_FILES['files']['type'][$i]; 
     $_FILES['userfile']['tmp_name'] = $_FILES['files']['tmp_name'][$i]; 
     $_FILES['userfile']['error']  = $_FILES['files']['error'][$i]; 
     $_FILES['userfile']['size'] = $_FILES['files']['size'][$i]; 

     $config['upload_path'] = './uploads/'.$projectName; 
     $config['allowed_types'] = 'xml|etl'; 
     $config['max_size']  = '0'; 
     $config['overwrite']  = TRUE; 

     $this->upload->initialize($config); 

     if($this->upload->do_upload()) 
     { 
     $error += 0; 
     }else{ 
     $error += 1; 
     } 
    } 

    if($error > 0){ return FALSE; }else{ return TRUE; } 

} 

Và tôi gọi hàm này trong hàm create_project như thế này:

public function create_project() { 
    $this->load->library('form_validation'); 

    $this->form_validation->set_rules('projectname', 'Project name', 'required'); 

    $this->form_validation->set_message('required', 'This is an obligatory field'); 

    if($this->form_validation->run() == FALSE) { 
     $this->load->view('project_creation_view'); 
    } else { 
     $this->load->model('Project_management_model'); 
     $this->Project_management_model->create_project(); 
     $this->uploadFiles(); 
    } 
} 

Tuy nhiên điều này không làm gì cả. Các tệp không được tải lên. Ngay cả một thư mục trống không được tạo ra. Ai có thể giúp tôi để tìm lỗi?

Cảm ơn.

+0

kiểm tra trang roytuts.com/codeigniter-multiple-files-upload/ – user3470953

Trả lời

20

Bạn có thể tải bất kỳ số lượng tập tin ..

$config['upload_path'] = 'upload/Main_category_product/'; 
$path=$config['upload_path']; 
$config['allowed_types'] = 'gif|jpg|jpeg|png'; 
$config['max_size'] = '1024'; 
$config['max_width'] = '1920'; 
$config['max_height'] = '1280'; 
$this->load->library('upload', $config); 

foreach ($_FILES as $fieldname => $fileObject) //fieldname is the form field name 
{ 
    if (!empty($fileObject['name'])) 
    { 
     $this->upload->initialize($config); 
     if (!$this->upload->do_upload($fieldname)) 
     { 
      $errors = $this->upload->display_errors(); 
      flashMsg($errors); 
     } 
     else 
     { 
      // Code After Files Upload Success GOES HERE 
     } 
    } 
} 
+1

Có cài đặt cho số lượng tệp không? Tôi chỉ có thể tải lên 20 với mã codeigniter của tôi và nó không khác nhiều so với điều này. – jason

+0

+1 cho '$ this-> upload-> initialize()' – Jonah

+4

Nó cho tôi lỗi is_uploaded_file() hy vọng tham số 1 là chuỗi, mảng đã cho, như tôi đã cố gắng gỡ lỗi, $ fieldname là một mảng. – zoom

0

Tôi nghĩ rằng bạn bỏ lỡ này:

 
$config['file_name']  = 'somename_'.$i; 
$config['upload_path'] = './uploads/'.$projectName; 
... 
+0

Cảm ơn. Nhưng nó không giúp được gì. – cycero

2

Đây là một phần mở rộng của lớp CI_Upload mà tôi sửa đổi để upload nhiều file, chỉ cần sao chép này vào file MY_Upload.php. Nó cũng làm cho thư mục là tốt.

http://pastebin.com/g9J6RxW1

Sau đó, tất cả các bạn cần làm trong chức năng điều khiển là sắp xếp các file của bạn vào một mảng, nơi tên của lĩnh vực này và phím là các phím mảng và cấu hình là các dữ liệu. Trong trường hợp bạn giống như thế này:

$project_files['files'][0] = array(
      'upload_path' => './uploads/'.$projectName.'/', 
      'max_size' => 0, 
      'allowed_types' => 'xml|etl', 
      'overwrite' => TRUE, 
      'remove_spaces' => TRUE, 
     ); 
$project_files['files'][1] = array(
      'upload_path' => './uploads/'.$projectName.'/', 
      'max_size' => 0, 
      'allowed_types' => 'xml|etl', 
      'overwrite' => TRUE, 
      'remove_spaces' => TRUE, 
     ); 

NẾU tất cả các cấu hình đều giống nhau chỉ cần tạo vòng lặp để thiết lập, nó cũng sẽ có 'các phím được đặt tên', tức là. $project_files['files']['file_key'].

sau đó chỉ cần gọi:

if($this->upload->upload_files($project_files)){/*all files uploaded successfully*/} 
0

tưởng tôi thấy câu hỏi này cùng chính xác ở đây trước;)

Hãy thử xuất ra $ this-> upload-> display_errors() nơi bạn đang incrementing lỗi $ biến. Điều đó sẽ cho bạn biết chính xác những gì đã đi sai. Tiền của tôi về quyền ...

0

tôi sửa đổi MY_upload Cubed Eye để trả lại thông tin tập tin của tất cả các file được tải lên. Vì nó đã được, chỉ có thể truy cập thông tin của tập tin cuối cùng khi gọi phương thức dữ liệu. Tôi cũng đã thêm địa chỉ IP của người tải lên vào danh sách đó.

http://pastebin.com/tG8A85gY

Nó có thể được sử dụng bởi những điều sau đây:

$upload_files = $this->upload->upload_files($project_files); 
if ($upload_files->status == true) 
{ 
$fileInfo = $uploaded_files->file_info; 
} 

Tôi nhận ra điều này sẽ khấm khá hơn như một chỉnh sửa để Cubed mắt nhưng đây là bài viết đầu tiên của tôi, tôi không có uy tín.

0

Để đơn giản, tôi đã tạo tệp trợ giúp CI này.Bạn có thể tải tệp từ tệp cấu hình & sử dụng bất kỳ đâu trong dự án của bạn.Nó chỉ mất 3 patrameters

@fileobject = tên của đối tượng tập tin HTML

@fileopath = đường dẫn tập tin mà bạn muốn tải lên

@filetypes = mặc định *, ex- 'jpg | png | mp4 | pdf '

function fileUploader($fileobject, $filepath = "uploads/", $filetypes = "*"){ 
// retrieve the number of images uploaded; 
$number_of_files = sizeof($_FILES[$fileobject]['tmp_name']); 

// considering that do_upload() accepts single files, we will have to do a small hack so that we can upload multiple files. For this we will have to keep the data of uploaded files in a variable, and redo the $_FILE. 
$files = $_FILES[$fileobject]; 

$errors = array(); 
$file_arr = array(); 
$result = array(); 

// first make sure that there is no error in uploading the files 
for ($k = 0; $k < $number_of_files; $k++) { 
    if ($_FILES[$fileobject]['error'][$k] != 0) $errors[$k][] = 'Couldn\'t upload file ' . $_FILES[$fileobject]['name'][$k]; 
} 
if (sizeof($errors) == 0) { 
    // now, taking into account that there can be more than one file, for each file we will have to do the upload 
    // we first load the upload library 
    $CI =& get_instance(); 

    $CI->load->library('upload'); // load library 

    // next we pass the upload path for the images 
    $config['upload_path'] = FCPATH . $filepath; 
    // also, we make sure we allow only certain type of images 
    $config['allowed_types'] = $filetypes; 
    //$config['max_size'] = (int)(ini_get('upload_max_filesize')); 
    $config['max_size'] = '10000'; 
    $config['overwrite'] = FALSE; 

    for ($i = 0; $i < $number_of_files; $i++) { 
     $_FILES['uploadedimage']['name'] = $files['name'][$i]; 
     $_FILES['uploadedimage']['type'] = $files['type'][$i]; 
     $_FILES['uploadedimage']['tmp_name'] = $files['tmp_name'][$i]; 
     $_FILES['uploadedimage']['error'] = $files['error'][$i]; 
     $_FILES['uploadedimage']['size'] = $files['size'][$i]; 
     //now we initialize the upload library 
     $CI->upload->initialize($config); 
     // we retrieve the number of files that were uploaded 
     if ($CI->upload->do_upload('uploadedimage')) { 
      $imageup = $CI->upload->data(); 
      // print_r($imageup["orig_name"]);die; 
      array_push($file_arr, $imageup["orig_name"]); 
      $result["response"] = "true"; 
      $result["message"] = "Files uploaded successfully."; 
      $result["files"] = $file_arr; 

     } else { 
      $result["response"] = "false"; 
      $result["message"][$i] = $CI->upload->display_errors(); 
     } 
    } 

} else { 
    $result["response"] = "false"; 
    $result["message"] = $errors; 

} 
return $result;} 

Đã kiểm tra & đã được chứng minh.

1

Tôi chưa thể nhận xét vì mức độ danh tiếng của tôi nhưng Zoom đã đưa ra nhận xét theo câu trả lời được chấp nhận về biến $ fieldname là một mảng gây ra lỗi. Tôi đã có cùng một vấn đề với câu trả lời đó và phát hiện ra rằng đó là vì tôi đã nối tất cả các tên đầu vào tệp của tôi trên biểu mẫu với [] làm cho php nhận các đầu vào đó dưới dạng biến mảng. Để giải quyết vấn đề đó chỉ cần cung cấp cho mỗi tập tin đầu vào một tên duy nhất thay vì làm cho nó một mảng PHP. Sau khi tôi làm điều đó, vấn đề đã biến mất cho tôi và câu trả lời được chấp nhận làm việc như một sự quyến rũ. Chỉ nghĩ rằng tôi sẽ chuyển thông tin cho bất kỳ ai khác tình cờ gặp vấn đề này.

+0

Ý của bạn là cho mỗi tệp nhập một tên duy nhất? Có sự khác nhau giữa việc sử dụng một '' và sử dụng nhiều dòng trường đầu vào. Với trường nhập đơn lẻ, bạn có thể chọn nhiều tệp từ cửa sổ trình duyệt tệp. Với nhiều trường nhập, bạn chỉ có thể chọn một tệp tại một thời điểm và tôi nghĩ rằng làm giảm tính năng chọn nhiều tệp, nhưng tôi đoán nó hoạt động. Có lẽ bạn có thể giải thích thêm một chút về ý nghĩa của bạn? – TARKUS

+0

Ngoài ra, tôi đang sử dụng 'name = 'files []'' quá, vì vậy tôi biết những gì bạn đang lái xe tại. Trong cuộc gọi Ajax, tôi lặp qua các tệp [] như sau: 'formData.append ('date', document.getElementById ('date'). Value); var ins = document.getElementById ('files'). Files.length; cho (var x = 0; x "; print_r($_FILES); echo " ";' Tuy nhiên, câu trả lời được chấp nhận ở trên không hiệu quả với tôi, vì vậy tôi vẫn đang làm điều gì sai. : / – TARKUS

Các vấn đề liên quan