У меня есть форма с одним полем загрузки изображения.
Я хочу загрузить файл изображения с помощью ajax и заполнить одно скрытое поле в форме возвращенным именем изображения через успех ajax ПЕРЕД ОТПРАВКОЙ ОСНОВНОЙ ФОРМЫ с другими полями ввода, такими как имя, адрес электронной почты, мобильный телефон и т. д....
Следующий код я пробовал, но безуспешно...
HTML-код формы:
<label>Upload File:</label>
<input name = "userFile" id = "userFile" type = "file" class = "form-control"><br>
<button name = "marksheet_upload" id = "marksheet_upload" class = "btn btn-success">Upload</button>
<label>Image Final Name</label>
<input type = "text" class = "form-control" id = "intern_marksheet_image" name = "intern_marksheet_image">
// This above field will be hidden and after image file upload, this value should get via ajax response
<div id = "loader-icon" style = "display:none;"><img src = "images/123.gif"></div>
ЯВАСКРИПТ
<script type = "text/javascript">
$(document).ready(function(){
// File upload via Ajax
$("#marksheet_upload").click(function(e) {
var dataimg = new FormData();
var marksheet = $('#userFile')[0].files[0];
//append files
dataimg.append('userFile', marksheet);
e.preventDefault();
$.ajax({
type: 'POST',
url: 'register-file-upload.php',
data: dataimg,
contentType: false,
enctype: 'multipart/form-data',
cache: false,
processData:false,
beforeSend: function(){
$('#loader-icon').show();
},
success: function(response){
if (response.upload == 'ok'){
$('#intern_marksheet_image').val(response.image_name);
$('#loader-icon').html(response.image_error);
}else {
$('#intern_marksheet_image').val('xxx');
$('#loader-icon').html(response.image_error);
}
}
});
});
</script>
URL-адрес PHP ajax —
register-file-upload.php код:
<?php
function randStrGen601($len){
$result = "";
$chars = "0123456789abcdefghijklmnopqrstuvwxyz";
$charArray = str_split($chars);
for($i = 0; $i < $len; $i++){
$randItem = array_rand($charArray);
$result .= "".$charArray[$randItem];
}
return $result;
}
$error = false;
$imagetypeerror = false;
if (isset($_FILES['userFile'])) {
$avatar1 = $_FILES['userFile'];
$avatarname1 = $_FILES['userFile']['name'];
$avatarsize1 = $_FILES['userFile']['size'];
$minsize1 = 100000; // 100 KB
$maxsize1 = 500000; //500 KB
$acceptable1 = array(
'image/jpeg',
'image/jpg',
'image/png'
);
if (function_exists('finfo_open')){ //(PHP >= 5.3.0, PECL fileinfo >= 0.1.0)
$fileinfo1 = finfo_open(FILEINFO_MIME_TYPE);
if (!empty($avatar1['tmp_name'])){
if (!in_array(finfo_file($fileinfo1, $avatar1['tmp_name']), $acceptable1)) {
$msg = "Marksheet Image is not a valid image, Only 'JPG' & 'PNG' Types Are Allowed";
$error = true;
$imagetypeerror = true;
$data['upload'] = "Err";
$data['image_error'] = $msg;
$data['image_name'] = "";
}
}
}else if (function_exists('mime_content_type')){ //supported (PHP 4 >= 4.3.0, PHP 5)
if (!in_array(mime_content_type($avatar1['tmp_name']), $acceptable1)) {
$msg = "Marksheet Image is not a valid image, Only 'JPG' & 'PNG' Types Are Allowed";
$error = true;
$imagetypeerror = true;
$data['upload'] = "Err";
$data['image_error'] = $msg;
$data['image_name'] = "";
}
}else{
if (!@getimagesize($avatar1['tmp_name'])) { //@ - for hide warning when image not valid
$msg = "Marksheet Image is not a valid image, Only 'JPG' & 'PNG' Types Are Allowed";
$error = true;
$imagetypeerror = true;
$data['upload'] = "Err";
$data['image_error'] = $msg;
$data['image_name'] = "";
}
}
if (!$imagetypeerror){
if ( (!isset($avatarname1)) || (empty($avatarname1)) || ($avatarsize1 == 0)) {
$error = true;
$msg= "Please browse and upload the Marksheet Image";
$data['upload'] = "Err";
$data['image_error'] = $msg;
$data['image_name'] = "";
}
if ( (!empty($avatarname1)) && ($avatarsize1 >= $maxsize1)) {
$error = true;
$msg = 'Marksheet Image Size Is Too Large. Image Must Be Less Than 500 KB.';
$data['upload'] = "Err";
$data['image_error'] = $msg;
$data['image_name'] = "";
}
if ( (!empty($avatarname1)) && ($avatarsize1 <= $minsize1)) {
$error = true;
$msg = 'Marksheet Image Size Is Too Small. Image Must Be Greater Than 100 KB.';
$data['upload'] = "Err";
$data['image_error'] = $msg;
$data['image_name'] = "";
}
}
if (!$error){
$targetDir = "uploads/intern/";
$fileName = $_FILES['userFile']['tmp_name'];
$udx = date("YmdHis");
$random2 = randStrGen601(4);
$fileName1 = strtolower($fileName);
$fileName2 = str_replace(" ", "_", $fileName1);
$targetFilePath = $targetDir.$fileName2;
// Upload file to the server
move_uploaded_file($fileName2, $targetFilePath));
$error = false;
$data['upload'] = "ok";
$data['image_error'] = "File Uploaded Successfully";
$data['image_name'] = $fileName2;
}
}
//returm $data;
echo $data;
?>
С помощью этого кода я просто получаю «XXX» в качестве имени файла изображения в скрытом поле ввода и загружаю изображение. Изображение не загружается.
@KenLee Спасибо за обновления. Я только что попробовал изменить входной идентификатор файла в js... но пока не получилось найти имя файла скрытого изображения.
@KenLee Кажется, мне что-то не хватает в коде Register-file-upload.php... как $data['upload.]= "OK"; не возвращается...
echo $data; - вы не можете вывести массив с помощью echo, результатом будет только текст Array. Вам следует закодировать свой массив как JSON, а затем добавить dataType: "json" к параметрам вызова AJAX jquery.
@CBroe Я попробовал dataType: "json", но потом ajax не работает... полная страница перезаписана...
Действительно ли ваш PHP-скрипт теперь возвращает JSON?
@CBroe Нет… потому что сценарий Ajax не работает, если добавлен тип данных: «json»
Конечно, это не удастся, если вы дадите jQuery команду проанализировать ответ как JSON, но затем заставите ваш PHP-скрипт возвращать что-то, что не является JSON...






В исходном коде есть несколько ошибок:
Закрывающие скобки/скобы не совпадают с открывающими скобками/скобками, поэтому добавьте }) в конец $(document).ready блока.
Удалите последний ) из move_uploaded_file($fileName2, $targetFilePath)); (иначе PHP точно не сработает)
Используйте echo json_encode($data) вместо echo $data в вашем PHP-скрипте, иначе мы не сможем правильно вернуть данные массива.
Добавьте dataType: "json", в свой блок ajax, чтобы система оценивала ответ ajax как JSON и возвращала объект JavaScript.
Я немного изменил строки назначения filename, filename1 и filename2, так как считаю их не совсем логичными
Убедитесь, что каталог /uploads/intern/ доступен для записи, чтобы файл можно было загрузить.
Итак, HTML/JS будет:
<script
src = "https://code.jquery.com/jquery-3.7.1.js"
integrity = "sha256-eKhayi8LEQwp4NKxN+CfCh+3qOVUtJn3QNZ0TciWLP4 = "
crossorigin = "anonymous"></script>
<label>Upload File:</label>
<input name = "userFile" id = "userFile" type = "file" class = "form-control"><br>
<button name = "marksheet_upload" id = "marksheet_upload" class = "btn btn-success">Upload</button>
<label>Image Final Name</label>
<input type = "text" class = "form-control" id = "intern_marksheet_image" name = "intern_marksheet_image">
<div id = "loader-icon" style = "display:none;">Uploading....</div>
<script type = "text/javascript">
$(document).ready(function(){
$("#marksheet_upload").click(function(e) {
var dataimg = new FormData();
var marksheet = $('#userFile').prop("files")[0];
dataimg.append('userFile', marksheet);
// if you want to pass additional data say string1, then add something like
//dataimg.append("string1","KEN1");
e.preventDefault();
$.ajax({
type: 'POST',
url: 'register-file-upload.php',
data: dataimg,
dataType: "json",
contentType: false,
enctype: 'multipart/form-data',
cache: false,
processData:false,
beforeSend: function(){
$('#loader-icon').show();
},
success: function(response){
if (response["upload"] == 'ok'){
$('#intern_marksheet_image').val(response["image_name"]);
$('#loader-icon').html(response["image_error"]);
}else {
$('#intern_marksheet_image').val('- failed -');
$('#loader-icon').html("Not Successful");
}
}
});
});
})
</script>
и PHP будет следующим (Примечание. Что касается части проверки изображения — я удаляю их, чтобы вы могли сосредоточиться на части загрузки файлов, но вы можете добавить ее обратно)
<?php
function randStrGen601($len){
$result = "";
$chars = "0123456789abcdefghijklmnopqrstuvwxyz";
$charArray = str_split($chars);
for($i = 0; $i < $len; $i++){
$randItem = array_rand($charArray);
$result .= "".$charArray[$randItem];
}
return $result;
}
$error = false;
$imagetypeerror = false;
/*
The image validation part - I remove them so as to focus on the file upload
*/
if (!$error){
$targetDir = "./uploads/intern/";
$fileName = $_FILES['userFile']['tmp_name'];
// $udx = date("YmdHis");
$random2 = randStrGen601(4);
$fileName1 = $random2 . "_". $_FILES['userFile']['name'] ;
$fileName2 = str_replace(" ", "_", $fileName1);
$targetFilePath = $targetDir.$fileName2;
// Upload file to the server
move_uploaded_file($fileName, $targetFilePath);
$error = false;
$data['upload'] = "ok";
$data['image_error'] = "File Uploaded Successfully";
$data['image_name'] = $fileName2;
}
//returm $data;
echo json_encode($data);
?>
Дополнительный балл (можно попробовать позже)
Как я уже упоминал, обычный дизайн пользовательского интерфейса таков: когда пользователь выбирает файл, начинается загрузка (нет необходимости нажимать кнопку).
Для этого измените
$("#marksheet_upload").click(function(e) {
к
$("#userFile").change(function(e) {
Обычный дизайн пользовательского интерфейса: когда пользователь выбирает файл, начинается загрузка (не нужно нажимать кнопку).