异步上传多图片且图片回显到页面的解决方案

如何用input标签上传多个图片并回显 如何用input标签上传多个图片并回显 本文主要记录如何用input标签和jquery实现多图片的上传和回显,不会涉及后端的交互,大概的效果看图 我们从零来做一个这样的demo 第一步: 我们先完善一下我们的页面,默认的input-file标签非常丑,我们美化一下它,不会的可以百度一下,就是外面套个盒子,设置input的opacity为0,然后外面的盒子设计成我们喜欢的样式即可... 阅读详情

概述

web开发中上传文件,尤其是上传图片功能,实在太普遍,像评论、用户头像等等。可如何优雅的实现异步上传,并且图片显示页面是需要花一点心思来思考的。网上很多诸如:“图片上传插件”等都是同一种实现思路的。今天介绍两种解决方案,重点是掌握思路,代码实现比较容易。

一、FileReader对象读取文件将图片转Base64

现在先不考虑图片上传,先解决图片回显的方案:第一种回显方案 -- FileReader对象

推荐API文档(中文):https://developer.mozilla.org/zh-CN/docs/Web/API/FileReader

FileReader是IE10以上可以使用的浏览器对象,其可以对文件解析,转成Base64、字符串、字节数组等。

通过<input type="file">选择一张图片,图片回显借助FileReader的readAsDataURL()方法,将图片转成Base64,后用<img src="Base64">可直接显示图片,代码演示如下。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>上传演示</title>
    <script src="https://apps.bdimg.com/libs/jquery/2.1.4/jquery.min.js"></script>
    <style>
        img{max-width: 100px;}
    </style>
</head>
<body>
    <input type="file" id="upload" accept="image/*">
    <div></div>
<script>
    $('#upload').on('change', function (e) {
        //原生的文件对象
        var curFile = this.files[0];
	var reader = new FileReader();
        //调它的readAsDataURL并把原生File对象传给它,
        reader.readAsDataURL(curFile);//base64
        //监听它的onload事件,load完读取的结果就在它的result属性里了
        reader.onload = function () {
            $('div').append($('<img src="' + reader.result + '">'));
        }
    })
</script>
</body>
</html>

  1. 页面<input type="file" id="upload">负责选择文件;
  2. input添加change事件,方法中获取文件对象this.files[0];
  3. 创建FileReader对象;
  4. FileReader对象通过readAsDataURL()文件为Base64;
  5. reader.onload是读取完文件的回调方法;
  6. 向div元素中添加一个<img>标签,其中的src属性是reader.result(读取到的Base64)

二、异步上传文件

上面第一种方案的图片回显处理完了,接下来要把实际的图片上传到服务器了。上传需要前台和后台共同处理。

2.1前台的文件上传

普通的form表单提交文件需要3样:<input type="file">控件,提交按钮还有<form enctype="multipart/form-data" method="post">。而异步上传文件则需要手动组装表单元素FormData对象,再通过ajax将数据提交到后台,核心代码如下。

<body>
    <input type="file" id="upload">
    <div></div>
<script>
$('#upload').on('change', function (e) {
	//原生的文件对象
	var curFile = this.files[0];
	// 创建表单对象并将获取的文件对象绑定
	var formData = new FormData();
	formData.append('file', curFile);

	$.ajax({
		url: 'http://localhost:8080/upload',
		type: 'POST',
		data: formData,
		// 将表单对象转换成查询字符串形式,默认是 true。
		processData: false,
		// 内容类型,默认是:"application/x-www-form-urlencoded",此处false将转成二进制
		contentType: false,
		success: function (res) {
		   console.log(res);// 后台返回的值
		   reviewFile(curFile);// 将文件对象读取
		}
	});
	function readerFile(file) {
		var reader = new FileReader();
		reader.readAsDataURL(file);
		reader.onload = function () {
			$('div').append($('<img src="'+reader.result+'">'));
		}
	}
})
</script>
</body>
  1. 先获取文件对象var curFile = this.files[0];
  2. 创建表单对象并将添加文件对象var formData = new FormData();formData.append('file', curFile);
  3. 通过异步方法将表单对象传给后台,后台返回后通过FileReader对象回显图片,当然也可以将回显的方法写在异步之前;
    注意:processData: false,contentType: false,这两个属性必须设置false。否则后台不能接收。

2.2 后台接收异步提交的表单请求

后台接收文件不是本文重点,因为后台接收文件的方法很多,此处演示使用Spring Boot快速搭建一个web项目,pox.xml只需要引入spring-boot-starter-web即可(包含了上传等组件)。

后台接收文件的核心方法:

@PostMapping("upload")
@CrossOrigin  // 如果涉及跨域则添加此注解
public Object upload(@RequestParam("file") MultipartFile img) {

	// 上传的目录windows
	String rootDir = "D:\\data\\www\\img";
	//String rootDir = "/data/www"; // Linux

	// 原始文件名称 如123.jpg
	String originalName = img.getOriginalFilename();
	// 文件后缀
	String suffix = originalName.substring(originalName.lastIndexOf("."));
	// 新文件名称 UUID+后缀
	String newName = UUID.randomUUID().toString() + suffix;
	// 创建一个File对象,通过目录和文件名
	File file = new File(rootDir, newName);

	// 创建目录
	if (!file.getParentFile().exists()) {
		file.getParentFile().mkdirs();
	}
	try {
		img.transferTo(file);// 核心方法 读取文件并写出
	} catch (IOException e) {
		e.printStackTrace();
	}

	// 返回创建的文件名
	return newName;
}

后台代码不做解释了,比较容易理解,流程就是将文件以UUID重命名存放在指定目录下。要知道Spring通过MultipartFile对象处理文件上传的就可以了。

启动项目演示

至此已经完成第一种异步上传图片,并回显图片到页面,这种方法“上传(ajax)”和“显示(FileReader)”是分开解决的,上传成功与否不影响图片在页面显示。

三、访问上传图片的远程地址显示图片

接下来说下第二种上传显示的思路:

不需要借助FileReader对象,生产环境中,因为文件已经上传到了图片服务器,通过URL地址是可以访问到那张刚刚上传的图片的。所以可以按这种思路来完成“上传后回显”图片的方式,简单清晰。

3.1为了演示,借助nginx来做静态服务器,通过URL地址指向本地的指定文件目录,下面是简单的Nginx做静态服务器的配置。这里仅仅是做演示,意思是通过浏览器访问http://localhost/123.jpg,就是访问本地D:\data\www\img\123.jpg。

server {
	listen       80;
	server_name  localhost;
	#charset koi8-r;
	#access_log  logs/host.access.log  main;
	location / {
		root   D:\data\www\img ;// 通过localhost访问到D盘下的指定目录
	}
}

3.2后台代码不变,前台代码修改,后台返回新文件名称,前台异步上传成功后指定src属性为远程图片地址即可<img src="远程图片地址">;

<body>
    <input type="file" id="upload">
    <div></div>
<script>
$('#upload').on('change', function (e) {
	//原生的文件对象
	var curFile = this.files[0];

	var formData = new FormData();
	formData.append('file', curFile);

	$.ajax({
		url: 'http://localhost:8080/upload',
		type: 'POST',
		data: formData,
		processData: false,
		contentType: false,
		// res是后台返回上传文件的文件名
		success: function (res) {
			// nginx指向D盘图片目录
			$('div').append($('<img src="http://localhost/'+res+'">'));
		}
	});
})
</script>

通过img标签src属性,即可看出访问的是远程地址来达到了回显图片的方式。

总结

本文两种方式上传回显图片,第一种ajax异步上传和FileReader读取文件显示图片,都是分开来处理的,特点是上传成功与否不影响图片显示,并且可以在异步上传文件前就能将图片显示页面。

第二种是通过异步上传后,页面去加载刚刚上传的那个图片路径来实现图片显示,这种方式图片显示只能等到上传成功后才能加载到图片,显示与上传是分不开的。只是在加载图片的时候会多发送一个图片的请求,这样一对比一种方法应该会更快一些。没有好坏之分,就看你是怎么选择的。只要搞懂两种方案的思路,我想自己也能做出选择了。

扩展:多图片选择:只在input标签中添加multiple属性即可,获取文件对象的时候就不能this.files[0]了,需要遍历this.files对象来获取所有文件对象。关键是下面代码:

// 当前选择的图片集合
var curFile = this.files;
for (var i = 0; i < curFile.length; i++) {
	formData.append('file', curFile[i]);
}

当然后台接收也得是个数组或列表的MultipartFile对象集合就可以接收了。剩下的就由各位同学自己去动手实现吧。今天就到这里,好久没更新了。ps:gif录屏真好使。

(完)

SpringMVC多图片上传 从前端(仿qq空间)到数据库图片地址存储 SpringMVC图片上传 从前端(仿qq空间)到数据库地址存储 功能:限制图片最多可上传张数,类型,可以在页面上进行删除图片,可提交重复图片,点击提交时才会将所有图片进行上传(没有进行异步上传);后端获取图片,并将图片地址以JSON形式存入数据库中 由于自己能力不足,参考了很多其他博客才简陋的将其敲出来,由于参考较多,未能一一列出,抱歉哈,还有很多不足,还望批评指正哈>_< 图片... 阅读详情

相关推荐

避坑指南:若依多图片上传常见问题及解决方案(含代码示例)

本文深入解析了若依框架中多图片上传功能的常见问题与解决方案。针对图片路径存储、前端回显等核心痛点,提供了从数据库设计、安全防护到性能优化的完整实战指南,并包含详细的代码示例,帮助开发者高效实现稳定可靠的多图上传模块。

cola5的博客 345

spring+springMVC+mybaits实现角色权限管理脚手架系统实战开发教程

本课程将把ssm框架基本原理进行深度讲解,并带大家从基础的hello world开始,逐步写出一个能够实际运用的角色权限系统,即通用任何系统的的脚手架系统,可以用在任何管理类系统中。

uniapp中的uni-file-picker组件多图上传问题

前言:在uniapp官方文档中的uni-file-picker组件可实现图片上传功能,官方文档:uni-app官网 中的案例不能完全满足需求,在接口上传失败的时候,需要页面不回显失败的图片,仅回显显示上传成功的图片,因为多图异步上传顺序的问题,可能会导致同时操作list,以至于删除图片出错。所以我才用多图同步顺序上传来规避这个问题。 以下是代码: view代码: <uni-file-picker :value="filePathsList" :auto-upload="false" file-medi

m0_67402823的博客 3826

前端图片上传与回显

图片上传与回显 图片上传 此处使用的是iview的upload <Upload ref="upload" multiple :format="['jpg','png','pdf']" type="drag" action="/" :max-size="20480" :show-upload-list="true" :on-exceeded-size="handleMaxSize" :before-upload="handleBeforeUpload" >

weixin_48175704的博客 3034

手机与PC端Web多图片上传及回显完整解决方案

htmltable {th, td {th {pre {简介:在Web开发中,多图片上传与回显是移动端和PC端常见的功能需求。本资源“手机及PC端web多图片上传及回显.rar”基于fileinput组件,提供了一套完整的实现方案,支持多文件选择、上传前预览、异步上传与服务器回显等功能。通过HTML5的File API与AJAX技术,结合JavaScript增强交互体验,适用于各类跨平台Web应用。

weixin_35753291的博客 986

Yolov5自学笔记之一--从入门到入狱,功能强大不要乱用(实现yolov5的基本功能使用流程及训练自己的数据集)

零基础自学yolov5,学会简单使用和训练自己的数据集,在自己工作中使用

qq_41597915的博客 1万+

NG-ZORRO中Upload上传控件的实际运用

想要了解Upload更多请看这里 - > https://ng.ant.design/components/upload/zh 本文注重实现,并补充说明所用知识点~ 背景:获取图片并在列表中显示缩略图且可预览图片,可向列表中添加新的图片或删除图片。 先上代码: test.component.ts import { Component, OnInit } from '@angular/core...

sinat_38930182的博客 9476

微机原理课程设计-模拟十字路口交通信号灯

一、设计任务描述 1.1设计目的 通过课程设计使学生更进一步掌握微机原理及应用课程的有关知识,提高应用微机解决问题的能力,加深对微机应用的理解。通过查阅资料,结合所学知识进行软、硬件的设计,使学生初步掌握应用微机解决问题的步骤及方法。为以后学生结合专业从事微机应用设计奠定基础。 1.2 设计要求 控制LED灯,按照十字路口红绿灯的原理亮灭显示: (1) 东西方向车辆放行x秒...

Learning_is_endless的博客 2万+

php多图片上传并回显,如何用input标签上传多个图片并回显

本文主要记录如何用input标签和jquery实现多图片的上传和回显,不会涉及后端的交互,大概的效果看图效果图我们从零来做一个这样的demo第一步:我们先完善一下我们的页面,默认的input-file标签非常丑,我们美化一下它,不会的可以百度一下,就是外面套个盒子,设置input的opacity为0,然后外面的盒子设计成我们喜欢的样式即可,我就随便做了一下。大概的样式还是放一下源码,只谈效果,不放...

weixin_32537985的博客 456

Visual Studio 2015 插件开发 从入门到放弃(一)

必需知识:C#和Visual Studio (1)安装 Visual Studio 2015 的时候选择 Visual Studio 扩展性工具(Visual Studio Extensibility Tools)。对于已经安装好 Visual Studio 2015 的小伙伴,可以找VS2015的安装包,或者在程序与功能中找VS2015双击,在VS2015界面中选择 修改,再选择

AncientPeople的博客 2万+

手把手教你学Simulink——基于Simulink的模糊自适应PI调节FOC电流环

本文提出基于模糊自适应PI控制的FOC电流环优化方案,针对传统PI控制参数固化、抗扰性差等问题,通过模糊逻辑在线调整PI参数。方案采用双输入(电流误差及变化率)和三输出(ΔKp/ΔKi/PI调节)结构,实现动态响应时间<30μs(提升38%)、超调<5%(降低71%)、参数摄动下误差<±0.4A(精度提升73%)。详细介绍了Simulink建模步骤,包括模糊规则设计(7语言变量、49条规则)、隶属度函数配置及自适应PI实现逻辑,并提供实机部署建议。仿真结果表明,该方法显著提升系统鲁棒性,特

MHD0815的博客 79

php上传文件回显,使用input标签和jquery实现多图片的上传和回显功能步骤详解

这次给大家带来使用input标签和jquery实现多图片的上传和回显功能步骤详解,使用input标签和jquery实现多图片的上传和回显功能的注意事项有哪些,下面就是实战案例,一起来看一下。效果图我们从零来做一个这样的demo第一步:我们先完善一下我们的页面,默认的input-file标签非常丑,我们美化一下它,不会的可以百度一下,就是外面套个盒子,设置input的opacity为0,然后外面的盒...

weixin_28267011的博客 283

OpenClaw部署太难?汉化版+中文社区+国产替代品,国内用户零门槛指南

OpenClaw作为GitHub 10万+星的开源AI助手平台,近期在国内AI圈备受关注 🌟 但部署难度和英文界面让很多用户望而却步。本文整理了针对国内用户的友好资源和简便替代方案,帮助国内用户零门槛上手AI助手工具 🚀

XiaoqiangClub的博客 5758

java 图片回显_如何用input标签上传多个图片并回显

本文主要记录如何用input标签和jquery实现多图片的上传和回显,不会涉及后端的交互,大概的效果看图我们从零来做一个这样的demo第一步:我们先完善一下我们的页面,默认的input-file标签非常丑,我们美化一下它,不会的可以百度一下,就是外面套个盒子,设置input的opacity为0,然后外面的盒子设计成我们喜欢的样式即可,我就随便做了一下。还是放一下源码,只谈效果,不放源码的都是耍流氓...

weixin_42513632的博客 582

CMake入门教程【基础篇】在Windows、Linux上安装CMake

CMake如何下载与安装

小鱼酱的博客 2725

T型三电平逆变器中点电位平衡详解

T型三电平逆变器(T-type Three-Level Inverter)是一种高效的多电平拓扑,相比传统NPC(Neutral Point Clamped)三电平逆变器,具有更低的开关损耗、更高效率和更简单的结构,尤其适用于中功率应用(如光伏逆变器、风电变换器和工业驱动)。(T-type Three-Level Inverter)中的应用已成为当前中高压功率变换领域(如光伏逆变器、储能PCS、电动汽车充电桩、风电并网和工业驱动)的热门方案。针对 T型逆变器,类似 NPC 的零序注入法适用。

专注于前沿技术的探索与实践,热衷于从代码逻辑、架构设计到行业应用等多维度深挖技术本质。期待在技术之路上与你共同成长~ 544

php多图片上传并回显,如何用input标签和jquery实现多图片的上传和回显功能

本文主要记录如何用input标签和jquery实现多图片的上传和回显,不会涉及后端的交互,大概的效果看图效果图我们从零来做一个这样的demo第一步:我们先完善一下我们的页面,默认的input-file标签非常丑,我们美化一下它,不会的可以百度一下,就是外面套个盒子,设置input的opacity为0,然后外面的盒子设计成我们喜欢的样式即可,我就随便做了一下。大概的样式还是放一下源码,只谈效果,不放...

weixin_33549115的博客 215

Allegro172版本DFM功能介绍

Allegro172版本提供了实时DFM检查的功能,让违反要求的地方实时以DRC的形式报出来,让加工不可加工因素在设计的时候同步避免。打开Constraint,选择Manufacturing, 所有DFM相关DRC都在这。把所有下面DRC开关(DFM,DFA,DFT)都选择on,选择OK。这个规则和物理和间距规则等等都没有关系,单独的一个加工规则。这些DRC大部分是正常的,正常的可以去修改规则来消除。等待DRC刷新,板子上会出现很多DRC,类似下图。下面介绍如何调用和产生DFM规则。一直往下点击next。

weixin_54787054的博客 1337

如何实现上传多个图片并依次展示_js 实现多图片上传,并且展示上传进度

最近项目需要做一个如下图所示的图片上传功能;image.png找了很多插件发现都不是我自己想要的,索性自己实现一个,也可以学习一下;主要的思想就是:1.所有的图片包括相机图标的蓝色窗口(以下皆描述为相机)都看成一个li,点击相机选择文件上传;2.读取到文件之后,循环在相机之前插入图片的li,具体的图片处理,见2-1至2-53.如果图片个数达到要求,隐藏相机;4.删除图片,将对应的li remove...

weixin_39634052的博客 1090

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

使用JS实现多图片在前台展示,删除及上传的案例

有不少插件都能实现图片上传删除的功能,但是有时候我们需要有一些独特的样式,是插件所不能实现的,而且理解一些图片上传的原理也是件挺好的事情。 之前的项目就有这个需求,因为该项目是一个比较小的手机端的页面,想着再引进去一个插件也没必要,所以就自己写了个小demo,比较简陋,不足之处可以给点意见。 在页面上就使用input type='file’来访问相机或者本地图库 <div class="ph...

BKOO_94的博客 1095

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

layUI多图片上传(编辑回显)

回显数据需要将文件url放置pictureListData集合中。

qq_55943849的博客 596

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

php用户多图预览上传,单页面实现多处多图片预览上传?

可以考虑用form+iframe模拟AJAX异步上传:form的target设为页面内的一个iframe,让这个iframe显示action请求后的内容.能够实现单页面多处多图片预览上传,不需要任何插件,支持IE8.if(isset($_POST['submit']) && !empty($_FILES['file'])) {$i = 0;foreach( $_FILES['fil...

weixin_32916385的博客 279

Thinkphp5 + ajax实现异步批量上传图片

我们知道图片上传有form表单、ajax上传。本文主要讲解ajax上传,目前仅支持pc,后续会补充移动端,如果你遇到了图片批量上传的场景,笔者的思路及实现方法希望可以对你有些帮助,话不多说,前端代码如下: &lt;!DOCTYPE html&gt; &lt;html lang="en"&gt; &lt;head&gt; &lt;meta charset="UTF-8"&gt; ...

Kamto 3148

ajax图片上传及时回显,jsp+ajax+springMvc图片上传立刻回显 电商

思路:onchange()事件触发异步请求,js将成功后返回图片的地址动态写入JSP页面: 外层一个ID为myForm的表单 *上传产品图片(XX尺寸):注:该尺寸图片必须为90x150。请上传图片的大小不超过3MBJS函数function submitImgSize1Upload() {var option = {url:"${path}/upload/upload.do",//使用ajax...

weixin_28475533的博客 252
上一篇: Jquery Validata表单验证和Jquery Form异步表单的结合使用(Jquery Validata和Form)
下一篇: Spring MVC数据绑定问题(实体中包含集合数据绑定问题)
小流至江河
博客等级 码龄9年 223粉丝 53原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值