07.09.2019, 13:30
|
Аспирант
|
|
Регистрация: 04.07.2016
Сообщений: 78
|
|
Добавить в мой js код поле с файлом
Добрый день, есть скрипт который отправляет данные формы в php файл для дальнейшей обработки полей:
function addsite() {
sname = $("#sname").val();
scat1 = $("#scat1").val();
scat2 = $("#scat2").val();
scat3 = $("#scat3").val();
sprice = $("#sprice").val();
soldprice = $("#soldprice").val();
scms = $("#scms").val();
swork = $("#swork").val();
surl = $("#surl").val();
sopis = $("#sopis").val();
form = 'addsite';
user = '<?php echo $id; ?>';
$.ajax({
type:"POST",
url:"../php/lk.php",
data: {"sname":sname, "scat1":scat1, "scat2":scat2, "scat3":scat3, "sprice":sprice, "soldprice":soldprice, "scms":scms, "swork":swork, "surl":surl, "sopis":sopis, "form":form, "form":form, "user":user},
cache: false,
success: function(responce){
$('#addsite').html(responce);
}
})
}
Это все работает. Но в форме есть еще одно поле с файлом:
<input id="sscr" name="sscr" type="file" class="form-control">
Можно ли в мой js код передать еще и этот файл? (В php я обработаю, опыт есть), не знаю как в js это правильно дописать в data
|
|
07.09.2019, 14:46
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,989
|
|
Строки 2-13 выбросить.
В опциях $.ajax добавить два параметра: contentType: false и processData: false.
ID юзера не в код JS вставлять на стороне сервера, а в скрытое поле формы. Если это form = 'addsite' именование формы, то также получать ее как свойство формы.
Параметр data формы можно передать как data: new FormData(f), где f, это форма. Но такой способ имеет один недостаток, даже при не выбранном файле на сервере будет получено это поле, и как следствие ошибка загрузки файла. Поэтому элементы формы лучше обойти циклом добавив их имя/значение в FormData используя его методы.
|
|
07.09.2019, 15:02
|
Аспирант
|
|
Регистрация: 04.07.2016
Сообщений: 78
|
|
Путем проб и ошибок получилось так, файл ходит, обрабатывается (с передачей id юзера да, пока не придумал как это сделать)
$(function() {
$('#saddsite').on('submit', function(e){
e.preventDefault()
var form = $(this);
var data = new FormData();
// Сбор данных из обычных полей
form.find(':input[name]').not('[type="file"]').each(function() {
var field = $(this);
data.append(field.attr('name'), field.val());
});
data.append('form', 'addsite');
data.append('user', '<?php echo $id; ?>');
// Сбор данных о файле
var filesField = form.find('input[type="file"]');
var fileName = filesField.attr('name');
var file = filesField.prop('files')[0];
data.append(fileName, file) ;
$.ajax({
url: '../php/lk.php',
type: 'POST',
data: data,
contentType: false,
cache: false,
processData:false,
success: function(response) {
console.log(response)
}
});
})
});
|
|
07.09.2019, 15:14
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,989
|
|
$('#saddsite').on('submit', function(e){
e.preventDefault()
var data = new FormData();
а далее просто собрать поля, которые нужно оправить (те поля формы, которые имеют имя, то есть не требующие отправки их не должны иметь, та же кнопка submit к примеру.)
$.each(this.elements, function() {
if(this.name) data.append(this.name, this.value)
});
разбрасывать все отдельно на два цикла нет ни какого смысла, единственно, что нужно сделать, так это проверить тип поля, и если это файл, то добавлять только в том случае, если файл выбран, то есть его value не пусто.
PS. То есть полно это так:
$('#saddsite').on('submit', function(e){
e.preventDefault()
var data = new FormData();
$.each(this.elements, function() {
if(this.name) {
if(this.type=='file' && this.value) data.append(this.name, this.files[0]);
else data.append(this.name, this.value);
}
});
//если и это нужно form = 'addsite';, то
data.append('form', this.id);
$.ajax(
//....
)
});
Касаемо id юзера, чего там придумывать - отдавая страницу клиенту, помещайте в форму поле <input type="hidden" name="user" value="<?=$id>">.
Последний раз редактировалось laimas, 07.09.2019 в 16:19.
|
|
18.09.2019, 09:35
|
Аспирант
|
|
Регистрация: 22.01.2019
Сообщений: 61
|
|
Попытался повторить описанное в приведенном посте:
let imagevorkerimage=$(".fotoworker").prop('files')[0];
console.log(imagevorkerimage);
Выдает File { name: "jsB2SVztOqU.jpg", lastModified: 1561738954801, webkitRelativePath: "", size: 192016, type: "image/jpeg" }. Что из этого необходимо для сохранения файла ?
Пытался добавить в ajax переменные contentType: false и processData:
let dannienowworker="Строка, собранная из данных с других полей. Её содержимое в обработчике записывается в специальную таблицу бд";
$.ajax({
type: 'POST',
data:{dannienowworker:dannienowworker},
contentType: false,
processData:false,
url:"Файл обработчик",
success: function (result) {
}
});
В созданной строке бд все столбцы пустые. Без вышеупомянутх свойст все работает нормально. Данные в файл-обработчик поступают в ином виде (сейчас содержащая их входное значание переменная - $_POST["dannienowworker"])?
|
|
18.09.2019, 11:15
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,989
|
|
Сообщение от Alehana
|
t imagevorkerimage=$(".fotoworker").prop('files')[0];
|
Это для чего?
Сообщение от laimas
|
let dannienowworker="Строка, собранная из данных с других полей. Её содержимое в обработчике записывается в специальную таблицу бд";
|
Если data:{dannienowworker:dannienowworker}, это строка, то чего же вы ожидаете от $_POST["dannienowworker"])?
Последний раз редактировалось laimas, 18.09.2019 в 11:25.
|
|
|
|