前言
分布式集群的项目, 正常一般的工程是把图片放在web项目的自身服务器的工程中,但在集群环境下,会出现找不到图片的情况。
代码参考: https://github.com/zyjcxc/taotao.git
比如:
解决办法:
linux做磁盘的映射,说能解决,但服务器多了也不好弄,所以可以再搭建一个图片服务器
图片服务器两个服务:
*
http:可以使用nginx做静态资源服务器。也可以使用apache。推荐使用nginx,效率更高。也可以结合我之前的mongo文件服务器,将文件url存到Mongo中。
*
ftp服务:使用linux做服务器,在linux中有个ftp组件vsftpd。
步骤
服务器需求
Linux:CentOS6.4 Nginx:1.8.0 Vsftpd:需要在线安装。
Nginx安装
参考 Nginx安装指南 <https://blog.csdn.net/zyjcxc/article/details/80582182>.
Vsftpd安装
参考 Vsftpd安装指南 <https://blog.csdn.net/zyjcxc/article/details/80582202>.
图片服务器的测试
安装好环境后,可以用ftp客户端(FileZilla)测试是否能上传下载文件。
ftp上传图片后, 用浏览器直接访问图片路径,测试是否有图片显示。
java代码实现上传
使用apache的FTPClient工具访问ftp服务器。需要在pom文件中添加依赖:
<dependency> <groupId>commons-net</groupId> <artifactId>commons-net</artifactId
> <version>${commons-net.version}</version> </dependency> public class
FTPClientTest { @Test public void testFtp() throws Exception { //1、连接ftp服务器
FTPClient ftpClient =new FTPClient(); ftpClient.connect("192.168.1.133", 21);
//2、登录ftp服务器 ftpClient.login("ftpuser", "ftpuser"); //3、读取本地文件 FileInputStream
inputStream =new FileInputStream(new File(
"D:\\Documents\\Pictures\\images\\2010062119283578.jpg")); //4、上传文件 //1)指定上传目录
ftpClient.changeWorkingDirectory("/home/ftpuser/www/images"); //2)指定文件类型
ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);//第一个参数:文件在远程服务器的名称
//第二个参数:文件流 ftpClient.storeFile("hello.jpg", inputStream); //5、退出登录
ftpClient.logout(); } }
后续可以根据需求,将其封装工具类,写service, contorller即可, 截取部分代码
public Map uploadPicture(MultipartFile uploadFile) { Map<String, Object> map =
new HashMap<>(2); try { String oldName = uploadFile.getOriginalFilename();
String newName = IDUtils.genImageName(); newName +=
oldName.substring(oldName.lastIndexOf(".")); String imagePath = new DateTime
().toString("yyyy/MM/dd"); boolean result = FtpUtil.uploadFile(FTP_HOST,
FTP_PORT, FTP_USERNAME, FTP_PASSWORD, FTP_BASE_PATH, imagePath, newName,
uploadFile.getInputStream());if (!result) { map.put("error", 1); map.put(
"message", "文件上传失败"); return map; } map.put("error", 0); map.put("url",
IMAGE_BASE_URL +"/" + imagePath + "/" + newName); } catch (IOException e) {
map.put("error", 1); map.put("message", "文件上传异常"); e.printStackTrace(); return
map; }return map; }
注意
springmvc框架,在配置文件中要加入文件上传解析器
<!-- 定义文件上传解析器 --> <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>
热门工具 换一换