Media_handle_upload ile Birden Fazla Dosya Yükleme


16

Bir WordPress form eklentisi var ve media_handle_uploaddosyaları yüklemek ve doğrudan kimlikleri almak için kullanıyorum ve meta tarihi olarak kimliğini mesaja ekledim, bunu yapmak için aşağıdakileri kullandım:

Form alanının HTML'si:

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

Ve php kodu:

$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 );
}

Ve her şey mükemmeldi.

Şimdi HTML kodum birden fazla dosya yüklemeye çalışıyorum:

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

Ama ben media_handle_uploadfonksiyonu birden fazla dosya yükleme ile çalışmasını sağlayamıyorum.

Herhangi bir yardım takdir edilecektir.


Birden fazla yüklemek için foreach kullanın, şimdi mobil cihazlarda iam yani
icant

Birçok foreach döngüsü denedim ve hiçbiri çalışmıyor.
Engr.MTH

Yanıtlar:


14

başlangıçta bunun ötesinde özel şablon kullanıyorsanız

<?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); 
                }
            } 
        } 
    }

}
?>

function.php içinde

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-multiple-file-upload-wordpress/


Kodunuz için teşekkürler, gönderileri göndermek için bir form için kullanıyorum. Yüklenen dosyaları nasıl doğrulayabileceğimi merak ediyordum. bir yolu var mı?
sb0k

3
Bu, global $ _FILES değişkeninin üzerine yazmıyor mu?
ReLeaf

@ReLeaf Global $ _FILES değişkeninin üzerine yazılmalıdır . media_handle_upload()arar$_FILES[$file_handler]
Andy Macaulay-Brook

Bu snippet, birden fazla dosya yüklemeye çalışırken Android WebView'de mükemmel çalışır (tek dosya tamam).
Rollor

7

Bunu işlevler dosyasını kullanmadan uygulamak istiyorsanız, bulduğum aerodinamik sürümü kullanabilirsiniz. Bu test edilen kod% 100 çalışır

<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>

PHP kodunu gönderimin gerçekleştiği sayfaya yerleştirin. Benim durumumda form eylemiyle aynı sayfada "#"

<?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
            }
        }
    }
} ?>

Bu yöntem, gerekli dosyaları foreach döngüsü üzerinden her çağrıldığında eklemek yerine form gönderme işlemi tamamlandığında gerekli dosyaları yalnızca bir kez içerir


EDIT: $post_thumbnail_id = wp_get_attachment_image_src($attachment_id, array(800, 600));Örnek için gereksiz olduğu için kodu çıkardı . Resmin URL'sini almak istiyorsanız, size yardımcı olacaktır :)
Şanslı

5

Teşekkürler @ shady-m-rasmy Bahsettiğiniz kodu kullandım ve ikinci foreach döngüsü (aşağıda - özel şablon bölümünde) sadece bir kez yürütüldüğü için gerekli değil gibi görünüyor.

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

Yani sadece

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

0

Aynı meta anahtar için birden çok giriş

$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 );
}

Lütfen kodunuzu biçimlendirebilir ve açıklama ekleyebilir misiniz?
Nilambar Sharma

Bunun sorunu burada çözdüğünden emin değilim: en zor kısım gönderilen dosyaları ayrıştırıyor, gönderiye birden fazla dosya eklemiyor gibi görünüyor.
Rup

0

HTML

<input type="file" id="id_termine_attachment" multiple="multiple" name="id_termine_attachment[]" value="" size="25" />

PHP

function upload_file($_FILES) {

    if (!empty($_FILES['id_termine_attachment'])) {
        $supported_types = array(
            'application/pdf',
            'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
            'application/msword',
            'image/gif',
            'image/jpeg',
            'image/png',
            'application/zip'
         );

        $file_arr = reArrayFiles($_FILES['id_termine_attachment']);
        $file_urls = [];

        foreach ($file_arr as $file) {
            $arr_file_type = wp_check_filetype(basename($file['name']));
            $uploaded_type = $arr_file_type['type'];
            if (in_array($uploaded_type, $supported_types)) {
                $upload = wp_upload_bits($file['name'], null, file_get_contents($file['tmp_name']));
                if (isset($upload['error']) && $upload['error'] != 0) {
                    wp_die('There was an error uploading your file. The error is: ' . $upload['error']);
                } else {
                    array_push($file_urls, $upload['url']);

                } // end if/else
            } else {
                wp_die("This filetyp is not available!");
            }
        }
        update_post_meta($post_id, 'id_termine_attachment', $file_urls);
    }
}



function reArrayFiles(&$file_post) {
    $file_ary = array();
    $file_count = count($file_post['name']);
    $file_keys = array_keys($file_post);

    for ($i=0; $i<$file_count; $i++) {
        foreach ($file_keys as $key) {
            $file_ary[$i][$key] = $file_post[$key][$i];
        }
    }

    return $file_ary;
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.