Ответ 1
Я не уверен, где бы вы хотели, чтобы дополнительные изображения появлялись, но я добавил их после этого столбца:
<div class="col-md-4">
<div class="button success expand radius">
<span id="save_image_titlebar_logo_live">Recent Photograph</span>
<label class="custom-file-upload">
<input type="file" name="sign"/>
</label>
</div>
</div>
И вот колонка, которую я добавил, - "добавить изображения": (Вы можете попробовать эту функцию здесь, с обновлениями)
<div class="col-md-4">
<ul class="list-group" :if="images.length">
<li class="list-group-item" v-for="(f, index) in images" :key="index">
<button class="close" @click.prevent="removeImage(index, $event)">×</button>
<div class="button success expand radius">
<label class="custom-file-upload">
<input type="file" class="images[]" accept="image/*" @change="previewImage(index, $event)">
</label>
</div>
<div :class="'images[' + index + ']-preview image-preview'"></div>
</li>
</ul>
<button class="btn btn-link add-image" @click.prevent="addNewImage">Add Image</button>
</div>
И полный код Vue JS (с jQuery.ajax()
):
addForm = new Vue({
el: "#addForm",
data: {
name: '',
alias: '',
sex: '',
sez: [{
date: null,
details: null
}],
// I removed 'photo' and 'sign' because (I think) the're not necessary.
// Add I added 'images' so that we could easily add new images via Vue.
images: [],
maxImages: 5,
// Selector for the "Add Image" button. Try using (or you should use) ID
// instead; e.g. 'button#add-image'. But it has to be a 'button' element.
addImage: 'button.add-image'
},
methods: {
addNewRow: function() {
// I changed to 'this.sez.push' because 'this.seziure' is 'undefined'.
this.sez.push({
date: null,
details: null
});
},
addNewImage: function(e) {
var n = this.maxImages || -1;
if (n && this.images.length < n) {
this.images.push('');
}
this.checkImages();
},
removeImage: function(index) {
this.images.splice(index, 1);
this.checkImages();
},
checkImages: function() {
var n = this.maxImages || -1;
if (n && this.images.length >= n) {
$(this.addImage, this.el).prop('disabled', true); // Disables the button.
} else {
$(this.addImage, this.el).prop('disabled', false); // Enables the button.
}
},
previewImage: function(index, e) {
var r = new FileReader(),
f = e.target.files[0];
r.addEventListener('load', function() {
$('[class~="images[' + index + ']-preview"]', this.el).html(
'<img src="' + r.result + '" class="thumbnail img-responsive">'
);
}, false);
if (f) {
r.readAsDataURL(f);
}
},
handleSubmit: function(e) {
var vm = this;
var data = new FormData(e.target);
data.append('sez', this.sez);
data.append('name', this.name);
data.append('alias', this.alias);
data.append('sex', this.sex);
// The 'data' already contain the Signature and Recent Photograph images.
// Here we add the extra images as an array.
$('[class~="images[]"]', this.el).each(function(i) {
if (i > vm.maxImages - 1) {
return; // Max images reached.
}
data.append('images[' + i + ']', this.files[0]);
});
$.ajax({
url: 'http://localhost:4000/save/',
data: data,
type: 'POST',
dataType: 'json',
success: function(e) {
if (e.status) {
vm.response = e;
alert("success");
} else {
vm.response = e;
console.log(vm.response);
alert("Registration Failed");
}
},
cache: false,
contentType: false,
processData: false
});
return false;
},
},
});
Дополнительные примечания
Я знаю, что вы используете Node.js в фоновом режиме; однако я должен упомянуть, что в PHP переменная $_FILES
будет содержать все изображения (при условии, что name
полей правильно установлено); и я полагаю, что Node.js имеет аналогичную переменную или способ получения файлов.
И в следующем input
вы, возможно, забыли обернуть book.details
в v-model
:
<input type="text" class="form-control" book.details>
<input type="text" class="form-control" v-model="book.details"> <!-- Correct -->
ОБНОВИТЬ
Добавлена возможность ограничить количество изображений, разрешенных для выбора/выгрузки, и добавить предварительный просмотр для выбранного изображения. Кроме того, исправление "отправлять изображения как array
".