您的位置:首页 > 其它

SSM综合项目实战(TTSC) -- day04 图片上传、商品列表

2017-10-18 13:54 447 查看

一、FastDFS介绍

FastDFS介绍详见本博客:http://blog.csdn.net/wingzhezhe/article/details/73161464

二、实现文件服务器

1、安装fastDFS

安装详见本博客:http://blog.csdn.net/wingzhezhe/article/details/73162668

2、测试fastDFS服务是否启动

(1)、确认tracker是否启动成功

[root@itcast-01 ~]# /usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf restart




(2)、确认storage是否启动成功

[root@itcast-01 ~]# /usr/bin/fdfs_storaged /etc/fdfs/storage.conf restart




(3)、查看Nginx线程,确认是否启动成功

[root@itcast-01 ~]# ps -ef | grep nginx




3、测试上传图片

(1)、上传一张图片



(2)、使用fastDFS的命令上传图片

[root@itcast-01 ~]# /usr/bin/fdfs_test /etc/fdfs/client.conf upload timg.jpg




(3)、在浏览器中输入上传成功后返回的地址,查看图片



三、图片服务器的使用

1、使用说明

        我们一般使用java客户端进行上传图片,而使用图片服务器的客户端需要相关的依赖,但是中央仓库没有FastDFS的客户端依赖。

        在企业中有Maven私服,我们可以把FastDFS的java客户端依赖手动添加到Maven私服的第三方库,直接加入坐标使用。

        我们这里没有Maven私服,需要手动添加依赖,安装到本地仓库

2、添加依赖

(1)、在Eclipse中导入工程



注意:该工程在本博客资料中有

(2)、执行maven install命令

3、图片上传测试

(1)、创建jar包的maven工程





(2)、添加刚刚maven install的fastdfs_client的依赖



(3)、编写tracker.conf配置文件





(4)、编写java代码测试类

package cn.itcast.fastdfs.test;

import org.csource.fastdfs.ClientGlobal;
import org.csource.fastdfs.StorageClient;
import org.csource.fastdfs.StorageServer;
import org.csource.fastdfs.TrackerClient;
import org.csource.fastdfs.TrackerServer;

public class FastDFSTest {

public static void main(String[] args) throws Exception {
// 1. 初始化客户端,加载Tracker服务器的信息
// 创建配置文件tracker.conf 内容是 tracker_server=192.168.37.161:22122
System.out.println(System.getProperty("user.dir"));//该方法获取当前项目的绝对路径
// ClientGlobal.init("D:/JavaSoft/Eclipse/workspace-heima64-taotao/fastdfs_test/src/main/resources/tracker.conf");
ClientGlobal.init(System.getProperty("user.dir") + "//src//main/resources/tracker.conf");

// 2. 创建TrackerClient,直接new
TrackerClient trackerClient = new TrackerClient();

// 3. 使用TrackerClient获取TrackerServer
TrackerServer trackerServer = trackerClient.getConnection();

// 4. 声明StorageServer,直接声明null即可
StorageServer storageServer = null;

// 5. 创建StorageClient,需要两个参数,一个参数是TrackerServer,另一个是StorageServer,
// 他是用来上传图片的。
StorageClient storageClient = new StorageClient(trackerServer, storageServer);

// 6. 使用StorageClient进行图片上传,返回数组
// 第一个参数是文件路径,第二个参数是文件后缀,第三个参数给一个null
String[] str = storageClient.upload_file("C:/Users/Administrator/Desktop/timg.jpg", "jpg", null);

// 7. 解析结果集,数组,打印
for (String s : str) {
System.out.println(s);
}
}

}


(5)、运行测试,控制台输出内容



(6)、浏览器访问图片



四、图片上传

1、前端item-add.jsp中上传图片代码分析



2、上传图片实现分析

(1)、在springmvc.xml中加入上传图片的配置

<!-- 配置图片上传解析器 -->
<!-- 注意:必须要添加id,且id的名字是接口的名字首字母小写 -->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!-- 配置上传文件的大小 5M -->
<property name="maxUploadSize" value="500000000" />
</bean>




(2)、进行图片校验

校验图片大小:springmvc.xml配置文件中配置

校验图片格式:将在PicUploadController中编写

校验图片内容:将在PicUploadController中编写

(3)、创建PicUploadResult的pojo

原因:

        返回的数据需要有4个属性,需要json格式的数据

                error:0上传成功,1代表上传失败

                width:图片的宽

                height:图片的高

                url:图片的上传地址

在common工程中创建PicUploadResult.java



package com.taotao.common.pojo;

public class PicUploadResult {

private Integer error;// 0上传成功,1代表上传失败

private String width;// 图片的宽
private String height;// 图片的高
private String url;// 图片的上传地址

public Integer getError() {
return error;
}

public void setError(Integer error) {
this.error = error;
}

public String getWidth() {
return width;
}

public void setWidth(String width) {
this.width = width;
}

public String getHeight() {
return height;
}

public void setHeight(String height) {
this.height = height;
}

public String getUrl() {
return url;
}

public void setUrl(String url) {
this.url = url;
}

}


在web项目中引入common工程



3、准备资源文件



env.properties

#声明图片服务器的访问地址
TAOTAO_IMAGE_URL=http://192.168.37.161


tracker.conf

#配置tracker的服务地址,端口号默认为22122
tracker_server=192.168.37.161:22122


4、在springmvc.xml中读取properties资源文件

<!-- 读取properties资源文件 -->
<context:property-placeholder location="classpath:resources/env.properties" />




5、在taotao-manager-web项目中引入fastdfs_client的坐标



6、编写PicUploadController.java逻辑代码



package com.taotao.manager.controller;

import java.awt.image.BufferedImage;

import javax.imageio.ImageIO;

import org.apache.commons.lang3.StringUtils;
import org.csource.fastdfs.ClientGlobal;
import org.csource.fastdfs.StorageClient;
import org.csource.fastdfs.StorageServer;
import org.csource.fastdfs.TrackerClient;
import org.csource.fastdfs.TrackerServer;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.taotao.common.pojo.PicUploadResult;

/**
* 图片操作的web层
*
* @author Administrator
*
*/
@Controller
@RequestMapping("pic/upload")
public class PicUploadController {

// 使用Jackson的工具类,有三个功能:1、对象转json 2、json转对象 3、直接解析json
private static final ObjectMapper MAPPER = new ObjectMapper();

@Value("${TAOTAO_IMAGE_URL}") // 使用value注解从properties配置文件中读取参数
private String TAOTAO_IMAGE_URL;

// 声明允许上传的图片后缀
private String[] TYPE = { ".
e072
jpg", ".png", ".jpeg", ".gif", ".bmp" };

/**
* 图片上传方法
* @param uploadFile
* @return
* @throws Exception
*
* produces = MediaType.TEXT_HTML_VALUE:将返回值类型设置问text/html;解决火狐浏览器不能处理json对象的问题
*/
@RequestMapping(method = RequestMethod.POST, produces = MediaType.TEXT_HTML_VALUE)
@ResponseBody
public String upload(MultipartFile uploadFile) throws Exception {
// 声明返回的对象
PicUploadResult result = new PicUploadResult();
// 设置默认为上传失败
result.setError(1);

// 声明标识符
boolean flag = false;

// 校验图片格式(校验文件后缀名)
for (String type : TYPE) {
// 判断文件是否是要求的后缀名
if (StringUtils.endsWithIgnoreCase(uploadFile.getOriginalFilename(), type)) {
// 如果是要求的后缀名,结果表示为true
flag = true;
// 跳出循环
break;
}
}

// 判断后缀名校验是否成功
if (!flag) {
// 校验失败,直接返回结果
String json = MAPPER.writeValueAsString(result);
return json;
} else {
// 如果校验成功,重置标识符
flag = false;
}

// 校验图片内容
try {
BufferedImage image = ImageIO.read(uploadFile.getInputStream());
if (image != null) {
// 获取宽和高
result.setHeight("" + image.getHeight());
result.setWidth(String.valueOf(image.getWidth()));
// 图片内容校验成功,修改标识符为true
flag = true;
}
} catch (Exception e) {
// 此处为正在做内容校验的异常,此处异常不做任何处理
}

// 校验成功,执行上传操作
if (flag) {
// 校验成功,进行上传操作
// 使用FastDFS的java客户端代码进行图片上传
// 1.初始化客户端,加载配置文件,获取tracker服务信息
ClientGlobal.init(System.getProperty("user.dir") + "/src/main/resources/resources/tracker.conf");

// 2.创建TrackerClient
TrackerClient trackerClient = new TrackerClient();

// 3.获取TrackerServer
TrackerServer trackerServer = trackerClient.getConnection();

// 4.声明StorageServe为null
StorageServer storageServer = null;

// 5.创建storageClient,用来上传图片
StorageClient storageClient = new StorageClient(trackerServer, storageServer);

// 6.使用storageClient上传图片,接收返回的字符串数组
String suffix = StringUtils.substringAfterLast(uploadFile.getOriginalFilename(), ".");
String[] str = storageClient.upload_file(uploadFile.getBytes(), suffix, null);

// 7.根据返回的字符串数据拼接图片的url
String url = this.TAOTAO_IMAGE_URL + "/" + str[0] + "/" + str[1];

// 8.把拼接好的图片url放入返回对象中
result.setUrl(url);

// 9.设置返回对象为上传成功
result.setError(0);
}

// 将结果返会页面
String json = MAPPER.writeValueAsString(result);
return json;
}
}


7、测试运行效果





五、商品列表查询

1、在common中创建公用的返回结果pojo类



package com.taotao.common.pojo;

import java.io.Serializable;
import java.util.List;

public class TaoResult<T> implements Serializable {

private Long total;
private List<T> rows;

public TaoResult() {
super();
}

public TaoResult(Long total, List<T> rows) {
super();
this.total = total;
this.rows = rows;
}

public Long getTotal() {
return total;
}

public void setTotal(Long total) {
this.total = total;
}

public List<T> getRows() {
return rows;
}

public void setRows(List<T> rows) {
this.rows = rows;
}

}


2、编写ItemController.java中代码

/**
* 分页查询商品信息
* @param page
* @param rows
* @return
*/
@RequestMapping(method = RequestMethod.GET)
@ResponseBody
public TaoResult<Item> queryItemByPage(@RequestParam(value = "page", defaultValue = "1") Integer page,
@RequestParam(value = "row", defaultValue = "1") Integer rows) {
TaoResult<Item> taoResult = this.itemService.queryItemByPage(page, rows);
return taoResult;
}


3、编写Servie层接口和实现类

/**
* 分页查询商品列表
*
* @param page
* @param rows
* @return
*/
public TaoResult<Item> queryItemByPage(Integer page, Integer rows);

/**
* 展示商品列表
*/
public TaoResult<Item> queryItemByPage(Integer page, Integer rows) {
// 设置分页参数
PageHelper.startPage(page, rows);
// 封装查询条件
Item item = new Item();
item.setStatus(1);
// 执行查询操作
List<Item> list = super.queryListByWhere(item);
// 封装返回的对象
PageInfo<Item> pageInfo = new PageInfo<>(list);
TaoResult<Item> taoResult = new TaoResult<Item>(pageInfo.getTotal(), list);
return taoResult;
}


4、测试运行

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐