Tải lên nhiều tệp với media_handle_upload


16

Tôi có một plugin biểu mẫu WordPress và tôi sử dụng media_handle_uploadđể tải lên các tệp và nhận id trực tiếp và đính kèm id của nó vào bài đăng dưới dạng ngày meta, tôi đã sử dụng như sau để làm điều đó:

HTML của trường biểu mẫu là:

<input type="file" name="my_file_upload" id="my_file_upload">

Và mã php là:

$attach_id = media_handle_upload( 'my_file_upload', $post_id );
if ( is_numeric( $attach_id ) ) {
    update_post_meta( $post_id, '_my_file_upload', $attach_id );
}

Và mọi thứ đã hoạt động hoàn hảo.

Bây giờ tôi đang cố tải lên nhiều tệp, mã HTML của tôi là:

<input type="file" name="my_file_upload[]" id="my_file_upload[]" multiple="multiple">

Nhưng tôi không thể làm cho media_handle_uploadchức năng hoạt động với nhiều tập tin tải lên.

Bất kỳ trợ giúp sẽ được đánh giá cao.


Sử dụng foreach để tải lên nhiều, iam trên thiết bị di động ngay bây giờ để icant đăng mã đầy đủ
Shady M Rasmy

Tôi đã thử nhiều vòng lặp foreach và không ai trong số họ làm việc.
Tiếng Anh

Câu trả lời:


14

ở đây nếu bạn sử dụng mẫu tùy chỉnh trước đây

<?php
 if( 'POST' == $_SERVER['REQUEST_METHOD']  ) {
if ( $_FILES ) { 
    $files = $_FILES["my_file_upload"];  
    foreach ($files['name'] as $key => $value) {            
            if ($files['name'][$key]) { 
                $file = array( 
                    'name' => $files['name'][$key],
                    'type' => $files['type'][$key], 
                    'tmp_name' => $files['tmp_name'][$key], 
                    'error' => $files['error'][$key],
                    'size' => $files['size'][$key]
                ); 
                $_FILES = array ("my_file_upload" => $file); 
                foreach ($_FILES as $file => $array) {              
                    $newupload = my_handle_attachment($file,$pid); 
                }
            } 
        } 
    }

}
?>

trong hàm.php

function my_handle_attachment($file_handler,$post_id,$set_thu=false) {
  // check to make sure its a successful upload
  if ($_FILES[$file_handler]['error'] !== UPLOAD_ERR_OK) __return_false();

  require_once(ABSPATH . "wp-admin" . '/includes/image.php');
  require_once(ABSPATH . "wp-admin" . '/includes/file.php');
  require_once(ABSPATH . "wp-admin" . '/includes/media.php');

  $attach_id = media_handle_upload( $file_handler, $post_id );
  if ( is_numeric( $attach_id ) ) {
    update_post_meta( $post_id, '_my_file_upload', $attach_id );
  }
  return $attach_id;
}

soure http://www.kvcodes.com/2013/12/create-front-end-mult Môn-file-upload-wordpress /


Cảm ơn mã của bạn, tôi đang sử dụng nó cho một hình thức để gửi bài viết. Tôi đã tự hỏi làm thế nào tôi có thể xác nhận các tập tin tải lên. có cách nào không?
sb0k

3
Điều này có ghi đè lên biến $ _FILES toàn cầu không?
ReLeaf

@ReLeaf Điều này sẽ ghi đè lên biến $ _FILES toàn cầu. media_handle_upload()tìm kiếm$_FILES[$file_handler]
Andy Macaulay-Brook

Đoạn mã này hoạt động hoàn hảo, NGOẠI TRỪ trên Android WebView khi cố gắng tải lên nhiều tệp (một tệp là ok).
Rollor

7

Nếu bạn muốn thực hiện điều này mà không sử dụng tệp chức năng, bạn có thể sử dụng phiên bản hợp lý mà tôi đã đưa ra. Đây là mã được thử nghiệm hoạt động 100%

<form id="file_upload" method="post" action="#" enctype="multipart/form-data">
     <input type="file" name="my_file_upload[]" multiple="multiple">
     <input name="my_file_upload" type="submit" value="Upload" />
</form>

Đặt mã PHP trên trang nơi xảy ra việc gửi. Trong trường hợp của tôi trên cùng một trang với hành động biểu mẫu được đặt thành "#"

<?php if ($_SERVER['REQUEST_METHOD'] == 'POST') {
    require_once( ABSPATH . 'wp-admin/includes/image.php' );
    require_once( ABSPATH . 'wp-admin/includes/file.php' );
    require_once( ABSPATH . 'wp-admin/includes/media.php' );

    $files = $_FILES["my_file_upload"];
    foreach ($files['name'] as $key => $value) {
        if ($files['name'][$key]) {
            $file = array(
                'name' => $files['name'][$key],
                'type' => $files['type'][$key],
                'tmp_name' => $files['tmp_name'][$key],
                'error' => $files['error'][$key],
                'size' => $files['size'][$key]
            );
            $_FILES = array("upload_file" => $file);
            $attachment_id = media_handle_upload("upload_file", 0);

            if (is_wp_error($attachment_id)) {
                // There was an error uploading the image.
                echo "Error adding file";
            } else {
                // The image was uploaded successfully!
                echo "File added successfully with ID: " . $attachment_id . "<br>";
                echo wp_get_attachment_image($attachment_id, array(800, 600)) . "<br>"; //Display the uploaded image with a size you wish. In this case it is 800x600
            }
        }
    }
} ?>

Phương pháp này sẽ chỉ bao gồm các tệp được yêu cầu một lần khi việc gửi biểu mẫu được thực hiện thay vì bao gồm chúng mỗi khi hàm được gọi thông qua vòng lặp foreach


EDIT: Tôi đã lấy mã ra $post_thumbnail_id = wp_get_attachment_image_src($attachment_id, array(800, 600));vì nó không cần thiết cho ví dụ. Nhưng nếu bạn muốn lấy URL của hình ảnh, nó sẽ giúp bạn :)
Lucky

5

Cảm ơn @ shady-m-rasmy Tôi đã sử dụng mã mà bạn đã đề cập và dường như vòng lặp foreach thứ hai (bên dưới - trong phần mẫu tùy chỉnh) là không cần thiết vì nó chỉ được thực thi một lần.

foreach ($_FILES as $file => $array) {              
   $newupload = my_handle_attachment($file,$pid);
} 

Vì vậy, nó chỉ để lại với

$newupload = my_handle_attachment( "my_file_upload", $pid);

0

Nhiều mục nhập cho cùng một khóa meta

$values = [ 'red', 'yellow', 'blue', 'pink' ];
foreach( $values as $value ) {
    // This method uses `add_post_meta()` instead of `update_post_meta()`
    add_post_meta( $item_id, 'color', $value );
}

Bạn có thể vui lòng định dạng mã của bạn và thêm giải thích?
Nilambar Sharma

Tôi không chắc điều này giải quyết được vấn đề ở đây: phần khó nhất dường như là phân tích cú pháp các tệp đã gửi, không đính kèm nhiều tệp vào bài đăng.
Rup
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.