Java 通过SFTP上传图片功能
1、需要在pom.xml文件中引用jsch的依赖:
<dependency> <groupId>com.jcraftgroupId> <artifactId>jschartifactId> <version>0.1.54version> dependency>
2、ajax异步提交请求:
var uploadImage = function () { var file = document.getElementById("file").files[0]; var formData = new FormData(); formData.append('file', file); $.ajax({ type: "post", dataType: "json", data: formData, url: "catalog/uploadImage", contentType: false, processData: false, mimeType: "multipart/form-data", success: function (data) { if (data.code > 0) { alert("操作成功"); } else { alert(data.message); } }, error: function () { alert("出错了,请联系管理员!"); } }); }
3、后端接收请求方法:
@ResponseBody @RequestMapping("/uploadImage") public Object uploadImage(@RequestParam("file") MultipartFile file, HttpServletRequest request) throws IOException { HotelImageVo imageVo = new HotelImageVo(); if (file == null) { imageVo.setCode(0); imageVo.setMessage("请先选择图片!"); return JSON.toJSONString(imageVo); } double fileSize = file.getSize(); System.out.println("文件的大小是" + fileSize); //拓展的目录,hotelId不为空则使用hotelId作为目录的一部分 String extendDir = "ranklist/"; String fileName = file.getOriginalFilename();// 文件原名称 // 判断文件类型 String type = fileName.indexOf(".") != -1 ? fileName.substring(fileName.lastIndexOf(".") + 1, fileName.length()) : null; if (type != null) {// 判断文件类型是否为空 if ("JPEG".equals(type.toUpperCase()) || "PNG".equals(type.toUpperCase()) || "JPG".equals(type.toUpperCase())) { // 项目在容器中实际发布运行的根路径 String realPath = request.getSession().getServletContext().getRealPath("/"); String dirPath = "/upload/" + extendDir; // 自定义的文件名称 fileName = UUID.randomUUID().toString() + "." + type; String localPath = realPath + dirPath + fileName; File newFile = new File(localPath); if (!newFile.getParentFile().exists()) { newFile.getParentFile().mkdirs(); } //保存本地文件 file.transferTo(newFile); //上传远程文件 SFTPUtils sftp = new SFTPUtils(); sftp.upload(localPath, extendDir, fileName); //删除本地文件 newFile.delete(); } else { imageVo.setCode(0); imageVo.setMessage("图片格式必须是png、jpg或jpeg!"); return JSON.toJSONString(imageVo); } } else { imageVo.setCode(0); imageVo.setMessage("文件类型为空!"); return JSON.toJSONString(imageVo); } imageVo.setCode(1); String newFilePath = ServerConfig.newUrl + extendDir + fileName; imageVo.setMessage(newFilePath); return JSON.toJSONString(imageVo); }
4、通过SFTP把图片上传服务器使用的工具类:
public class SFTPUtils { private ChannelSftp sftp; private Session session; private String sftpPath; public SFTPUtils() { this.connectServer("服务器IP", 22, "用户名", "密码", "需要保存文件的文件夹路径"); } public SFTPUtils(String ftpHost, int ftpPort, String ftpUserName, String ftpPassword, String sftpPath) { this.connectServer(ftpHost, ftpPort, ftpUserName, ftpPassword, sftpPath); } private void connectServer(String ftpHost, int ftpPort, String ftpUserName, String ftpPassword, String sftpPath) { try { this.sftpPath = sftpPath; // 创建JSch对象 JSch jsch = new JSch(); // 根据用户名,主机ip,端口获取一个Session对象 session = jsch.getSession(ftpUserName, ftpHost, ftpPort); if (ftpPassword != null) { // 设置密码 session.setPassword(ftpPassword); } Properties configTemp = new Properties(); configTemp.put("StrictHostKeyChecking", "no"); // 为Session对象设置properties session.setConfig(configTemp); // 设置timeout时间 session.setTimeout(60000); session.connect(); // 通过Session建立链接 // 打开SFTP通道 sftp = (ChannelSftp) session.openChannel("sftp"); // 建立SFTP通道的连接 sftp.connect(); } catch (JSchException e) { e.printStackTrace(); } } /** * 断开SFTP Channel、Session连接 */ public void closeChannel() { try { if (sftp != null) { sftp.disconnect(); } if (session != null) { session.disconnect(); } } catch (Exception e) { e.printStackTrace(); } } /** * 上传文件 * * @param localFile 本地文件 * @param remotePath 远程文件 * @param fileName 文件名称 */ public void upload(String localFile, String remotePath, String fileName) { try { if (remotePath != null && !"".equals(remotePath)) { remotePath = sftpPath + remotePath; createDir(remotePath); sftp.put(localFile, (remotePath + fileName), ChannelSftp.OVERWRITE); sftp.quit(); } } catch (SftpException e) { e.printStackTrace(); } } /** * 下载文件 * * @param remotePath 远程文件 * @param fileName 文件名称 * @param localFile 本地文件 */ public void download(String remotePath, String fileName, String localFile) { try { remotePath = sftpPath + remotePath; if (remotePath != null && !"".equals(remotePath)) { sftp.cd(remotePath); } sftp.get((remotePath + fileName), localFile); sftp.quit(); } catch (SftpException e) { e.printStackTrace(); } } /** * 删除文件 * * @param remotePath 要删除文件所在目录 */ public void delete(String remotePath) { try { if (remotePath != null && !"".equals(remotePath)) { remotePath = sftpPath + remotePath; sftp.rm(remotePath); } } catch (Exception e) { e.printStackTrace(); } } /** * 创建一个文件目录 */ public void createDir(String createpath) { try { if (isDirExist(createpath)) { this.sftp.cd(createpath); return; } String pathArry[] = createpath.split("/"); StringBuffer filePath = new StringBuffer("/"); for (String path : pathArry) { if (path.equals("")) { continue; } filePath.append(path + "/"); if (isDirExist(filePath.toString())) { sftp.cd(filePath.toString()); } else { // 建立目录 sftp.mkdir(filePath.toString()); // 进入并设置为当前目录 sftp.cd(filePath.toString()); } } this.sftp.cd(createpath); } catch (SftpException e) { throw new SystemException("创建路径错误:" + createpath); } } /** * 判断目录是否存在 */ public boolean isDirExist(String directory) { boolean isDirExistFlag = false; try { SftpATTRS sftpATTRS = sftp.lstat(directory); isDirExistFlag = true; return sftpATTRS.isDir(); } catch (Exception e) { if (e.getMessage().toLowerCase().equals("no such file")) { isDirExistFlag = false; } } return isDirExistFlag; } }