Как загрузить пользовательский файл (.txt, .rar, .xml, .zip) в php (wordpress)? - PullRequest
0 голосов
/ 09 октября 2018

Я хочу разрешить загрузку файлов прямо в корень.Поддерживаемые расширения файлов должны быть: .txt, .rar, .xml, .zip.Я пытаюсь сделать это с помощью кода от w3schools, так как я новичок в разработке плагинов php и wordpress.Плагин работает, на левой панели администратора есть значок меню, есть опция загрузки на странице администратора, но когда я «загружаю» файл, в папке загрузки нет файла (я сначала пытаюсь сделать так же, каккод на w3schools.

HTML

<div class="wrap">
<h2>Test file upload page</h2>
<form action="upload.php" method="post" enctype="multipart/form-data">
Select image to upload:
<input type="file" name="fileToUpload" id="fileToUpload">
<input type="submit" value="Upload Image" name="submit">
</form>
</div>

и PHP файл (upload.php)

<?php 
$target_dir = "uploads/";
$target_file = $target_dir . basename($_FILES["fileToUpload"]["name"]);
$uploadOk = 1;
$imageFileType = strtolower(pathinfo($target_file,PATHINFO_EXTENSION));
// Check if image file is a actual image or fake image
if(isset($_POST["submit"])) {
$check = getimagesize($_FILES["fileToUpload"]["tmp_name"]);
if($check !== false) {
    echo "File is an image - " . $check["mime"] . ".";
    $uploadOk = 1;
} else {
    echo "File is not an image.";
    $uploadOk = 0;
}
}
// Check if file already exists
if (file_exists($target_file)) {
echo "Sorry, file already exists.";
$uploadOk = 0;
}
// Check file size
if ($_FILES["fileToUpload"]["size"] > 500000) {
echo "Sorry, your file is too large.";
$uploadOk = 0;
}
// Allow certain file formats
if($imageFileType != "jpg" && $imageFileType != "png" && $imageFileType != 
"jpeg"
&& $imageFileType != "gif" ) {
echo "Sorry, only JPG, JPEG, PNG & GIF files are allowed.";
$uploadOk = 0;
}
// Check if $uploadOk is set to 0 by an error
if ($uploadOk == 0) {
echo "Sorry, your file was not uploaded.";
// if everything is ok, try to upload file
} else {
if (move_uploaded_file($_FILES["fileToUpload"]["tmp_name"], $target_file)) {
    echo "The file ". basename( $_FILES["fileToUpload"]["name"]). " has been 
uploaded.";
} else {
    echo "Sorry, there was an error uploading your file.";
}
}
?>

Я знаю, что это не очень хороший подход, и есть функции Wordpress для того, что я пытаюсь сделать, но я просто хотел попробовать это таким образом ... Если вы знаете какой-нибудь лучший способЯ был бы признателен, если бы вы открыли мне глаза. Кроме того, у меня есть еще один вопрос: может ли загрузка файлов работать на локальном компьютере? Я имею в виду, я делаю все на локальном хосте с MAMP, и это для практических целей.

Я не редактировал код для поддержки расширений файлов, которые я встраивал, потому что сначала хотел проверить, работает ли он с файлами изображений, но это не так.

РЕДАКТИРОВАТЬ 1:

Я также увидел, что в файле php.ini директива file_uploads должна иметь значение On:

file_uploads = On

Но в каталоге WordPress нет файла php.ini.Есть ли способ редактировать файл php.ini с плагином WordPress?Может быть, это проблема.Просто угадай.

Ответы [ 2 ]

0 голосов
/ 10 октября 2018

У вас есть следующие проблемы с вашим кодом:

  1. Файл upload.php не нужен, все должно идти в одном файле, в данном случае это ваш основной файл плагина.

  2. Поскольку файла upload.php нет, действие формы должно быть пустым.

  3. Все в вашем PHP-коде должно быть внутри if(isset($_POST["submit"])) { },потому что если ничего не было отправлено, вам не нужно ничего выполнять из сценария загрузки.

  4. Ваш $target_dir должен быть абсолютный путь , что-то вроде:

    • /home/user/public_html/wp-content/
    • /Users/username/Sites/wp/wp-admin

Вот небольшой рабочий пример, основанный на опубликованном вами коде. Яиспользуя wp_upload_dir для установки каталога назначения.В моем тесте изображения были загружены в http://localhost/wp-content/2018/10/image.png.

<?php
/**
 * Plugin Name: (SO) Testing upload
 */
add_action('admin_menu', function () {
    add_menu_page( 
        'Upload', 
        'Upload', 
        'read', 
        'so_upload', 
        'so_upload_callback', 
        null, 
        6 // position, just after Posts
    );
});

function so_upload_callback() 
{
    ?>
    <div class="wrap">
    <h2>Test file upload page</h2>
    <form action="" method="post" enctype="multipart/form-data">
    Select image to upload:
    <input type="file" name="fileToUpload" id="fileToUpload">
    <input type="submit" value="Upload Image" name="submit">
    </form>
    </div>
    <?php
    // Check if image file is a actual image or fake image
    if(isset($_POST["submit"])) {
        $target_dir = wp_upload_dir();
        $target_file = $target_dir['path'] . '/' . basename($_FILES["fileToUpload"]["name"]);
        $uploadOk = 1;
        $imageFileType = strtolower(pathinfo($target_file,PATHINFO_EXTENSION));
        $check = getimagesize($_FILES["fileToUpload"]["tmp_name"]);
        if($check !== false) {
            echo "File is an image - " . $check["mime"] . ".";
            $uploadOk = 1;
        } else {
            echo "File is not an image.";
            $uploadOk = 0;
        }
        // Check if file already exists
        if (file_exists($target_file)) {
            echo "Sorry, file already exists.";
            $uploadOk = 0;
        }
        // Check file size
        if ($_FILES["fileToUpload"]["size"] > 500000) {
            echo "Sorry, your file is too large.";
            $uploadOk = 0;
        }
        // Allow certain file formats
        if($imageFileType != "jpg" && $imageFileType != "png" && $imageFileType != 
            "jpeg"
        && $imageFileType != "gif" ) {
            echo "Sorry, only JPG, JPEG, PNG & GIF files are allowed.";
            $uploadOk = 0;
        }
        // Check if $uploadOk is set to 0 by an error
        if ($uploadOk == 0) {
            echo "Sorry, your file was not uploaded.";
            // if everything is ok, try to upload file
        } else {
            if (move_uploaded_file($_FILES["fileToUpload"]["tmp_name"], $target_file)) {
                echo "The file ". basename( $_FILES["fileToUpload"]["name"]). " has been 
                    uploaded.";
            } else {
                echo "Sorry, there was an error uploading your file.";
            }
        }

    }
}

Обратите внимание, что файлы, загруженные таким образом, не отображаются в библиотеке мультимедиа WP.Кроме того, если код действительный, для формы необходимо поле nonce для безопасности (wp_nonce_field).

0 голосов
/ 09 октября 2018

К первому редактированию: Вы не можете редактировать файлы php.ini на языке PHP (Wordpress).

К вопросу о загрузке вашего файла: Да загрузка файла будет работать на локальном компьютере.

Чтобы направить вас в правильном направлении, я бы использовал код из ранее отвеченных сообщений о переполнении стека, например: Загрузка файла Wordpress на странице

PS: всегда используйте php logотладить PHP

...