准备

  1. 下载fastdfs-client-java源码

源码地址 密码:s3sw

  1. 修改pom.xml

    第一个plugins是必需要的,是maven用来编译的插件,第二个是maven打源码包的,可以不要。
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.5.1</version>
<configuration>
<encoding>UTF-8</encoding>
<source>${jdk.version}</source>
<target>${jdk.version}</target>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
<version>3.0.1</version>
<executions>
<execution>
<id>attach-sources</id>
<goals>
<goal>jar</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
  1. fastdfs-client-java 打包

    直接项目右键,run as maven install

    install成功后,fastdfs-client-java就成功的被安装到本地仓库了。

编写工具类:

  • fdfs_client.conf文件复制一份放到自己项目的resource下面;修改里面的tracker.server,其它的都不用动:
  • 在项目的pom.xml中添加依赖
<dependency>
<groupId>org.csource</groupId>
<artifactId>fastdfs-client-java</artifactId>
<version>1.27-SNAPSHOT</version>
</dependency>
  • 首先来实现文件上传,fastdfs-client-java的上传是通过传入一个byte[ ]来完成的,简单看一下源码:
public String[] upload_file(byte[] file_buff, String file_ext_name,
NameValuePair[] meta_list) throws IOException, MyException{
final String group_name = null;
return this.upload_file(group_name, file_buff, 0, file_buff.length, file_ext_name, meta_list);
}

文件属性

package com.wuwii.utils;

import java.io.Serializable;
import java.util.Arrays; /**
* @ClassName FastDFSFile
* @Description FastDFS上传文件业务对象
* @author zhangkai
* @date 2017年7月18日
*/
public class FastDFSFile implements Serializable{ private static final long serialVersionUID = 2637755431406080379L;
/**
* 文件二进制
*/
private byte[] content;
/**
* 文件名称
*/
private String name;
/**
* 文件长度
*/
private Long size; public FastDFSFile(){ }
public FastDFSFile(byte[] content, String name, Long size){
this.content = content;
this.name = name;
this.size = size;
} public byte[] getContent() {
return content;
}
public void setContent(byte[] content) {
this.content = content;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Long getSize() {
return size;
}
public void setSize(Long size) {
this.size = size;
}
public static long getSerialversionuid() {
return serialVersionUID;
}
}

编写FastDFS工具类

package com.wuwii.utils;

import java.io.Serializable;

import org.apache.commons.io.FilenameUtils;
import org.csource.common.NameValuePair;
import org.csource.fastdfs.ClientGlobal;
import org.csource.fastdfs.StorageClient1;
import org.csource.fastdfs.TrackerClient;
import org.csource.fastdfs.TrackerServer;
import org.jetbrains.annotations.NotNull;
import org.springframework.core.io.ClassPathResource;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity; /**
* @ClassName FastDFSUtils
* @Description FastDFS工具类
* @author zhangkai
* @date 2017年7月18日
*/
public class FastDFSUtils implements Serializable{
/**
*
*/
private static final long serialVersionUID = -4462272673174266738L;
private static TrackerClient trackerClient;
private static TrackerServer trackerServer;
private static StorageClient1 storageClient1; static {
try {
//clientGloble读配置文件
ClassPathResource resource = new ClassPathResource("fdfs_client.conf");
ClientGlobal.init(resource.getClassLoader().getResource("fdfs_client.conf").getPath());
//trackerclient
trackerClient = new TrackerClient();
trackerServer = trackerClient.getConnection();
//storageclient
storageClient1 = new StorageClient1(trackerServer,null);
} catch (Exception e) {
e.printStackTrace();
}
} /**
* fastDFS文件上传
* @param file 上传的文件 FastDFSFile
* @return String 返回文件的绝对路径
*/
public static String uploadFile(FastDFSFile file){
String path = null;
try {
//文件扩展名
String ext = FilenameUtils.getExtension(file.getName());
//mata list是表文件的描述
NameValuePair[] mata_list = new NameValuePair[3];
mata_list[0] = new NameValuePair("fileName",file.getName());
mata_list[1] = new NameValuePair("fileExt",ext);
mata_list[2] = new NameValuePair("fileSize",String.valueOf(file.getSize()));
path = storageClient1.upload_file1(file.getContent(), ext, mata_list);
} catch (Exception e) {
e.printStackTrace();
}
return path;
} /**
* fastDFS文件下载
* @param groupName 组名
* @param remoteFileName 文件名
* @param specFileName 真实文件名
* @return ResponseEntity<byte[]>
*/
@org.jetbrains.annotations.NotNull
public static ResponseEntity<byte[]> downloadFile(String groupName, String remoteFileName, String specFileName){
byte[] content = null;
HttpHeaders headers = new HttpHeaders();
try {
content = storageClient1.download_file(groupName, remoteFileName);
headers.setContentDispositionFormData("attachment", new String(specFileName.getBytes("UTF-8"),"iso-8859-1"));
headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
} catch (Exception e) {
e.printStackTrace();
}
return new ResponseEntity<byte[]>(content, headers, HttpStatus.CREATED);
} /**
* 根据fastDFS返回的path得到文件的组名
* @param path fastDFS返回的path
* @return
*/
public static String getGroupFormFilePath(String path){
return path.split("/")[0];
} /**
* 根据fastDFS返回的path得到文件名
* @param path fastDFS返回的path
* @return
*/
@NotNull
public static String getFileNameFormFilePath(String path) {
return path.substring(path.indexOf("/")+1);
}
}

测试Controller

package com.wuwii.controller;

import java.io.IOException;

import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.multipart.MultipartFile; import com.wuwii.utils.FastDFSFile;
import com.wuwii.utils.FastDFSUtils;
import com.wuwii.utils.PropertyUtil; /**
* FastFDS控制器
* @author zhangkai
*
*/
@Controller
@RequestMapping(value = "/fastdfs")
public class FastFDSController {
@RequestMapping(value = "/upload", method = RequestMethod.POST)
public String upload (MultipartFile file){
try {
FastDFSFile fastDFSFile = new FastDFSFile(file.getBytes(), file.getOriginalFilename(), file.getSize());
String path = FastDFSUtils.uploadFile(fastDFSFile);
return "redirect:"+ PropertyUtil.get("fastFDS_server") + path;
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
} @RequestMapping(value = "/download")
public ResponseEntity<byte[]> download (String path, String specFileName){
String filename = FastDFSUtils.getFileNameFormFilePath(path);
String group = FastDFSUtils.getGroupFormFilePath(path);
return FastDFSUtils.downloadFile(group, filename, specFileName);
}
}

最后附上读取配置文件的工具类PropertyUtil

package com.wuwii.utils;

import java.io.InputStream;
import java.util.Properties; /**
* @ClassName PropertyUtil
* @Description 读取配置文件的内容(key,value)
* @author zhangkai
* @date 2017年7月18日
*/
public class PropertyUtil {
public static final Properties PROP = new Properties(); /**
* @Method: get
* @Description: 读取配置文件的内容(key,value)
* @param key
* @return String
* @throws
*/
public static String get(String key) {
if (PROP.isEmpty()) {
try {
InputStream in = PropertyUtil.class.getResourceAsStream("/config.properties");
PROP.load(in);
in.close();
} catch (Exception e) {}
}
return PROP.getProperty(key);
}
}

测试

上传!

下载

下载就很简单了,因为直接获得到二进制流了,返回给客户端即可。

下载需要主要的是,要注意从FastDFS返回的文件名是这种随机码,因此我们需要在上传的时候将文件本身的名字存到数据库,再到下载的时候对文件头重新设置名字即可。

fastDFS与java整合文件上传下载的更多相关文章

  1. CentOS下安装配置NFS并通过Java进行文件上传下载

    1:安装NFS (1)安装 yum install nfs-utils rpcbind (2)启动rpcbind服务 systemctl restart rpcbind.service 查看服务状态 ...

  2. java实现文件上传下载

    喜欢的朋友可以关注下,粉丝也缺. 今天发现已经有很久没有给大家分享一篇技术文章了,于是想了一下给大家分享一篇java实现文件上传下载功能的文章,不喜欢的希望大家勿喷. 想必大家都知道文件的上传前端页面 ...

  3. java web 文件上传下载

    文件上传下载案例: 首先是此案例工程的目录结构:

  4. java+大文件上传下载

    文件上传下载,与传统的方式不同,这里能够上传和下载10G以上的文件.而且支持断点续传. 通常情况下,我们在网站上面下载的时候都是单个文件下载,但是在实际的业务场景中,我们经常会遇到客户需要批量下载的场 ...

  5. FasfDFS整合Java实现文件上传下载

    文章目录     一 : 添加配置文件     二 : 加载配置文件         1. 测试加载配置文件         2. 输出配置文件     三:功能实现         1.初始化连接信 ...

  6. FasfDFS整合Java实现文件上传下载功能实例详解

    https://www.jb51.net/article/120675.htm 在上篇文章给大家介绍了FastDFS安装和配置整合Nginx-1.13.3的方法,大家可以点击查看下. 今天使用Java ...

  7. Java web文件上传下载

    [版权申明:本文系作者原创,转载请注明出处] 文章出处:http://blog.csdn.net/sdksdk0/article/details/52048666 作者:朱培 ID:sdksdk0 邮 ...

  8. java 实现文件上传下载以及查看

    项目的目录结构 代码  IOUtils.java package cn.edu.zyt.util; import java.io.IOException; import java.io.InputSt ...

  9. Jsch - java SFTP 文件上传下载

    使用Jsch上传.下载文件,核心步骤是:获取channel,然后使用get/put方法下载.上传文件 核心代码句: session = jSch.getSession(ftpUserName, ftp ...

随机推荐

  1. 详解EBS接口开发之采购申请导入

    更多内容可以参考我的博客  详解EBS接口开发之采购订单导入 http://blog.csdn.net/cai_xingyun/article/details/17114697 /*+++++++ ...

  2. [C++学习历程]基础部分 C++中的函数中的值参数、地址参数、引用参数实际例子

    本文地址:http://blog.csdn.net/sushengmiyan/article/details/20406269 作者:sushengmiyan // sushengmiyanTest. ...

  3. 软考之路--从生活着手,看PV如何操作

    PV操作,是软考当中一个很重要的考点,一听到这个名词,顿时赶脚高大上有么有,在软考的历年试题中,也不乏PV操作的身影,老师也对PV操作进行了一次讲课,那时年少,听得稀里糊涂,也不是很理解,在小编的理解 ...

  4. Torch的安装和学习

    Long long ago, 就已经安装好Torch,这里再记录一下.Torch是Facebook开发的用于AI的科学计算框架,可广泛运用于机器学习的很多算法.相比Caffe,其接口运用更加方便,使用 ...

  5. TCP的流量控制与拥塞控制小结

    概述 为了提高信道的利用率TCP协议不使用停止等待协议,而是使用连续ARQ协议,意思就是可以连续发出若干个分组然后等待确认,而不是发送一个分组就停止并等待该分组的确认.其中TCP的流量控制与拥塞控制是 ...

  6. μC/OS-II与RT-Thread对比——任务调度

           在任务调度器的实现上,μC/OS-II和RT-Thread都采用了位图调度(bitmap scheduling),任务优先级的值越小则代表具有越高的优先级,主要区别在于实现形式,是采用多 ...

  7. mixer: 一个用go实现的mysql proxy

    介绍 mixer是一个用go实现的mysql proxy,支持基本的mysql代理功能. mysql的中间件很多,对于市面上面现有的功能强大的proxy,我主要考察了如下几个: mysql-proxy ...

  8. lua c函数注册器

    lua与c的交互 关于lua和c的交互,主要有两个方面,一是lua调用c的函数,而另一个则是c调用lua函数.而这些都是通过lua stack来进行的. c调用lua 在c里面使用lua,主要是通过l ...

  9. 简单的C语言猜数字小游戏

    猜数字小游戏可谓是C语言最为基础的一个知识点了,我们可以在此基础上进行延伸,实现随机数的猜测,然后是加入再来一局的模式,等等.这里是抛砖引玉,希望你能做出你的经典之作. #include <st ...

  10. Cannot start service MSSQL$MICROSOFT##WID on computer

    在做ADFS部署过程中配置ADFS服务时遇到如下问题 检查系统日志错误日志如下,很明显"NT SERVICE\MSSQL$MICROSOFT##WID"这个账户不在log on a ...