您的位置:首页 > 编程语言 > Java开发

Java代码实现上传文件到Ftp服务器

2018-03-14 22:28 981 查看
           近期项目中,需要在后台上传批量产品操作视频在公众号菜单中展示供用户在线学习。最初的打算是用阿里OSS对象存储,但是出于流量成本考虑没有采用。采取的方案是把视频上传到项目服务器上,第一种方案是用流上传,但是遇到各种坑,方法行不通。老大给的方案是用ftp方式进行上传,之前用过ftp客户端直接把本地文件拖到服务器上,思路就是用代码模拟这个拖的操作。废话不多说,直接上代码:
1 添加maven依赖
<!--ftp相关-->
<dependency>
<groupId>commons-net</groupId>
<artifactId>commons-net</artifactId>
<version>3.3</version>
</dependency>
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-ftp</artifactId>
<version>2.13.2</version>
</dependency>2 根据网上资料建议  配置FTPClient相关信息
@Log4j
public class FtpUtils {
private static int port=21;//ftp服务器端口

public static FTPClient getClient(){
FTPClient ftpClient = new FTPClient();
//ftp服务器地址
String url="url";
//ftp服务器登陆用户名
String name="userName";
//ftp服务器登陆密码
String password="mima";
//ftp服务器目标文件位置
String MENU="/xx";
try {
log.info("开始连接ftp服务器");
long start = System.currentTimeMillis();
ftpClient.connect(url,port);
ftpClient.login(name, password);
boolean flag = FTPReply.isPositiveCompletion(ftpClient.getReplyCode());
if (!flag){
throw  new com.bingkun.weixin.common.exception.ApplicationException("ftp服务器连接失败!");
}
long end = System.currentTimeMillis();
log.info("连接ftp服务器成功,耗时"+(end-start)+"毫秒");
ftpClient.setCharset(Charset.forName("UTF-8"));
ftpClient.setControlEncoding("UTF-8");
//ftpClient.changeToParentDirectory();//切换到根目录
ftpClient.changeWorkingDirectory(MENU );
//设置文件类型
ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);
} catch (IOException e) {
e.printStackTrace();
}
return ftpClient;
}
3 Controller及具体上传逻辑



@Component
@Log4j
public class FtpServiceImpl implements FtpService {
private String dateFormat="yyyyMMdd";
//http前缀
private String prefix="http://";
//ftp服务器地址
String url= "";
//ftp服务器目标文件位置
String menu="";
@Override
public Map<String, Object> upload(MultipartFile file) {
Transaction cat = Cat.newTransaction(Constants.FTP_UPLOAD, "uploadFile");
try{
Map<String, Object> map = catFtpUpload(file);
cat.setStatus(Transaction.SUCCESS);
return map;
} catch (Exception e){
Cat.logError(e);
cat.setStatus(e);
}finally {
cat.complete();
}
return null;
}
public Map<String, Object> catFtpUpload(MultipartFile file) {
Map map=new HashMap();
FTPClient client = FtpUtils.getClient();
String originalFilename = file.getOriginalFilename();
String randomString=UUID.randomUUID().toString().replaceAll("-","");
//文件后缀
String suffix=originalFilename.substring(originalFilename.lastIndexOf("."));
String fileName=(DateUtils.dateFormat(new Date(), dateFormat))+randomString+suffix;
String finalUrl=prefix+url+menu+"/"+fileName;
try {
long start = System.currentTimeMillis();
log.info(String.format("开始上传文件:%s",originalFilename));
InputStream inputStream = file.getInputStream();
boolean flag = client.storeFile(fileName, inputStream);
if (flag){
long end = System.currentTimeMillis();
log.info(String.format("文件:%s上传成功,耗时:%d毫秒",originalFilename,(end-start)));
map.put("url",finalUrl);
}
inputStream.close();
//            client.logout();//退出登录 退出就执行不成功了 bug
} catch (IOException e) {
e.printStackTrace();
}finally {
if (client.isConnected()){
try {
client.disconnect();
} catch (IOException e) {
log.error(String.format("ftp关闭连接失败:%s",e));
}
}
}
return map;
}
更新如上,添加日志及Cat监控,关闭连接操作。
希望能给用到的小伙伴一个借鉴,少踩坑。
霍金去世了,有点难过!
                                -2018/03/14 于上海
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java ftp