淘淘商城第27讲——实现图片上传功能

分析一下图片上传相关的前端页面

上文我们使用FastDFS-Client测试了一下简单的文件上传操作,淘淘商城项目中新增商品时上传图片的功能还没实现,如下图所示。本文将花大量笔墨来教大家如何实现图片上传这个功能。
在这里插入图片描述
我们来看下item-add.jsp页面,可以看到上传图片触发的方法是通过叫做picFileUpload的class来处理的,在<a>标签的下方是一个隐藏域,是用来接收图片上传到图片服务器的回显地址的,当我们提交表单的时候,可以把这些图片地址保存到数据库中去。
在这里插入图片描述
图片上传的流程是这样的,item-add.jsp页面加载完之后,会自动调用TAOTAO.init方法进行初始化,如下图所示。
在这里插入图片描述
TAOTAO是在common.js文件中定义的,我们来看下common.js文件,可以看到TAOTAO = TT都是在这里定义的,如下图所示。
在这里插入图片描述
下面我们来编码实现图片上传这个功能。

实现图片上传功能

导包

上传图片需要依赖commons-io和commons-fileupload这两个开发包,因此我们需要在taotao-manger-web工程的Maven依赖中查看一下是否有这两个jar包,可以看到目前是有commons-io-1.3.2.jar这个jar包的(它是在taotao-common工程的Maven依赖中,而taotao-manager-web工程依赖了taotao-common工程,因此它也有了这个jar包)。
在这里插入图片描述
但目前没有commons-fileupload这个jar包的,因此我们需要在taotao-manager-web工程的pom文件中添加对commons-fileupload的依赖。添加的依赖如下,由于在taotao-parent工程当中统一定义了版本号,因此这里不用再指定版本号了。

<!-- 文件上传组件 -->
<dependency><groupId>commons-fileupload</groupId><artifactId>commons-fileupload</artifactId>
</dependency>

配置文件上传解析器

我们需要在taotao-manager-web工程的springmvc.xml文件当中配置一下文件上传解析器,如下图所示。
在这里插入图片描述
为方便大家复制,现把文件上传解析器的配置贴出:

<!-- 定义文件上传解析器 -->
<bean id="multipartResolver"class="org.springframework.web.multipart.commons.CommonsMultipartResolver"><!-- 设定默认编码 --><property name="defaultEncoding" value="UTF-8"></property><!-- 设定文件上传的最大值5MB,5*1024*1024 --><property name="maxUploadSize" value="5242880"></property>
</bean>

配置访问图片前缀

我们在访问图片时是以http的方式来访问的,例如http://192.168.81.132:8888/group1/M00/00/00/wKicDVjxPn2AOBiGAAHk-VzqZ6w952.jpg,从上文中我们知道图片服务器返回的图片路径是group1/M00/00/00/wKicDVjxPn2AOBiGAAHk-VzqZ6w952.jpg,也就是说没有前面那部分路径,即http://192.168.81.132:8888/,而我们又不能在代码中写死前缀,因为IP地址及端口号都有可能更改,因此最好是将它们放到配置文件当中。

于是,我们在src/main/resources/resource目录下新建一个resource.properties文件,在配置文件中输入IMAGE_SERVER_URL=http://192.168.81.132:8888/,这说明图片服务器中的Nginx配置的访问端口是8888,如下图所示。
在这里插入图片描述

加载外部配置文件

我们在上面新建了resource.properties这个文件之后,在Spring容器中我们就需要加载该配置文件了,因此我们在springmvc.xml配置文件中加入如下配置:

<context:property-placeholder location="classpath:resource/resource.properties" />

如此一来,springmvc.xml配置文件的完整内容就应该是下面这样子的了。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"xmlns:context="http://www.springframework.org/schema/context"xmlns:dubbo="http://code.alibabatech.com/schema/dubbo" xmlns:mvc="http://www.springframework.org/schema/mvc"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsdhttp://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.2.xsdhttp://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.2.xsd"><!-- 加载外部属性文件 --><context:property-placeholder location="classpath:resource/resource.properties" /><context:component-scan base-package="com.taotao.controller" /><mvc:annotation-driven /><beanclass="org.springframework.web.servlet.view.InternalResourceViewResolver"><property name="prefix" value="/WEB-INF/jsp/" /><property name="suffix" value=".jsp" /></bean>	<!-- 配置静态资源映射 --><!-- 指定/WEB-INF/js/和/WEB-INF/css/下的所有的静态资源(包括子目录下的静态资源)都不被拦截 --><!-- mapping=/js/**:表示访问静态资源的路径的形式,/js/**表示可以访问/js/下的静态资源或者所有的子目录下的静态资源 --><mvc:resources location="/WEB-INF/js/" mapping="/js/**"/><mvc:resources location="/WEB-INF/css/" mapping="/css/**"/><!-- 配置一个文件上传解析器 --><bean id="multipartResolver"class="org.springframework.web.multipart.commons.CommonsMultipartResolver"><!-- 设定默认编码 --><property name="defaultEncoding" value="UTF-8"></property><!-- 设定文件上传的最大值5MB,5*1024*1024 --><property name="maxUploadSize" value="5242880"></property></bean><!-- 引用Dubbo服务 --><dubbo:application name="taotao-manager-web"/><dubbo:registry protocol="zookeeper" address="192.168.81.131:2181"/>	<dubbo:reference interface="com.taotao.service.TestService" id="testService" /><dubbo:reference interface="com.taotao.service.ItemService" id="itemService" /><dubbo:reference interface="com.taotao.service.ItemCatService" id="itemCatService" /></beans>

创建Controller

我们需要新建一个PictureController类来处理图片上传操作,如下图所示。
在这里插入图片描述
上图中的@Value("${IMAGE_SERVER_URL}")注解是为了注入我们在resource.properties配置文件中配置的图片访问前缀。@RequestMapping("/pic/upload")注解指定了上传文件(图片)请求的url,与下图指定的url一样,以上picUpload方法中的形参(即uploadFile)与下图中的上传文件的参数名称是要一样的。
在这里插入图片描述
不知你有没有想过,picUpload方法应该返回什么样格式的结果呢?我们可以从kindeditor官网查看一下,如下图所示,可以看到返回值格式是json串。
这里写图片描述
那么此时我们便有三种实现方式了。第一种实现方式是直接返回Map格式的数据,json和Map数据都是key和value的形式,因此返回Map是没问题的。第二种实现方式是创建一个pojo类,该类应有三个属性,分别是error、url以及message,然后再将该类转换为json之后返回。第三种实现方式是将Map转变为json字符串返回。这里我们暂且使用第一种实现方式。

为了方便大家复制,我会把PictureController类的代码粘贴在下面。

package com.taotao.controller;import java.util.HashMap;
import java.util.Map;import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;import com.taotao.utils.FastDFSClient;/*** 图片上传Controller* @author liayun**/@Controller
public class PictureController {@Value("${IMAGE_SERVER_URL}")private String IMAGE_SERVER_URL;@RequestMapping("/pic/upload")@ResponseBodypublic /*String*/ Map picUpload(MultipartFile uploadFile) {try {// 接收上传的文件// 取文件的扩展名String originalFilename = uploadFile.getOriginalFilename();String extName = originalFilename.substring(originalFilename.lastIndexOf(".") + 1);// 上传到图片服务器FastDFSClient fastDFSClient = new FastDFSClient("classpath:resource/client.conf");String url = fastDFSClient.uploadFile(uploadFile.getBytes(), extName);url = IMAGE_SERVER_URL + url;// 响应上传图片的urlMap result = new HashMap();result.put("error", 0);result.put("url", url);return result;} catch (Exception e) {e.printStackTrace();Map result = new HashMap();result.put("error", 0);result.put("message", "图片上传失败");return result;}}}

测试图片上传功能

现在我们就来试试图片上传这个功能,如下图所示,发现点击开始上传按钮之后图片正常回显了。
在这里插入图片描述
接着我们点击全部插入按钮,可以看到在上传图片按钮的下方有我们刚才上传的四张图片,而且我们是可以点击任何一张图片在浏览器中浏览的,比如我们点击第四张图片。
在这里插入图片描述
在浏览器中访问的效果如下图所示。
在这里插入图片描述
这样我们的图片上传功能便实现了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/40509.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

面试官:GET 请求能上传图片吗?我蒙了

前言 曾经遇到的面试题&#xff0c;觉得挺有意思&#xff0c;来说下我的答案及思考过程。 首先&#xff0c;我们要知道的是&#xff0c;图片一般有两种传输方式&#xff1a;base64和file对象。 base64 图片 图片的base64编码想必大家都见过&#xff1a; base64的本质是字符串…

面试:GET 请求能上传图片吗,已解决

转公众号&#xff1a; java大后端 前言 曾经遇到的面试题&#xff0c;觉得挺有意思&#xff0c;来说下我的答案及思考过程。 首先&#xff0c;我们要知道的是&#xff0c;图片一般有两种传输方式&#xff1a;base64 和 file对象。 base64 图片 图片的base64编码想必大家都…

微信小程序服务器请求和上传数据,上传图片并展示,提交表单完整实例代码附效果图

微信小程序开发交流qq群 173683895 、 526474645 &#xff1b; 承接微信小程序开发。扫码加微信。 为了方便大家&#xff0c;下面列出微信请求服务器常用的几种方式&#xff0c;并附上代码和注释。 一&#xff1a; GET请求&#xff08;最常用的&#xff09; wx.request(…

LeCun力荐!哈佛博士分享如何用GPT-4搞科研

编&#xff5c;桃子 源&#xff5c;新智元 排版 | 夕小瑶的卖萌屋 进NLP群—>加入NLP交流群(备注nips/emnlp/nlpcc进入对应投稿群) 用GPT-4搞科研未来或许成为每个人的标配&#xff0c;但是究竟如何高效利用LLM工具&#xff0c;还得需要技巧。近日&#xff0c;一位哈佛博士分…

LeCun力荐!哈佛博士分享用GPT-4搞科研,细到每个工作流程

【导读】用GPT-4搞科研未来或许成为每个人的标配&#xff0c;但是究竟如何高效利用LLM工具&#xff0c;还得需要技巧。近日&#xff0c;一位哈佛博士分享了自己的经验&#xff0c;还获得了LeCun的推荐。 GPT-4的横空出世&#xff0c;让许多人对自己的科研担忧重重&#xff0c;…

8月 | O'Reilly好书推荐[每月送书]

OReilly读者俱乐部联合图灵教育8月好书推荐&#xff01; 以下是小编为OReilly粉丝整理的一期OReilly书单&#xff0c;一共7本&#xff0c;包含各个领域&#xff0c;有基于Python的深度学习入门书&#xff0c;还有R数据科学领域传奇人物著作&#xff0c;有SQL经典书重新出版&…

冰河最新电子书上架第一天阅读量超15万,你值得拥有

大家好&#xff0c;我是冰河~~ 最近不是有小伙伴在问我为啥公众号的文章更新频率低了吗&#xff1f;今天就跟大家说一下吧&#xff0c;这不是最近在整理一本原创电子书吗&#xff1f;没错&#xff0c;这次是和阿里云开发者社区合作&#xff0c;在阿里云藏经阁上架了一本冰河的…

亚马逊kindle设置_如何让您的Amazon Echo大声朗读您的Kindle书

亚马逊kindle设置 Ever wish you could read your books while doing other stuff at the same time? Sure, you could listen to Audiobooks with Audible, but your Amazon Echo can also read your Kindle ebooks to you out loud. Here’s how. 曾经希望您可以在同时做其他…

Bookdown搭配GitHubPages发布电子书

文章目录 前言一、前期准备二、发布步骤1. bookdown项目1.1 安装R包1.2 新建project1.3 修改成自己的笔记 2. GitHubPages发布2.1 增加本地_bookdown.yml文件一行参数2.2 部署到GitHub2.3 修改GitHub仓库的一些属性 3. 成功 参考文章 前言 你想发布一本自己的电子书吗&#xf…

今天发现,不能从亚马逊买纸质图书了!!!

打算买一本纸质的书送人&#xff0c;搜了半天发现亚马逊全是电子书&#xff0c;虽然预料之中&#xff0c;但没想到还是来得太突然。其实我自己已经很久没买过纸质书了。 当年买第一本电纸书的时候&#xff0c;花了不到二十块钱&#xff0c;心疼的我要命。后来用习惯了&#xf…

不知道买啥绘本?适合3-6岁儿童的绘本书单,建议父母收藏

作为父母&#xff0c;给孩子选绘本&#xff0c;首要原则是&#xff0c;内容吸引人&#xff0c;让孩子能坐得住。我本人买过很多绘本&#xff0c;当然也有踩过坑&#xff0c;根据我自己买绘本的相关经验&#xff0c;结合我家孩子爱看的绘本&#xff0c;分享适合3-6岁孩子的绘本书…

Kindle在线推书网站 强烈推荐

俗话说得好&#xff1a;腹有诗书气自华 突然间发现自己的kindle已经吃灰好久了 有的时候还会当做泡面盖用用 但后来彻底废弃了 归结其原因还是书籍资源太少&#xff08;懒&#xff09; 因为之前找书实在太痛苦了 即使买了Amazon的Kindle Unlimited会员 依旧有找不到的书 甚是痛…

Datawhale 《南瓜书》

Datawhale 南瓜书 pumpkin-book 原书&#xff1a;机器学习 周志华 贡献者&#xff1a; Datawhale成员 欢迎任何人参与和完善&#xff1a;一个人可以走的很快&#xff0c;但是一群人却可以走的更远。 章节小节 每个chapter表示章节&#xff0c;part* 表示每个小节 pumpkin-boo…

90后在虚拟世界建国风园林,完美融合数字艺术与传统诗词

90后数字艺术家罗比(sheepmaomao)在虚拟世界中建起了一个个国风园林景象&#xff0c;如梦如幻。她对植物细致入微的观察&#xff0c;对数字技术游刃有余的运用和丰富的想象力&#xff0c;在屏幕艺术本身魅力的加持下&#xff0c;造就出令人叹为观止的作品。 罗比的数字植物柔和…

【新知实验室 TRTCIM】实时互动课堂最佳实践

【新知实验室 TRTC&IM】实时互动课堂最佳实践 一、新知实验室-TRTC腾讯云音视频产品体验官计划活动简介 二、产品简介TRTCIM 三、最佳实践3.1 官方快速上手TRTC(快速跑通)3.1.1 注册腾讯云账号3.1.2 使用实时音视频(需先开通)3.1.3 创建应用3.1.4 查看项目(查看密钥和快速上…

智慧旅游管理系统下的旅游业的发展规划

伴随着全球范围经济与文化艺术的迅速发展壮大,高新科学技术也快速的渗入了各个领域,已不再是神秘不可触碰的存在。“智慧地球”、“智慧城市”等定义的持续明确提出,宣布使高新科技融入到大家日常生活的每一个细节当中,在这样的局势下,旅游业也无可非议的要发展变成“智慧旅游”…

7-3 旅游规划

一个变化的最短路径&#xff0c;每条路都有两个参数&#xff0c;长度和收费&#xff0c;要求先求出最短的路&#xff0c;如果都是最短&#xff0c;就求出花费最少的路径。再增加一个数组&#xff0c;然后在下面的优化里面稍微修改一下就可以了&#xff0c;大体还是没变的。 #i…

基于python马蜂窝网的旅游景点推荐系统

设计出基于Python的青岛市旅游数据系统&#xff0c;主要功能包括获取各个旅游景点的数据、分析各个旅游景点的价钱、淡旺季、路线等方面&#xff0c;合理的向使用系统的人推荐适合的旅游景点。为此准备把各省市的热门景点通过数据分析再用数据统计图的方式给用户展示出来比较直…

旅行路线可视化研究与实现(Java+Android+Eclipse实现的旅游APP)

目 录 1 概论 1 1.1 研究现状 1 1.2 系统开发意义 1 1.3 系统开发背景 2 2 开发环境以及相关技术 5 2.1 Eclipse 5 2.2 Adroid 5 2.2.1 基本概念 5 2.2.2 简介 6 2.2.3 系统架构 6 2.2.4 四大组件 7 2.3 Java语言 7 2.4 SQLite 7 2.4.1 简介 7 2.4.2 架构 7 2.4.3 特点 8 2.5 F…

旅游景区管理系统(一 )旅游路线导航(MFC实现)

旅游景区管理系统 1.旅游景区导航 2.搜索最短路径 3.prim铺设电路 4.代码介绍和展示 旅游路线导航 本系列为武汉某大学课设&#xff0c;只是学习之用 功能要求&#xff1a; 算法解释&#xff1a; 使用了改进版的深度优先搜索算法&#xff0c; 改进点如下&#xff1a; 1.通…