前言
有一个奇怪的需求,就是将本地的内容直接提交到远程服务器,并且需要针对文件夹进行处理。所以,这里就直接采用JSch
来实现。在这里,感谢秀发浓密的程序猿
的这篇博客,给了很大启发。
思路
既然是直接读取文件夹,我们就不考虑浏览器不能访问本地文件的问题了。直接就是Java
处理,然后直接读取文件提交服务器。
当然,介于上传过程中是Windows
上传到Linux
,如果只传图片倒还没什么问题,传文件可就造了老罪了。还好我现在只有图片需求。
但也并不能掉以轻心,因为,就算是图片,名字也是中文的。
所以直接用UUID
避免了上传乱码,等上传结束了再mv
到目标文件夹中。
上代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84
| private static final String TMPDIR = "/data/ftp"; public static void sshSftpUpload(String ip, String user, String psw, int port, String localDirFileName, String destDir, String fileName) throws Exception { Channel channel = null, channelShell = null; Session session = null; ChannelSftp sftp = null; String tmpFileName = ""; OutputStream outStream = null; InputStream inStream = null; try { JSch jsch = new JSch(); if (port <= 0) session = jsch.getSession(user, ip); else session = jsch.getSession(user, ip, port); if (session == null) throw new Exception("session is null"); session.setPassword(psw); session.setConfig("StrictHostKeyChecking", "no"); session.connect(30 * 1000);
channel = session.openChannel("sftp"); channel.connect(1000);
sftp = (ChannelSftp) channel; sftp.cd(TMPDIR);
tmpFileName = UUID.randomUUID().toString().replace("-", "").toLowerCase() + "." + fileName.substring(fileName.lastIndexOf('.') + 1); outStream = sftp.put(tmpFileName); inStream = Files.newInputStream(new File(localDirFileName).toPath()); byte[] b = new byte[1024]; int n; while ((n = inStream.read(b)) != -1) outStream.write(b, 0, n); channelShell = session.openChannel("shell"); channelShell.setInputStream(new ByteArrayInputStream( ("cp " + TMPDIR + "/" + tmpFileName + " " + destDir + "/" + fileName + " \n") .getBytes(StandardCharsets.UTF_8))); channelShell.setOutputStream(System.out); channelShell.connect(5 * 1000);
} catch (Exception e) { throw new Exception(e.getMessage()); } finally { if (outStream != null) { outStream.flush(); outStream.close(); } if (inStream != null) inStream.close(); if (sftp != null) { sftp.rm(tmpFileName); sftp.disconnect(); } if (session != null) session.disconnect(); if (channel != null) channel.disconnect(); if (channelShell != null) channelShell.disconnect(); } }
|
虽然finally
很长,但是起码交付没啥问题。
主打一个面向测试用例编程了。