添加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. CF1540B Tree Array

    先写一下自己想到的部分: 考虑枚举一个根. 计算一个点对出现的概率. 对于我这种期望概率基本不会的人,差点就把这题切了. 自己想到的部分都没有假. 问题在于: 如何计算一个点对出现的概率. 考虑和这两 ...

  2. Codeforces 690A2 - Collective Mindsets (medium)

    Codeforces 题面传送门 & 洛谷题面传送门 一道脑筋急转弯的结论题. 首先我们考虑对于某个特定的金币数 \(m\),有哪些 \(n\) 满足条件.考虑最 naive 的情况,\(m= ...

  3. YAOI Round #1 (Div.2) 题解

    总体来说很有一定区分度的(主要分为 4 题.2 题.1 题几档),ACM 赛制也挺有意思的,征求一下大家对这场比赛的意见吧,可以在这个帖子下回复,我都会看的. 简要题解:( A. 云之彼端,约定的地方 ...

  4. Perl 语言入门6-9

    ---- 第6章 哈希----------- 简介 键值对.键和值都是任意标量,但键总是会被转换成字符串. 键唯一,值可重复. 应用场景:一组数据对应到另一组数据时. 如找出重复/唯一/交叉引用/查表 ...

  5. perl 转置矩阵

    这里提供一个转置矩阵的perl脚本,R语言中的t()函数同样也能实现转置 1 use strict; 2 3 open A,"$ARGV[0]"; 4 5 my %ha; 6 my ...

  6. SQL- case when then else end 用法经验总结

    对case when 的理解总结: 1.then和else后,只能写一条输出语句且输出结果就是新生成列的值;when 后的条件判断可以有多条,且可以多个字段联合判断:end 后的输出也可以有多条,但必 ...

  7. 业务逻辑审批流、审批流、业务、逻辑、面向对象、工作方式【c#】

    ------需求分析:--------1.先按照实际线下流程说这是什么事情,实际要干什么.2.再转换为面向对象-页面的操作流程,演示demo3.再与相关人员沟通是否可行需要什么地方修正.4.最终:线上 ...

  8. LeetCode数组中重复的数字

    LeetCode 数组中重复的数字 题目描述 在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内.数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次. ...

  9. add more

    # -*- coding: utf-8 -*- print('123', 123) print(type('123'), type(123)) # string, integer /ˈintidʒə/ ...

  10. Set、Map、WeakSet 和 WeakMap 的区别

    先总结: Set1.  成员不能重复2. 只有健值,没有健名,有点类似数组.3. 可以遍历,方法有add, delete,hasweakSet 1. 成员都是对象 2. 成员都是弱引用,随时可以消失. ...