php не загружает файл, не может найти ошибку

#php #file-upload

#php #загрузка файла

Вопрос:

Я добавляю функцию загрузки файла на свою страницу php. Код кажется мне правильным, и он даже добавляет файл на сервер с правильным именем, но без содержимого. т. Е. При загрузке изображения есть пустой файл .jpg.

Может ли кто-нибудь из вас, более опытных разработчиков php, увидеть, что я делаю неправильно для создания пустых файлов.

вызывающий скрипт:

 <script>
        $(document).ready(function(){
            $("#mediaFileInput").on("change", function(e){
                console
                if (e.target.value) {
                    var formData = new FormData(e.target.form);
                    $.ajax({
                        url: 'media.php',  //Server script to process data
                        type: 'POST',
                        success: function(data){
                            location.reload();
                        },
                        // Form data
                        data: formData,
                        //Options to tell jQuery not to process data or worry about content-type.
                        cache: false,
                        contentType: false,
                        processData: false
                    });   
                }
            });
        });           
    </script>
  

media.php

 <?php
   require('config/config.php');

    $file_uploaded;
    $mime_type;

    // Handle multipart file uploads
    if (isset ( $_FILES ['file'] )) {
        $file_uploaded = fopen($_FILES['file']['name'], "r");
        $mime_type = $_FILES['file']['type'];
    } else if ($_SERVER["REQUEST_METHOD"] == "POST") {
        /* PUT data comes in on the stdin stream */
        $file_uploaded = fopen("php://input", "r");

        /* Open a file for writing */
        $mime_type = $_SERVER["CONTENT_TYPE"];
    }

    $file_name = $_FILES['file']['name'];
    $new_path = "media/" . $file_name;
    $media_url = "/" . $new_path;
    $fp = fopen($new_path, "w");

    /* Read the data 1 KB at a time
       and write to the file */
    while ($data = fread($file_uploaded, 1024)) {
    fwrite($fp, $data);
    }

    /* Close the streams */
    fclose($fp);
    fclose($file_uploaded);
    chmod($new_path, 0755);

    // insert into database.
    $stmt = $db_conn->prepare("INSERT INTO MEDIA (type, url) VALUES(?, ?)");
    $stmt->bind_param('ss', 
       $mime_type, 
        $media_url);
    $stmt->execute();
    $media_id = $db_conn->insert_id;
    $stmt->close();

    echo json_encode(array("id" => $media_id, "type" => $mime_type, "url" => $media_url));


    ?>
  

Комментарии:

1. Почему вы выполняете location.reload() в случае успеха. Тогда вы могли бы просто регулярно отправлять форму и вообще не использовать ajax

Ответ №1:

Вы не должны использовать fopen("php://input", "r"); , потому что, согласно документам для этого:

php:// ввод недоступен с enctype=»multipart/form-data».

Конечно, когда вы загружаете файл, вы должны использовать enctype="multipart/form-data" . Поэтому вместо этого используйте move_uploaded_file .

Кроме того, fopen($_FILES['file']['name'], "r"); в вашей другой ветке это не имеет смысла, поскольку это просто попытка открыть имя файла без определенного пути. Используйте move_uploaded_file.

Комментарии:

1. Я немного смущен. Я добавил «move_uploaded_file», но я уверен, что это было не единственное, о чем вы говорили. Не могли бы вы быть немного более конкретным?