本博客是使用sftp进行连接虚拟机进行图片上传和下载的实例
如果使用ftp进行连接虚拟机可能会出现SSH-2.0-OpenSSH_5.3等错误
这是因为它不支持ftp连接,而使用sftp则不会,网上最流行的用的最多的sftp连接是使用jsch技术
话不多说,直接上代码
<!--文件上传等相关jar包-->
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.2</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.4</version>
</dependency>
<dependency>
<groupId>commons-net</groupId>
<artifactId>commons-net</artifactId>
<version>3.3</version>
</dependency>
<dependency>
<groupId>com.jcraft</groupId>
<artifactId>jsch</artifactId>
<version>0.1.49</version>
</dependency>
<!--jsch所依赖的jar包-->
<dependency>
<groupId>com.jcraft</groupId>
<artifactId>jzlib</artifactId>
<version>1.0.7</version>
</dependency>
这是我在maven中加载的包 如果不是在maven中使用ftp上传 可以直接网上搜索 groupId+artifactId+version
#ftp相关配置
FTP.ADDRESS=192.168.26.137
FTP.PORT=22
FTP.USERNAME=zsh
FTP.PASSWORD=zsh
FTP.BASEPATH=/home/zsh/images
#图片服务器相关配置
IMAGE.BASE.URL=http://192.168.26.138/images
配置相关请根据自己的情况进行修改
package org.aptech.hdax.easybuy.webapi.controller;
import org.aptech.hdax.easybuy.webapi.dao.UserDao;
import org.aptech.hdax.easybuy.webapi.pojo.User;
import org.aptech.hdax.easybuy.webapi.utils.FtpUtils;
import org.aptech.hdax.easybuy.webapi.utils.IdUtils;
import org.aptech.hdax.easybuy.webapi.utils.MySpecification;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletRequest;
import javax.transaction.Transactional;
import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Map;
@RestController
@RequestMapping("/user")
@CrossOrigin("*")
public class UserController {
// ftp地址
@Value("${FTP.ADDRESS}")
private String host;
// 端口
@Value("${FTP.PORT}")
private int port;
// ftp用户名
@Value("${FTP.USERNAME}")
private String userName;
// ftp用户密码
@Value("${FTP.PASSWORD}")
private String passWord;
// 文件在服务器端保存的主目录
@Value("${FTP.BASEPATH}")
private String basePath;
// 访问图片时的基础url
@Value("${IMAGE.BASE.URL}")
private String baseUrl;
@Autowired
private UserDao userDao;
@RequestMapping("/pic/upload")
@ResponseBody
@Transactional
public String pictureUpload(
@RequestParam("file") MultipartFile uploadFile,
@RequestParam("id")String id,
HttpServletRequest request) {
String filePath="";
try {
//1、给上传的图片生成新的文件名
//1.1获取原始文件名
String oldName = uploadFile.getOriginalFilename();
//1.2使用IDUtils工具类生成新的文件名,新文件名 = newName + 文件后缀
String newName = IdUtils.genImageName();
newName = newName + oldName.substring(oldName.lastIndexOf("."));
//2、把前端输入信息,包括图片的url保存到数据库
User user =userDao.getOne(Integer.parseInt(id));
user.setPhoto(newName);
//获取文件的绝对路径
//3、把图片上传到图片服务器
//3.1获取上传的io流
InputStream input = uploadFile.getInputStream();
//3.2调用FtpUtil工具类进行上传
boolean result = FtpUtils.uploadFile(host, port, userName, passWord, basePath, filePath, newName, input);
if(result) {
return "success";
}else {
return "false";
}
} catch (IOException e) {
return "false";
}
}
}
package org.aptech.hdax.easybuy.webapi.utils;
import com.jcraft.jsch.Channel;
import com.jcraft.jsch.ChannelSftp;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.Session;
import org.apache.commons.net.ftp.*;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.SocketException;
import java.util.Properties;
public class FtpUtils {
private static ChannelSftp sftp = null;
/**
* Description: 向FTP服务器上传文件
* @param host FTP服务器ip
* @param port FTP服务器端口
* @param username FTP登录账号
* @param password FTP登录密码
* @param basePath FTP服务器基础目录,/home/ftpuser/images
* @param filePath FTP服务器文件存放路径。例如分日期存放:/2018/05/28。文件的路径为basePath+filePath
* @param filename 上传到FTP服务器上的文件名
* @param input 输入流
* @return 成功返回true,否则返回false
*/
public static boolean uploadFile(String host, int port, String username, String password, String basePath,
String filePath, String filename, InputStream input) {
boolean result = false;
FTPClient ftp = new FTPClient();
File file=null;
try {
JSch jsch = new JSch();
//获取sshSession 账号-ip-端口
Session sshSession = jsch.getSession(username, host, port);
//添加密码
sshSession.setPassword(password);
Properties sshConfig = new Properties();
//严格主机密钥检查
sshConfig.put("StrictHostKeyChecking", "no");
sshSession.setConfig(sshConfig);
//开启sshSession链接
sshSession.connect();
//获取sftp通道
Channel channel = sshSession.openChannel("sftp");
//开启
channel.connect();
sftp = (ChannelSftp) channel;
file=new File(basePath);
//设置为被动模式
ftp.enterLocalPassiveMode();
//设置上传文件的类型为二进制类型
//进入到要上传的目录 然后上传文件
sftp.cd(basePath);
sftp.put(input,filename);
input.close();
result = true;
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
} finally {
if (ftp.isConnected()) {
try {
ftp.disconnect();
} catch (IOException ioe) {
}
}
}
return result;
}
}
这个工具类是防止文件名重复,随机生成一个id
package org.aptech.hdax.easybuy.webapi.utils;
import java.util.Random;
public class IdUtils {
public static String genImageName() {
//取当前时间的长整形值包含毫秒
long millis = System.currentTimeMillis();
//long millis = System.nanoTime();
//加上三位随机数
Random random = new Random();
int end3 = random.nextInt(999);
//如果不足三位前面补0
String str = millis + String.format("%03d", end3);
return str;
}
}
由于是本人第一次使用sftp进行文件上传与下载,会有一些代码冗余或bug,请各位大神不吝啬做出指点.