Java 通过SFTP上传图片功能
1、需要在pom.xml文件中引用jsch的依赖:
<dependency>
<groupId>com.jcraft</groupId>
<artifactId>jsch</artifactId>
<version>0.1.54</version>
</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;
}
}
Java 通过SFTP上传图片功能的更多相关文章
- JAVA 上传图片功能
前后端实现上传图片功能(JAVA代码) 1.前端大概 请求头必须为AJAX请求头: 'X-Requested-With': 'XMLHttpRequest' 一般是指网页中存在的Content-Typ ...
- 配置Django-TinyMCE组件支持上传图片功能
Django自带的Admin后台,好用,TinyMCE作为富文本编辑器,也蛮好用的,这两者结合起来在做博客的时候很方便(当然博客可能更适合用Markdown来写),但是Django-TinyMCE这个 ...
- MVC ueditor的使用(实现上传图片功能)
之前使用ckeditor不能实现上传图片功能,只要是我不知道怎么使用啦o( ̄ε ̄*),然后就换了ueditor~~,可以实现上传图片功能啦~\(≧▽≦)/~~ 下面是我的步骤:去官网下载最新版uedi ...
- aspx页面中用Input 标签实现上传图片功能
实现上传图片功能需单独的建立一个aspx页面, 其中前台页面需要注意两点: a)实现上传功能的input的type="file" b)设置请求报文头为 enctype=" ...
- [转]JAVA实现SFTP实例
http://www.cnblogs.com/chen1987lei/archive/2010/11/26/1888384.html 最近写的一个JAVA实现SFTP的实例: /** Created ...
- Java使用SFTP和FTP两种连接方式实现对服务器的上传下载 【我改】
[]如何区分是需要使用SFTP还是FTP? []我觉得: 1.看是否已知私钥. SFTP 和 FTP 最主要的区别就是 SFTP 有私钥,也就是在创建连接对象时,SFTP 除了用户名和密码外还需要知道 ...
- JAVA实现SFTP实例
最近写的一个JAVA实现SFTP的实例: /* * Created on 2009-9-14 * Copyright 2009 by www.xfok.net. All Rights Reserved ...
- Java 基本数据类型 sizeof 功能
Java 基本数据类型 sizeof 功能 来源 https://blog.csdn.net/ithomer/article/details/7310008 Java基本数据类型int 32b ...
- WCF实现上传图片功能
初次学习实现WCF winform程序的通信,主要功能是实现图片的传输. 下面是实现步骤: 第一步: 首先建立一个类库项目TransferPicLib,导入wcf需要的引用System.Service ...
随机推荐
- SuRF : Practical Range Query Filtering with Fast Succinct Tries
1. Introduction 在数据库管理系统中查找某些关键字会导致很大的磁盘I/O开销,针对这一问题,通常会使用一个内存开销小并且常驻内存的过滤器来检测该关键字是否存.比如现在常用的bloom过滤 ...
- PHP小程序后端支付代码亲测可用
小程序后端支付代码亲测可用 <?php namespace Home\Controller; use Think\Controller; class WechatpayController ex ...
- SOTA激活函数学习
除了之前较为流行的RELU激活函数,最近又新出了几个效果较好的激活函数 一.BERT激活函数 - GELU(gaussian error linear units)高斯误差线性单元 数学公式如下: X ...
- Kubernetes是什么东西?
Kubernetes一词来源于希腊语,翻译来的意思就是舵手或者船长的意思,而它的logo也是很符合这个词的 至于k8s则是通过将ubernetes这8个字母替换为8而导出的缩写 Kubernetes是 ...
- logger.info占位符的使用
{}表示占位符,使用方法如下: package org.pine.controller; import javax.annotation.Resource; import org.pine.servi ...
- 分析mybatis中 #{} 和${}的区别
分析方法: 在 GenericTokenParser这个类的parse方法的这一行下个断点调试一下就明白了 builder.append(handler.handleToken(content)); ...
- bugku insertsql
题目链接 0X00题目给出的PHP代码 error_reporting(0); function getIp(){ $ip = ''; if(isset($_SERVER['HTTP_X_FORWAR ...
- 更改用户host留下的坑
前言: 我们在创建数据库用户的时候都会指定host,即一个完整的用户可描述为 'username'@'host' .创建用户时不显式指定host则默认为%,%代表所有ip段都可以使用这个用户,我们也 ...
- Asp.Net构架(Http请求处理流程)
一:引言 我查阅过不少Asp.Net的书籍,发现大多数作者都是站在一个比较高的层次上讲解Asp.Net.他们耐心.细致地告诉你如何一步步拖放控件.设置控件属性.编写CodeBehind代码,以实现某个 ...
- Linux shell for循环结构
Linux Shell for循环结构 循环结构 1:循环开始条件 2:循环操作 3:循环终止的条件 shell语言 for,while ...