#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», но я уверен, что это было не единственное, о чем вы говорили. Не могли бы вы быть немного более конкретным?