精选文章 FastDFS学习笔记(三)Java API调用

FastDFS学习笔记(三)Java API调用

作者:zxf_noimp 时间: 2019-11-05 05:18:42
zxf_noimp 2019-11-05 05:18:42

概览:

1、下载https://github.com/happyfish100/fastdfs-client-java到本地,mvn install 部署到本地仓库,供应用系统引用jar包

2、应用系统引入jar包,并编写工具类,测试代码

 本例完成代码下载

1、下载fastdfs-client-java到本地,

导入本地,执行mvn install 部署到本地仓库

FastDFS学习笔记(三)Java API调用1

2、创建测试应用

2.1、创建springboot应用,引入fastdfs-client-java



    org.csource
    fastdfs-client-java
    1.27-SNAPSHOT

2.2、src/main/resources目录下新增fdfs_client.properties文件

connect_timeout =2
network_timeout =30
charset=UTF-8
# tracker Http端口
http.tracker_http_port=6666
# 暂无作用
http.anti_steal_token=no
# 暂无作用
http.secret_key=FastDFS1234567890
# tracker Server地址信息
tracker_server=192.168.0.89:22122

2.3、编写工具类

package com.zzstxx;

import org.csource.common.MyException;
import org.csource.common.NameValuePair;
import org.csource.fastdfs.*;
import java.io.BufferedOutputStream;
import java.io.IOException;
import java.net.URLDecoder;

/**
 * FastDFS工具类【实现文件上传、下载、删除、查询】
 * @author 
 */
public class FastDFSClient {

	private  TrackerClient trackerClient = null;
    private  TrackerServer trackerServer = null;
    private  StorageServer storageServer = null;
    private  StorageClient1 storageClient = null;

    public FastDFSClient(String conf) throws Exception {
        if (conf.contains("classpath:")) {
            String path = URLDecoder.decode(getClass().getProtectionDomain().getCodeSource().getLocation().toString(),"UTF-8");
            path=path.substring(6);
            conf = conf.replace("classpath:",URLDecoder.decode(path,"UTF-8"));
        }
        ClientGlobal.init(conf);
        trackerClient = new TrackerClient();
        trackerServer = trackerClient.getConnection();
        storageServer = null;
        storageClient = new StorageClient1(trackerServer, storageServer);
    }

    /**
     * 上传文件方法
     * 

Title: uploadFile

*

Description:

* @param fileName 文件全路径 * @param extName 文件扩展名,不包含(.) * @param metas 文件扩展信息 * @return * @throws Exception */ public String uploadFile(String fileName, String extName, NameValuePair[] metas) { String result=null; try { result = storageClient.upload_file1(fileName, extName, metas); } catch (IOException e) { e.printStackTrace(); } catch (MyException e) { e.printStackTrace(); } return result; } /** * 上传文件,传fileName * @param fileName 文件的磁盘路径名称 如:D:/image/aaa.jpg * @return null为失败 */ public String uploadFile(String fileName) { return uploadFile(fileName, null, null); } /** * * @param fileName 文件的磁盘路径名称 如:D:/image/aaa.jpg * @param extName 文件的扩展名 如 txt jpg等 * @return null为失败 */ public String uploadFile(String fileName, String extName) { return uploadFile(fileName, extName, null); } /** * 上传文件方法 *

Title: uploadFile

*

Description:

* @param fileContent 文件的内容,字节数组 * @param extName 文件扩展名 * @param metas 文件扩展信息 * @return * @throws Exception */ public String uploadFile(byte[] fileContent, String extName, NameValuePair[] metas) { String result=null; try { result = storageClient.upload_file1(fileContent, extName, metas); } catch (IOException e) { e.printStackTrace(); } catch (MyException e) { e.printStackTrace(); } return result; } /** * 上传文件 * @param fileContent 文件的字节数组 * @return null为失败 * @throws Exception */ public String uploadFile(byte[] fileContent) throws Exception { return uploadFile(fileContent, null, null); } /** * 上传文件 * @param fileContent 文件的字节数组 * @param extName 文件的扩展名 如 txt jpg png 等 * @return null为失败 */ public String uploadFile(byte[] fileContent, String extName) { return uploadFile(fileContent, extName, null); } /** * 文件下载到磁盘 * @param path 图片路径 * @param output 输出流 中包含要输出到磁盘的路径 * @return -1失败,0成功 */ public int download_file(String path,BufferedOutputStream output) { int result=-1; try { byte[] b = storageClient.download_file1(path); try{ if(b != null){ output.write(b); result=0; } }catch (Exception e){} //用户可能取消了下载 finally { if (output != null){ try { output.close(); } catch (IOException e) { e.printStackTrace(); } } } } catch (Exception e) { e.printStackTrace(); } return result; } /** * 获取文件数组 * @param path 文件的路径 如group1/M00/00/00/wKgRsVjtwpSAXGwkAAAweEAzRjw471.jpg * @return */ public byte[] download_bytes(String path) { byte[] b=null; try { b = storageClient.download_file1(path); } catch (IOException e) { e.printStackTrace(); } catch (MyException e) { e.printStackTrace(); } return b; } /** * 删除文件 * @param group 组名 如:group1 * @param storagePath 不带组名的路径名称 如:M00/00/00/wKgRsVjtwpSAXGwkAAAweEAzRjw471.jpg * @return -1失败,0成功 */ public Integer delete_file(String group ,String storagePath){ int result=-1; try { result = storageClient.delete_file(group, storagePath); } catch (IOException e) { e.printStackTrace(); } catch (MyException e) { e.printStackTrace(); } return result; } /** * * @param storagePath 文件的全部路径 如:group1/M00/00/00/wKgRsVjtwpSAXGwkAAAweEAzRjw471.jpg * @return -1失败,0成功 * @throws IOException * @throws Exception */ public Integer delete_file(String storagePath){ int result=-1; try { result = storageClient.delete_file1(storagePath); } catch (IOException e) { e.printStackTrace(); } catch (MyException e) { e.printStackTrace(); } return result; } /** * 获取远程服务器文件资源信息 * @param groupName 文件组名 如:group1 * @param remoteFileName M00/00/00/wKgRsVjtwpSAXGwkAAAweEAzRjw471.jpg * @return */ public FileInfo getFile(String groupName,String remoteFileName){ try { return storageClient.get_file_info(groupName, remoteFileName); } catch (Exception e) { e.printStackTrace(); } return null; } /** * 获取远程服务器文件资源信息 * @param file_id group1/M00/00/00/wKgRsVjtwpSAXGwkAAAweEAzRjw471.jpg * @return */ public FileInfo getFile1(String file_id){ try { return storageClient.get_file_info1(file_id); } catch (Exception e) { e.printStackTrace(); } return null; } /** * 获取附件参数 * @param groupName 文件组名 如:group1 * @param remoteFileName M00/00/00/wKgRsVjtwpSAXGwkAAAweEAzRjw471.jpg * @return */ public NameValuePair[] getMetadata(String groupName,String remoteFileName){ try { return storageClient.get_metadata(groupName, remoteFileName); } catch (Exception e) { e.printStackTrace(); } return null; } /** * 获取附件参数 * @param path file_id group1/M00/00/00/wKgRsVjtwpSAXGwkAAAweEAzRjw471.jpg * @return */ public NameValuePair[] getMetadataByFileId(String file_id){ try { return storageClient.get_metadata1(file_id); } catch (Exception e) { e.printStackTrace(); } return null; } }

3、编写测试类

package com.zzstxx;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.csource.common.NameValuePair;
import org.csource.fastdfs.FileInfo;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class FastDFSController {

	private String CONF_FILENAME = "fdfs_client.properties";

	/**
	 * 上传文件
	 * 
	 * @param request
	 * @throws Exception
	 */
	@RequestMapping(value = "file/uploadFast", method = RequestMethod.GET)
	public void uploadFast(HttpServletRequest request) throws Exception {
		// 1、把FastDFS提供的jar包添加到工程中
		// 2、初始化全局配置。加载一个配置文件。
		String confUrl = this.getClass().getClassLoader().getResource(this.CONF_FILENAME).getPath();
		FastDFSClient fastDFSClient = new FastDFSClient(confUrl);
		// 上传文件
		String filePath = fastDFSClient.uploadFile("g:\\1.exe");
		System.out.println("返回路径:" + filePath);
	}

	/**
	 * 上传文件(带参数)
	 * 
	 * @param request
	 * @throws Exception
	 */
	@RequestMapping(value = "file/uploadFast1", method = RequestMethod.GET)
	public void uploadFast1(HttpServletRequest request) throws Exception {
		String confUrl = this.getClass().getClassLoader().getResource(this.CONF_FILENAME).getPath();
		FastDFSClient fastDFSClient = new FastDFSClient(confUrl);
		// 组合参数
		NameValuePair nvp[] = new NameValuePair[] { new NameValuePair("fileName", "1.zip"),
				new NameValuePair("fileTtype", "zip") };
		// 上传文件
		String filePath = fastDFSClient.uploadFile("g:\\1.zip", null, nvp);
		System.out.println("返回路径:" + filePath);
	}

	/**
	 * 获取上传附件的参数
	 * 
	 * @param request
	 * @throws Exception
	 */
	@RequestMapping(value = "file/getMetadata", method = RequestMethod.GET)
	public void getMetadata(HttpServletRequest request, HttpServletResponse response) throws Exception {
		String fileId = "group1/M00/00/00/wKgAWV3Bg9OAAEAGAWRtDEpCZww835.zip";
		String confUrl = this.getClass().getClassLoader().getResource(this.CONF_FILENAME).getPath();
		FastDFSClient fastDFSClient = new FastDFSClient(confUrl);
		NameValuePair nvps[] = fastDFSClient.getMetadataByFileId(fileId);
		if (null != nvps && nvps.length > 0) {
			for (NameValuePair nvp : nvps) {
				System.out.println(nvp.getName() + ":" + nvp.getValue());
			}
		}
	}

	/**
	 * 获取上传附件的参数
	 * 
	 * @param request
	 * @throws Exception
	 */
	@RequestMapping(value = "file/getFileInfo", method = RequestMethod.GET)
	public void getFileInfo(HttpServletRequest request, HttpServletResponse response) throws Exception {
		String fileId = "group1/M00/00/00/wKgAWV3Bg9OAAEAGAWRtDEpCZww835.zip";
		String confUrl = this.getClass().getClassLoader().getResource(this.CONF_FILENAME).getPath();
		FastDFSClient fastDFSClient = new FastDFSClient(confUrl);
		FileInfo fileInfo = fastDFSClient.getFile1(fileId);
		System.out.println("文件大小:"+fileInfo.getFileSize());
		System.out.println("文件创建日期:"+fileInfo.getCreateTimestamp());
		System.out.println("附件来源IP:"+fileInfo.getSourceIpAddr());
	}

	/**
	 * 下载附件
	 * 
	 * @param request
	 * @throws Exception
	 */
	@SuppressWarnings("deprecation")
	@RequestMapping(value = "file/downloadFast", method = RequestMethod.GET)
	public void downloadFast(HttpServletRequest request, HttpServletResponse response) throws Exception {
		String fileId = "group1/M00/00/00/wKgAWV3Bg9OAAEAGAWRtDEpCZww835.zip";
		String confUrl = this.getClass().getClassLoader().getResource(this.CONF_FILENAME).getPath();
		FastDFSClient fastDFSClient = new FastDFSClient(confUrl);
		String filePath = request.getRealPath("/") + "aa.zip";
		int downFlag = fastDFSClient.download_file(fileId, new BufferedOutputStream(new FileOutputStream(filePath)));
		this.outPut(response, filePath, null);
		System.out.println("下载结果为:" + (downFlag == 0 ? "下载文件成功" : "下载文件失败"));
	}

	/**
	 * 输出流
	 * 
	 * @param response
	 * @param filepath
	 */
	public void outPut(HttpServletResponse response, String filepath, String name) {
		try {
			File file = new File(filepath);
			if (!file.exists())
				return;
			String filename = file.getName();
			if (StringUtils.isEmpty(name)) {
				name = filename;
			}
			String ext = filename.substring(filename.lastIndexOf(".") + 1).toUpperCase();
			InputStream fis = new BufferedInputStream(new FileInputStream(filepath));
			byte[] buffer = new byte[fis.available()];
			fis.read(buffer);
			fis.close();
			response.reset();
			response.addHeader("Content-Length", "" + file.length());
			response.addHeader("Content-Disposition",
					"attachment; filename=" + new String(name.getBytes("GBK"), "ISO8859-1"));// 解决在弹出文件下载框不能打开文件的问题
			response.setContentLength((int) file.length());
			OutputStream toClient = new BufferedOutputStream(response.getOutputStream());
			if (ext.equals("xls")) {
				response.setContentType("application/msexcel");
			} else {
				response.setContentType("application/octet-stream;charset=GBK");
			}
			toClient.write(buffer);
			toClient.flush();
			toClient.close();
		} catch (IOException ex) {
			ex.printStackTrace();
		}
	}

}

3、Java本地连接需要服务器开启的端口

tracker的端口22122:/etc/fdfs/storage.conf 的tracker_server=192.168.0.89:22122

storage的端口23000:/etc/fdfs/storage.conf 的port=23000

4、踩过的坑

异常处理:

fastdfs 上传大文件  Connection reset by peer: socket write error

解决方法:重启了一下服务器好了

 本例完成代码下载

勿删,copyright占位
分享文章到微博
分享文章到朋友圈

上一篇:三菱PLC通讯 基于官方项目Sample2010的借鉴二次开发---C#连接三菱PLC进行通讯的方法

下一篇:TypeScript 数据类型——枚举 (Enum)

您可能感兴趣

  • vSphere Bitfusion运行TensorFlow深度学习任务

    题图摄于北京奥林匹克公园 本文介绍vSphere 7内置的Bitfusion功能如何在Kubernetes中使用,让应用使用远端GPU资源。 (本文作者系VMware云原生实验室工程师,首发于VMware中国研发中心) 背景介绍 随着 AI 技术的快速发展,越来越多的企业开始将 AI 技术应用到自身业务之中。目前,云端 AI 算力主要由三类 AI 加速器来提供:GPU,FPGA 和 AI A...

  • zookeeper学习笔记之-分布式系统介绍以及zookeeper快速入门

    发展背景 单一应用架构 当网站流量很小时,只需一个应用,将所有功能都部署在一起,以减少部署节点和成本。。 垂直应用架构 当访问量逐渐增大,单一应用增加机器带来的加速度越来越小,将应用拆成互不相干的几个应用,以提升效率。 分布式服务架构 当垂直应用越来越多,应用之间交互不可避免,将核心业务抽取出来,作为独立的服务,逐渐形成稳定的服务中心,使前端应用能更快速的响应多变的市场需求。 什么是分布式系...

  • 你还在从零搭建项目 ?

    关注“Java后端技术全栈” 回复“面试”获取最新资料 回复“加群”邀您进技术交流群 作者 | 无知者云 链接 | https://www.cnblogs.com/davenkin 前言 在我的工作中,我从零开始搭建了不少软件项目,其中包含了基础代码框架和持续集成基础设施等,这些内容在敏捷开发中通常被称为“第0个迭代”要做的事情。但是,当项目运行了一段时间之后再来反观,我总会发现一些不足的地...

  • Spring5春天还是配置地狱

    # Spring笔记 ## 1、概述及IOC理论推导 #### 1.1 Spring简介 Spring : 春天 --->给软件行业带来了春天 2002年,Rod Jahnson首次推出了Spring框架雏形interface21框架。 2004年3月24日,Spring框架以interface21框架为基础,经过重新设计,发布了1.0正式版。 很难想象Rod Johnson的学历 , 他是...

  • 掌门教育微服务体系 Solar | 阿里巴巴 Nacos 企业级落地上篇

    联席作者:吴毅挺 任浩军 张彬彬 廖梦鸽 张金星 胡振建 郑重鸣谢:Nacos - 彦林,Spring Cloud Alibab - 小马哥、洛夜,Nacos 社区 - 张龙(pader)、春少(chuntaojun) 前言 在高速发展的时候,公司规模越来越大,老师人数越来越多,这时候公司不能铺太多人去做运营与服务,必须提高每个人效,这就需要技术驱动。因此掌门教育转变成一家技术驱动型的公司,...

  • JVM(一、JVM和Java的体系结构 二、类加载子系统)

    JVM笔记 引言: 用户->字节码文件->JVM->操作系统->硬件 计算机不识别高级语言 高级语言->汇编语言->机器指令->CPU 书籍:java虚拟机规范(不利于学习,可以查阅),深入理解java虚拟机(推荐)-周志明老师 一、JVM和Java的体系结构 1、Java和JVM Java:跨平台的语言 JVM:跨语言的平台 不同的语言编译成字节码之后只要符合java虚拟机的规范,就能在j...

  • 彻底搞懂 etcd 系列文章(六):etcd 核心 API v3

    0 专辑概述 etcd 是云原生架构中重要的基础组件,由 CNCF 孵化托管。etcd 在微服务和 Kubernates 集群中不仅可以作为服务注册与发现,还可以作为 key-value 存储的中间件。 《彻底搞懂 etcd 系列文章》将会从 etcd 的基本功能实践、API 接口、实现原理、源码分析,以及实现中的踩坑经验等几方面具体展开介绍 etcd。预计会有 20 篇左右的文章,笔者将会...

  • 半吊子架构师,一来就想用Kafka取代RabbitMQ?

    推荐阅读: 这套Github上40K+star学习笔记,可以帮你搞定95%以上的Java面试 毫不夸张的说,这份SpringBoot学习指南能解决你遇到的98%的问题 最全面试题新鲜出炉:70+算法题、近30种大厂面试笔试常考知识点 作为一个有丰富经验的微服务系统架构师,经常有人问我,“应该选择RabbitMQ还是Kafka?” 基于某些原因, 许多开发者会把这两种技术当做等价的来看待。的确...

华为云40多款云服务产品0元试用活动

免费套餐,马上领取!
CSDN

CSDN

中国开发者社区CSDN (Chinese Software Developer Network) 创立于1999年,致力为中国开发者提供知识传播、在线学习、职业发展等全生命周期服务。