添加maven

        <!-- https://mvnrepository.com/artifact/commons-net/commons-net -->
<dependency>
<groupId>commons-net</groupId>
<artifactId>commons-net</artifactId>
<version>3.6</version>
</dependency> <dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
</dependency>

UploadUtils.java

import org.apache.commons.lang.RandomStringUtils;

public class UploadUtils {

    /**
* 36个小写字母和数字
*/
public static final char[] N36_CHARS = { '0', '1', '2', '3', '4', '5', '6',
'7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j',
'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w',
'x', 'y', 'z' }; public static String generateFilename(String path, String ext) {
return path + RandomStringUtils.random(8, N36_CHARS) + "." + ext;
} }

ftp工具类

FtpUtils.java

package com.test.cms.ftp;

import org.apache.commons.io.FilenameUtils;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.net.PrintCommandListener;
import org.apache.commons.net.ftp.FTP;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPReply; import java.io.*;
import java.net.SocketException; public class FtpUtils { private static final String IP="FTP的IP地址"; /**
* ftp端口 默认21
*/
private static final Integer PORT=21; /**
* ftp用户名
*/
private static final String USERNAME="k"; /**
* ftp密码
*/
private static final String PASSWORD="k"; /**
* 上传的固定路径,可以为空
*/
private static final String PATH=""; /**
* 编码。默认UTF-8
*/
private static final String ENCODING="UTF-8"; /**
* 文件上传
* @param path 上传的路径
* @param ext 文件扩展名
* @param in
* @return
*/
public static String storeByExt(String path, String ext, InputStream in) {
String filename = UploadUtils.generateFilename(path, ext);
store(filename, in);
return filename;
} /**
* 上传文件到ftp
* @param remote 文件名称
* @param in
* @return
*/
private static int store(String remote, InputStream in) {
try {
FTPClient ftp = getClient();
if (ftp != null) {
String filename = PATH + remote;
String name = FilenameUtils.getName(filename);
String path = FilenameUtils.getFullPath(filename);
//切换到path路径下
if (!ftp.changeWorkingDirectory(path)) {
//path路径不存在。进行创建
String[] ps = StringUtils.split(path, '/');
String p = "/";
ftp.changeWorkingDirectory(p);
for (String s : ps) {
p += s + "/";
if (!ftp.changeWorkingDirectory(p)) {
//判断 s 文件夹是否存在,不存在才会执行这行代码
ftp.makeDirectory(s);
ftp.changeWorkingDirectory(p);
}
}
}
ftp.storeFile(name, in);
ftp.logout();
ftp.disconnect();
}
in.close();
return 0;
} catch (SocketException e) {
e.printStackTrace();
return 3;
} catch (IOException e) {
e.printStackTrace();
return 4;
}
} /**
* 获取ftp连接客户端
* @return
* @throws SocketException
* @throws IOException
*/
private static FTPClient getClient() throws SocketException, IOException {
FTPClient ftp = new FTPClient();
ftp.addProtocolCommandListener(new PrintCommandListener(
new PrintWriter(System.out)));
ftp.setDefaultPort(PORT);
ftp.connect(IP);
int reply = ftp.getReplyCode();
if (!FTPReply.isPositiveCompletion(reply)) {
System.out.println("FTP server refused connection: {}");
ftp.disconnect();
return null;
}
if (!ftp.login(USERNAME, PASSWORD)) {
System.out.println("FTP server refused login: {}, user: {}");
ftp.logout();
ftp.disconnect();
return null;
}
ftp.setControlEncoding(ENCODING);
ftp.setFileType(FTP.BINARY_FILE_TYPE);
ftp.enterLocalPassiveMode();
return ftp;
} }

控制器,调用方法

import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClientBuilder;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile; @Controller
public class TestController { /**
* 上传文件到ftp方法
* @param file
* @return
*/
@RequestMapping(value = "/saveFile")
@ResponseBody
public String saveFile(MultipartFile file){
try {
HttpClientBuilder httpClientBuilder = HttpClientBuilder.create();
CloseableHttpClient client = httpClientBuilder.build();
//获取扩展名
String ext = file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf(".")+1);
//ftp存放的文件夹路径 以“/”开头和结尾,路径不要包含中文,不存在的文件夹会进行创建,储存的文件名随机生成
String uploadPath="/awdfffeee1/202010/";
//上传后的文件路径
String fileUrl = FtpUtils.storeByExt(uploadPath, ext, file.getInputStream());
return fileUrl;
} catch (Exception e) {
e.printStackTrace();
}
return "";
} public static void main(String[] args) { }
}

JAVA上传文件到FTP上的更多相关文章

  1. java 上传文件到 ftp 服务器

    1.  java 上传文件到 ftp 服务器 package com.taotao.common.utils; import java.io.File; import java.io.FileInpu ...

  2. java 上传文件到FTP(centos中的ftp服务)

    ftp服务器系统:centos7 提供ftp的服务:vsftpd pom.xml 依赖 <dependency> <groupId>commons-net</groupI ...

  3. .Net 上传文件到ftp服务器和下载文件

    突然发现又很久没有写博客了,想起哎呦,还是写一篇博客记录一下吧,虽然自己还是那个渣渣猿. 最近在做上传文件的功能,上传到ftp文件服务器有利于管理上传文件. 前面的博客有写到layui如何上传文件,然 ...

  4. 用winscp从本地上传文件到服务器上出现复制文件到远端时错误。

    用winscp从本地上传文件到服务器上出现复制文件到远端时错误. 错误码:4 服务器返回的错误消息:write failed 报错如下图所示: 分析过程: 1.刚开始以为是权限不够,后面上网查了一下是 ...

  5. Git学习笔记——从一台电脑上传文件到Github上

    目标:从一台电脑上传文件到Github上 前提: 1.这里假定已在Github上创建了仓库,建立了仓库 2.已在这台电脑上安装了Git客户端 实验环境: 1.Windows 10 64位,已安装了Gi ...

  6. XShell本地上传文件到Ubuntu上及从Ubuntu下载文件到本地

    使用XShell本地上传文件到Ubuntu上及从Ubuntu下载文件到本地. 1.第一种方法是最常用的 :如果下载了Xshell和Xftp,Ctrl+Alt+F就可以选择文件的互传了!(虚拟机/云服务 ...

  7. Linux上F上传文件到FTP服务器

    Linux上上传跟Windows上上传不一样,在Windows上测试没问题,但是放到Linux服务器上跑,上传的文件中文显示乱码.解决方案: FtpUtil.java红色标记处 package cn. ...

  8. Android上传文件之FTP

    android客户端实现FTP文件(包括图片)上传应该没什么难度.写下来就了为了记录一下,望能帮到新手. 需要用到 commons-net-3.0.1.jar,后面附上jar包. 直接上代码: /** ...

  9. Android 上传文件到 FTP 服务器

    实现背景 近期接触到一个需求,就是将文件从Android系统上传到FTP服务器,虽然之前接触过FTP服务器,了解基本的使用流程,但是将此流程从使用习惯转化为代码实现还是有一定难度的.但是基本的流程还是 ...

随机推荐

  1. Codeforces 1290F - Making Shapes(数位 dp)

    Codeforces 题面传送门 & 洛谷题面传送门 数位 dp 好题. 首先,由于是凸包,一但向量集合确定,凸包的形态肯定就已经确定了.考虑什么样的向量集合能够组成符合条件的凸包,我们假设第 ...

  2. ggplot 局部放大

    需要安装包:ggforce,下面以R自带数据做局部放大演示. require(ggplot2) require(ggforce) require(reshape2) data(CO2) co2< ...

  3. Redis的六种特性 场景

    Redis的六种特性 l Strings l Hashs l Lists l Sets l Sorted Sets l Pub/Sub Redis各特性的应用场景 Strings Strings 数据 ...

  4. CSS3实现字体描边

    CSS3实现字体描边的两种方法 -webkit-text-stroke: 1px #fff;:不建议,向内描边,字体颜色变细,效果不佳: 用box-shadow模拟描边,向外描边,保留字体粗细,赞! ...

  5. 巩固javaweb的第十九天

    巩固内容: 使用 form 元素 使用 form 元素封装要提交的信息 要向服务器提交信息,需要使用 form 元素,所有要提交的信息都应该在 form 内部.在 注册界面中,所有要输入的信息都位于 ...

  6. aboard, abolish

    aboard board做动词有上车/船/飞机的意思,boarding就是正在上.board做名词有板的意思,车厢地板的板. a是个词根,有三种意思:1. 以某种状态或方式,如: ablaze, af ...

  7. 12. Fedora 中文乱码问题

    1. Rhythmbox(音乐播放器乱码) yum install python-mutagen mid3iconv -e GBK *.mp3 2. totem电影播放机播放列表乱码解决1).修改to ...

  8. 【STM8】STM8S介绍(编程环境、烧录、芯片内容)(Vcap需要一个电容接地)

    这篇博客的介绍大纲 [1]我使用的开发板和烧录器 [2]编程环境 [3]烧录软件和界面 [4]芯片内容 [1]我使用的开发板和烧录器 首先,我用的是STM8S003F3P6这款开发板,淘宝上就有了,5 ...

  9. linux之wc命令详解

    Linux系统中wc(Word Count)命令的功能为统计指定文件中的字节数.字数.行数,并将统计结果显示输出. 1.命令格式 wc [options] 文件... 2.命令功能 统计指定文件中的字 ...

  10. How does “void *” differ in C and C++?

    C allows a void* pointer to be assigned to any pointer type without a cast, whereas C++ does not; th ...