简单快捷,亲测有效
这种方法可以有效避免这个报错:Could not parse response code.Server Reply: SSH-2.0-OpenSSH_5.3
先附截图:
本地文件:
上传后的远程文件:
**
**
前端:采用了批量上传的模式
<form action="http://localhost:8787/fms-base-service/dc/moreFileUpload" method="post" name="f_upload" enctype="multipart/form-data">
<input type="text" name="username" /><br>
<input type="file" name="filename" multiple="multiple" /><br>
<input type="submit" value="上传" />
</form>
后台controller:
@RequestMapping("/dc/moreFileUpload")
public ResultVo testUpload(MultipartHttpServletRequest request) throws Exception {
Iterator<String> fileNames = request.getFileNames();
while (fileNames.hasNext()) {
//把fileNames集合中的值打出来
String fileName=fileNames.next();
List<MultipartFile> fileList=request.getFiles(fileName);
if (fileList.size()>0) {
//遍历文件列表
Iterator<MultipartFile> fileIte=fileList.iterator();
while (fileIte.hasNext()) {
//获得每一个文件
MultipartFile file =fileIte.next();
/*上传*/
String filePath = ""; //映射的地址
InputStream input = file.getInputStream();
String oldName = file.getOriginalFilename();//获取file图片名称
String newName = IdUtils.genImageName();
boolean result = FtpUtil.uploadFile("xxxxx", 22, "root", "xx", "/root/file", filePath, newName, input);
}
}
}
return ResultMsgHandler.generateSucessMsg(localeMessageSourceService.getMessage(BaseConstants.SAVE_SUCCESS), request);
}
工具类:
package com.sinotrans.fms.nvocc.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 FtpU {
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;
}
}
生成UUID的工具类:
public class IdUtils {
public static String genImageName() {
String uuid = UUID.randomUUID().toString().trim();
return uuid;
}
public static void main(String[] args) {
String s = genImageName();
System.out.println(s);
}
}
关于文件上传后临时目录清空的问题详见:https://www.cnblogs.com/756623607-zhang/p/9721761.html