Media_handle_upload के साथ एकाधिक फ़ाइलें अपलोड करें


16

मेरे पास एक वर्डप्रेस फॉर्म प्लगइन है और मैं media_handle_uploadफ़ाइलों को अपलोड करने और सीधे आईडी प्राप्त करने के लिए उपयोग करता हूं और मेटा आईडी के रूप में पोस्ट पर अपनी आईडी संलग्न करता हूं, मैंने निम्नलिखित का उपयोग किया है:

प्रपत्र फ़ील्ड का HTML है:

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

और php कोड था:

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

और सब कुछ पूरी तरह से काम था।

अब मैं अपने HTML कोड में कई फाइलें अपलोड करने की कोशिश कर रहा हूं:

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

लेकिन मैं media_handle_uploadकई फाइलों के अपलोड के साथ फंक्शन को काम नहीं कर सकता ।

किसी भी तरह की सहायता को आभार समझेंगे।


एकाधिक अपलोड करने के लिए foreach का उपयोग करें, मोबाइल पर iam अब पूर्ण कोड पोस्ट करें
Shady M Rasmy

मैंने कई फॉरेक्स लूप की कोशिश की और उनमें से कोई भी काम नहीं किया।
Engr.MTH

जवाबों:


14

यहाँ अगर आप भीख मांगने में कस्टम टेम्पलेट का उपयोग करते हैं

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

}
?>

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


आपके कोड के लिए धन्यवाद, मैं इसे पोस्ट सबमिट करने के लिए फ़ॉर्म के लिए उपयोग कर रहा हूं। मैं सोच रहा था कि मैं अपलोड की गई फ़ाइलों को कैसे मान्य कर सकता हूं। एक रास्ता है?
sb0k

3
क्या यह वैश्विक $ _FILES चर को अधिलेखित नहीं करता है?
रिआलफ

@ReLeaf यह वैश्विक $ _FILES चर को अधिलेखित करना चाहिएmedia_handle_upload()के लिए लग रहा है$_FILES[$file_handler]
एंडी मैकाले-ब्रूक

यह स्निपेट सही काम करता है, Android WebView पर EXCEPT जब कई फाइलें अपलोड करने की कोशिश की जाती है (सिंगल फाइल ठीक है)।
रोलर

7

यदि आप फ़ंक्शन फ़ाइल का उपयोग किए बिना इसे लागू करना चाहते हैं, तो आप मेरे साथ आए सुव्यवस्थित संस्करण का उपयोग कर सकते हैं। यह परीक्षण किया गया कोड 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>

पृष्ठ पर PHP कोड रखें जहां सबमिट होता है। मेरे पेज पर उसी स्थिति में जब फॉर्म कार्रवाई "#" पर सेट है

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

इस पद्धति में आवश्यक फ़ाइलों को केवल एक बार शामिल किया जाएगा जब फॉर्म सबमिट किया जाएगा बजाय उन्हें शामिल करने के लिए जब हर बार फ़ंक्शन को फ़ॉरच लूप के माध्यम से कहा जाता है


EDIT: मैंने कोड को हटा दिया है $post_thumbnail_id = wp_get_attachment_image_src($attachment_id, array(800, 600));क्योंकि यह उदाहरण के लिए अनावश्यक है। लेकिन अगर आप चित्र का URL प्राप्त करना चाहते हैं, तो यह आपकी मदद करेगा :)
Lucky

5

धन्यवाद @ shady-m-rasmy मैंने आपके द्वारा बताए गए कोड का उपयोग किया, और ऐसा लगता है कि दूसरा फ़ॉरच लूप (नीचे - कस्टम टेम्पलेट भाग में) आवश्यक नहीं है क्योंकि यह केवल एक बार निष्पादित होता है।

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

तो यह केवल साथ छोड़ देता है

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

0

एक ही मेटा कुंजी के लिए एकाधिक प्रविष्टियाँ

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

क्या आप कृपया अपना कोड फ़ॉर्मेट कर सकते हैं और स्पष्टीकरण भी जोड़ सकते हैं?
नीलांबर शर्मा

मुझे यकीन नहीं है कि यह इस समस्या को हल करता है: सबसे कठिन हिस्सा प्रस्तुत फ़ाइलों को पार्स करना प्रतीत होता है, पोस्ट में कई फ़ाइलों को संलग्न नहीं करना।
रूप

0

एचटीएमएल

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

पीएचपी

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;
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.