【发布时间】:2021-07-08 01:01:48
【问题描述】:
我有一个响应式网络应用程序,用户可以在该应用程序上上传照片。只要您选择现有文件并且不要尝试拍照上传,就可以在桌面上很好地工作,甚至可以在手机上工作。
当您点击手机上的上传元素时,操作系统会让您选择是从存储的文件中选择还是使用相机。如果您使用相机,则上传有效,但预览不会,除非我在以下 javascript 中的某处插入警报。 (此代码在文件输入更改时触发)
var photoFileSelected = function(event) {
var input = event.target;
//************************************************************************//
//*** Initialize previewPopup
//************************************************************************//
var previewPopup = $('#uploadprompt').mobiscroll4().popup({
display: 'top',
responsive: {small: {display: 'center'}},
closeOnOverlayTap: false,
buttons: [{
text: 'Save',
cssClass: 'mbsc-fr-btn uploadprompt-okbutton mbsc-disabled',
handler: function(event,inst){startUploadingPhoto();}
},'cancel'],
}).mobiscroll4('getInst');
//************************************************************************//
//*** Validate selected file
//************************************************************************//
// get selected file element
var oFile = document.getElementById('image_file_photo').files[0];
var valid = true;
// filter for image files
var rFilter = /^(image\/bmp|image\/gif|image\/jpeg|image\/png|image\/tiff)$/i;
if (! rFilter.test(oFile.type)) {
popup("Error","Invalid file type selected. Must be an image file")
valid = false;
}
// little test for filesize
if (oFile.size > iMaxFilesize) {
popup("Error","Selected file is too large. Max size is 10 MB.")
valid = false;
}
if(valid){
//************************************************************************//
//*** Load image preview
//************************************************************************//
var reader = new FileReader();
reader.onload = function(){
$('.uploadprompt-okbutton').removeClass('mbsc-disabled');
var dataURL = reader.result;
$('#preview-photo').attr("src",dataURL);
};
reader.readAsDataURL(input.files[0]);
previewPopup.show();
}
};
例如,我可以提醒 oFile.size,它会提醒一个值,当我关闭弹出窗口时,会加载预览,一切都很好。如果我注释掉警报,大多数情况下根本不会加载预览。有时我可以让它加载,但我似乎找不到模式。似乎是随机的。我已经让它加载了大约 5% 的时间,但绝大多数情况下预览不会显示,但我知道文件上传正在工作,因为正如我所说,我可以提醒文件大小甚至 dataURL 和它看起来很正常。
我也尝试使用 setTimeout() 来查看是否是时间问题,但没有奏效。
有什么想法吗?
【问题讨论】:
-
目前,除了询问浏览器是否确实报告了任何 javascript 错误之外,还不确定针对您的代码的具体问题的最佳建议?老实说,当我想在上传文件之前对本地图像进行这种预览时,我没有使用 FileReader() - 以您的代码为例,我只需设置预览的“src”图像为“input.files [0]”,浏览器应该负责渲染图像。您是否将 FileReader() 用于任何后续目的?如果只是为了图片预览,我想你可以不用它
-
不幸的是,没有 JavaScript 错误,因为这样可以很容易地追踪。我还尝试了将 input.files[0] 直接分配到预览图像的 src 中的建议,但如果我这样做,我根本无法获得预览。
-
实际上,我回去检查了一些我以前的代码,实际上我将(在您的情况下)“input.files[0]”值包装在 URL.createObjectURL() 中。你可以试试看。否则,您能否添加更多 HTML,以便我们可以看到实际的文件输入元素和应该显示预览的图像元素?
-
感谢您的 cmets,但看起来我已经弄清楚了。我会发布一个答案来解释,以防它帮助其他人。
-
好消息!是的,一定要发布答案——毕竟这就是关键——帮助别人和你自己:)
标签: javascript php file-upload