it-swarm.com.de

Konvertieren Sie alle Bilder nach PNG beim Hochladen von Dateien

Auf meiner Website habe ich ein Front-End-Formular, mit dem Benutzer mehrere Bilder mithilfe des folgenden Codes hochladen können:

if (!empty($_FILES['vidPix']['tmp_name'][0])) {
                    $i = 1;
                    $files = $_FILES['vidPix'];
                    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("sight" . $i => $file);
add_filter( 'upload_dir', 'wpse_141088_upload_dir' );
add_filter('intermediate_image_sizes_advanced', 'no_image_resizing');

                        $mfile =  wp_handle_upload($files, $upload_overrides );                          
                            $newvidPix = sight("sight" . $i, $v_Id);
remove_filter( 'upload_dir', 'wpse_141088_upload_dir' );
remove_filter('intermediate_image_sizes_advanced', 'no_image_resizing');

                            if ($i == 1) {
                                update_post_meta($v_Id, '_thumbnail_id', $newvidPix);
                            }
                                add_post_meta($v_Id, 'vid_pix', $newvidPix, false);
                        }
                        $i++;
                    }
                }

Dies funktioniert gut, aber jetzt möchte ich es so machen, dass die Dateien in PNG konvertiert werden, dann in den Ordner gespeichert werden und die alte Datei loswerden. Ich fand diese Frage die den folgenden Code vorschlägt -

imagepng(imagecreatefromstring(file_get_contents($file)), "output.png");

Ich bin mir nicht sicher, wie ich das mit meinem Upload hinbekomme. Wie würde ich das machen?

UPDATE - FÜR EIN DATEI HOCHLADEN

if(isset($_POST["ebc_submit"])) {

    $uploadedfile2 = $_FILES ['ebc_upload'];
    if (! empty ( $uploadedfile2 ['name'] )) {
        $upload_overrides = array (
            'test_form' => false 
        );

add_filter( 'upload_dir', 'wpse_141088_upload_dir' );
add_filter('intermediate_image_sizes_advanced', 'no_image_resizing');

                        $endpic = wp_handle_upload($uploadedfile2, $upload_overrides );

remove_filter( 'upload_dir', 'wpse_141088_upload_dir' );
remove_filter('intermediate_image_sizes_advanced', 'no_image_resizing');

    $im = imagecreatefromstring( file_get_contents( $endpic['file'] ) );
    if ( false !== $im ) {
        $filename = pathinfo( $endpic['file'], PATHINFO_FILENAME );
        $to = dirname( $endpic['file'] ) . '/' . $filename . '.png';

        // Creates the image and saves it in `$to`.
        imagepng( $im, $to );

        // Frees the image from memory.
        imagedestroy( $im );

        // Deletes the original file.
        unlink( $endpic['file'] );

}
// Convert the image to PNG and delete the old image.
attachment_to_png( $uploadedfile2 );

}
}
1
Rich

(aktualisierte Antwort)

Die Funktion sight() lädt nicht nur das Bild hoch, sondern erstellt auch einen Anhang (d. H. Einen Beitrag vom Typ attachment). Daher habe ich den Code aktualisiert - er befindet sich jetzt in einem function mit dem Namen attachment_to_png und verwendet die get_attached_file(), um die Bilddatei an diesen Anhang anzuhängen, und die update_attached_file(), um den Dateipfad zu aktualisieren.

Also bitte folge diesen Schritten:

  1. Fügen Sie dies zur functions.php-Datei des Themas hinzu:

    function attachment_to_png( $att_id ) {
        $file = get_attached_file( $att_id );
        if ( ! $file ) {
            return false;
        }
    
        // Check MIME and make sure it's not already a PNG image.
        $mime = strtolower( mime_content_type( $file ) );
        if ( ! preg_match( '#^image/([a-z]{3,})$#', $mime, $m ) ||
            'png' === $m[1]
        ) {
            return false;
        }
    
        $im = imagecreatefromstring( file_get_contents( $file ) );
        if ( false !== $im ) {
            $filename = pathinfo( $file, PATHINFO_FILENAME );
            $to = dirname( $file ) . '/' . $filename . '.png';
    
            // Creates the image and saves it in `$to`.
            imagepng( $im, $to );
    
            // Frees the image from memory.
            imagedestroy( $im );
    
            // Deletes the original file.
            unlink( $file );
    
            // Update the attached file.
            update_attached_file( $att_id, $to );
        }
    }
    
  2. Fügen Sie dies nach der remove_filter('intermediate_image_sizes_advanced', 'no_image_resizing'); hinzu:

    // Convert the image to PNG and delete the old image.
    attachment_to_png( $newvidPix );
    

Zusätzliche Anmerkung

Ich glaube nicht, dass das nötig ist. Also solltest du es einfach entfernen.

$mfile =  wp_handle_upload($files, $upload_overrides );

AKTUALISIERT 03.12.2018 UTC

(Aktualisiert für den Upload einer einzelnen Datei)

  1. Sie sollten das $im-Zeug nicht verwenden und einfach die attachment_to_png()-Funktion verwenden. Rufen Sie die Funktion folgendermaßen auf: attachment_to_png( 123 ) wobei 123 die Anhangs-ID ist.

  2. Verwenden Sie media_handle_upload(), um einen Anhang für das hochgeladene Bild zu erstellen, und nicht wp_handle_upload().

Also versuche folgendes:

if ( isset( $_POST["ebc_submit"] ) ) {
    $uploadedfile2 = $_FILES['ebc_upload'];
    if ( ! empty( $uploadedfile2['name'] ) ) {
        $upload_overrides = array(
            'test_form' => false
        );

        add_filter( 'upload_dir', 'wpse_141088_upload_dir' );
        add_filter( 'intermediate_image_sizes_advanced', 'no_image_resizing' );

        // Load media_handle_upload() and other media/image/file functions.
        require_once ABSPATH . 'wp-admin/includes/media.php';
        require_once ABSPATH . 'wp-admin/includes/image.php';
        require_once ABSPATH . 'wp-admin/includes/file.php';

        // $v_Id is the ID of the post where the image should be attached to.
        $endpic = media_handle_upload( 'ebc_upload', $v_Id, array(), $upload_overrides );

        remove_filter( 'upload_dir', 'wpse_141088_upload_dir' );
        remove_filter( 'intermediate_image_sizes_advanced', 'no_image_resizing' );

        // Convert the image to PNG and delete the old image.
        if ( $endpic && ! is_wp_error( $endpic ) ) {
            attachment_to_png( $endpic );
            //echo 'Success!';
        }
    }
}

AKTUALISIERT 05.12.2018 UTC

Wenn Sie sich zu 100% sicher sind, dass not eindeutige Dateinamen verwendet; Wenn Sie ein Bild mit demselben Namen wie ein zuvor hochgeladenes Bild hochladen, können Sie eine Rückruffunktion erstellen, die von wp_unique_filename() verwendet wird, wobei Sie den ursprünglichen (aber bereinigten) Dateinamen wie folgt zurückgeben:

// Add this to the theme's functions.php
function no_unique_filename( $dir, $name, $ext ) {
    return $name;
}

Fügen Sie dann im $upload_overrides (siehe vorheriges Update) unique_filename_callback wie folgt hinzu:

$upload_overrides = array(
    'test_form'                => false,
    'unique_filename_callback' => 'no_unique_filename',
);
1
Sally CJ