這是我前端:
$('body').on('change', '.add-btn',function(e){
e.preventDefault();
var id = $('.admin-upload-inline').length + 1;
var removeBtn = $('<i class="admin-upload-remove material-icons">highlight_off</i>');
var iconLayout = $('<div class="admin-upload-inline add-btn pointer" id="icon-layout-'+id+'">');
var fileInput = $(
'<input type="hidden" id="file'+id+'" name="icon[]" class="admin-upload" value="">'
+ '<img src="../images/30.png" id="pre'+id+'" class="admin-upload-review">');
removeBtn.click(function() {
$(this).fadeOut().parent().remove();
var wrappers = $(".admin-upload-inline");
if (wrappers.length > 1) {
var newId = 1;
wrappers.each(function(){
renewId = "icon-layout-" + newId;
$(this).attr("id",renewId);
newId++;
});
}
});
if(id < 8){
iconLayout.append(fileInput);
iconLayout.append(removeBtn);
$(".addend-display").append(iconLayout);
}
var reader = new FileReader();
reader.onload = function(e) {
$('#pre' + id).attr('src', e.target.result);
$('#file' + id).attr('value', e.target.result);
}
reader.readAsDataURL(this.files[0]);
<div class="admin-upload-inline pointer">
<input type="file" id="file1" name="icons[]" class="add-btn admin-upload" accept="image/jpeg, image/png, image/jpg">
<img src="../images/30.png" id="pre1" class="admin-upload-review">
<i class="material-icons upload_cover_icon admin-upload-icon-add">add_circle_outline</i>
</div>
<div class="addend-display">
</div>
我的後端這樣接:
foreach ($_POST['icon'] as $value) {
preg_match('/^(data:\s*image\/(\w+);base64,)/', $value, $result);
$file_ext = '.'.$result[2];
file_put_contents('../../images/product/'.md5().$file_ext, base64_decode(str_replace($result[1], '', $value)));
}
為什麼他都只會是最後一張圖會保存到?
假設我上傳ABC圖好了
他永遠只會儲存到 C圖? (../../images/product/)
於是我試著印印看icon欄位,我發現我同時上傳ABC圖,直接印出 $_POST['icon]
他好像他只會有一張圖?(一個base64的連結)
怎麼會這樣?
妳的問題在於 FileReader 只處理了一張上傳圖片,多張的處理請參考以下方式:
https://blog.csdn.net/wjy199506/article/details/62046093
但是我有用谷歌檢查看,確實每一個 input 都有不同的 base網址噎
靠杯,我現在看才發現雖然預覽不一樣,但是base是一樣的。。。。
女生不要隨便靠杯~
但是我只有一個 input file 而已,這怎麼辦?
我現在有點亂,我發現我傳了四張圖,一跟四是一樣的 base,二跟三世一樣的 base....
先問一個問題好了,怎麼樣在幾乎同一個時間,產生不同的字串?
foreach ($_POST['icon'] as $value) {
preg_match('/^(data:\s*image\/(\w+);base64,)/', $value, $result);
$file_ext = '.'.$result[2];
file_put_contents('../../images/product/'.md5(time()).$file_ext, base64_decode(str_replace($result[1], '', $value)));
}
我用 time() 發現沒用,根本同一個時間處理完成
只有一個 input file,那就是妳js寫錯的關係~
我目的就是只要一個 input file就好了,他產生 base64 到 input hidden去
把產生的base64,push到array裡,就好了啊。
剩下用for去做。