今天给你们分享的是分布式系统图片上传方案,若有不足,敬请指正。java
咱们都知道在咱们开发中,常常要用到图片上传功能。那么在传统的上传方式中,咱们是在项目的根目录下建立upload目录,将图片上传到服务器中。那么在分布式环境下,是有多个Tomcat存在的,当把图片直接上传到Tomcat服务器时,容易出现图片丢失的问题。node
传统方式 |
---|
![]() |
那么怎么解决这个问题呢?咱们会不会有这样的想法:直接将图片上传到一个指定的目录,访问、下载图片都访问这个目录就行了。以下图: |
图示 |
---|
![]() |
因为项目最终是要部署到Linux环境,因此直接将图片上传到Linux服务器linux
这就须要使用vsftpd组件,实现文件传输web
ftp(File Transfer Protocol)文件传输协议。(实现不一样操做系统之间文件的传输)数据库
vsftpd是一个基于ftp协议的文件传输服务器软件apache
使用方法vim
图示 |
---|
![]() |
被动模式 |
---|
![]() |
主动模式 |
---|
![]() |
图示 |
---|
![]() |
再次访问浏览器,发现能够正常链接了浏览器
前提:在maven中添加ftp服务的依赖安全
<dependency> <groupId>commons-net</groupId> <artifactId>commons-net</artifactId> </dependency>
package com.xkt.base.test; import java.io.File; import java.io.FileInputStream; import org.apache.commons.net.ftp.FTP; import org.apache.commons.net.ftp.FTPClient; /** * 测试文件上传 * * @author lzx * */ public class TestFtp { public static void main(String[] args) { try { // 1.建立ftp客户端 FTPClient client = new FTPClient(); // 2.链接服务器 client.connect("192.168.109.3", 21); // 3.登陆,认证身份 boolean flag = client.login("ftpuser", "ftpuser"); if (flag) { /* * 4.指定图片上传的目录,默认路径在ftpuser的家目录下 * * 确保ftpuser用户有这个目录下的写权限 * * 在Linux上用ftpuser这个用户,去建立这个目录 * */ client.changeWorkingDirectory("/home/ftpuser/ego/images"); // 5.指定上传为被动上传,由于:不少的客户端禁止主动模式 client.enterLocalPassiveMode(); // 6.指定文件上传的方式为二进制,即便用字节流 client.setFileType(FTP.BINARY_FILE_TYPE); // 7.上传 File pic = new File("F:/图片/3.jpg"); boolean result = client.storeFile(System.currentTimeMillis() + ".jpg", new FileInputStream(pic)); if (result) { System.out.println("上传成功"); } else { System.out.println("上传失败"); } } client.disconnect(); } catch (Exception e) { e.printStackTrace(); } } }
那么问题来了,在访问浏览器过程当中你们是否发现图片加载时间稍微有点长呢?并且这还只是一张图片,那么在咱们实际开发中遇到的相似某宝,某猫,某东这种大型网站每一个页面须要加载的图片更多,并且对并发量的要求也很高又该怎么解决呢?这就须要用到Tengine了,关于它的介绍咱们将在后面的文章中给出。服务器
版权说明:欢迎以任何方式进行转载,但请在转载后注明出处!