package com.gcx.fileapi.untils;
import java.io.Serializable;
/**
* FastDFS文件基本参数接口
*
* 2017-4-19 下午
*
* @author ShiLei
*/
public interface FileManagerConfig extends Serializable {
public static final String FILE_DEFAULT_AUTHOR = "GCX";
public static final String PROTOCOL = "http://";
public static final String SEPARATOR = "/";
// public static final String STORAGE_NGNIX_ADDR = "file.gcx365.com:8090";
public static final String STORAGE_NGNIX_ADDR = "";
public static final String CLIENT_CONFIG_FILE = "fastDFS.conf";
}
package com.gcx.fileapi.untils;
import java.io.File;
import java.util.List;
import org.csource.common.NameValuePair;
import org.csource.fastdfs.ClientGlobal;
import org.csource.fastdfs.FileInfo;
import org.csource.fastdfs.StorageClient1;
import org.csource.fastdfs.StorageServer;
import org.csource.fastdfs.TrackerClient;
import org.csource.fastdfs.TrackerServer;
import com.alibaba.fastjson.JSONObject;
import com.gcx.fileapi.model.FastDFSFile;
/**
* 文件上传/下载 工具类
*
* 2017-4-19 下午
*
* @author ShiLei
*/
public class FastDFSUntils implements FileManagerConfig {
private static final long serialVersionUID = 1L;
private static TrackerClient trackerClient;
private static TrackerServer trackerServer;
private static StorageServer storageServer;
private static StorageClient1 storageClient;
static {
try {
String conf = new File(FastDFSUntils.class.getResource("/").getFile()).getCanonicalPath()+ File.separator + CLIENT_CONFIG_FILE;
ClientGlobal.init(conf);
trackerClient = new TrackerClient();
trackerServer = trackerClient.getConnection();
storageClient = new StorageClient1(trackerServer, storageServer);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 方法概要:文件上传
*
* 创建时间: 2017-4-19 下午
*
* @param FastDFSFile file, NameValuePair[] valuePairs
*
* @return filePath 文件绝对路径
*
* @author ShiLei
*/
public static String uploadFile(FastDFSFile file, NameValuePair[] valuePairs) {
String filePath = "";
try {
synchronized(storageClient){
filePath = storageClient.upload_file1(file.getGroupName(),file.getContent(), file.getFileExt(), valuePairs);
}
} catch (Exception e) {
e.printStackTrace();
}
//fileAbsolutePath = "http://file.gcx365.com:8090/group1/M00/00/00/wKhktVj3E22AC7JuAAAAEXt8jSg129.txt";
//String fileAbsolutePath = PROTOCOL + STORAGE_NGNIX_ADDR + SEPARATOR + filePath;
//return fileAbsolutePath;
return filePath;
}
/**
* 方法概要: 根据本地指定全路径上传
*
* 创建时间: 2017-4-19 下午
*
* @param String groupName,String fileFullUrl
*
* @return filePath
*
* @author ShiLei
*/
public static String uploadFile(String groupName,String fileFullUrl) throws Exception {
String filePath = "";
try {
synchronized(storageClient){
filePath = storageClient.upload_file1(groupName,fileFullUrl, null, null);
}
} catch (Exception e) {
e.printStackTrace();
}
return filePath;
}
/**
* 方法概要: 文件下载
*
* 创建时间: 2017-6-19 下午
*
* @param String filePath
*
* @return byte[] content
*
* @author ShiLei
*/
public static byte[] downloadFile(String filePath) {
byte[] content = null;
try {
synchronized(storageClient){
content = storageClient.download_file1(filePath);
}
} catch (Exception e) {
e.printStackTrace();
}
return content;
}
/**
* 方法概要: 文件删除
*
* 创建时间: 2017-6-19 下午
*
* @param String filePath 服务器上该文件路径url(将数组转成json字符串)
*
* @return flag(0表示成功,-1表示失败)
*
* @author ShiLei
*/
public static int deleteFile(String filePath) {
try {
List<String> list = JSONObject.parseArray(filePath, String.class);
synchronized(storageClient){
for (String url : list) {
storageClient.delete_file1(url);
}
return 0;
}
} catch (Exception e) {
e.printStackTrace();
return -1;
}
}
/**
* 方法概要: 获取指定文件信息
*
* 创建时间: 2017-6-19 下午
*
* @param String filePath
*
* @return FileInfo
*
* @author ShiLei
*/
public static FileInfo getFileInfo(String filePath) {
FileInfo info = null;
try {
synchronized(storageClient){
info = storageClient.get_file_info1(filePath);
}
} catch (Exception e) {
e.printStackTrace();
}
return info;
}
/**
* 方法概要: 获取指定文件元信息
*
* 创建时间: 2017-6-19 下午
*
* @param String filePath
*
* @return NameValuePair[]
*
* @author ShiLei
*/
public static NameValuePair[] getMetaInfo(String filePath) {
NameValuePair[] pairs=null;
try {
synchronized(storageClient){
pairs = storageClient.get_metadata1(filePath);
}
} catch (Exception e) {
e.printStackTrace();
}
return pairs;
}
}
package com.gcx.fileapi.service.serviceImpl;
/**
* @author ShiLei
*
* 创建时间: 2017-4-25 下午
*
*/
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.csource.common.NameValuePair;
import org.csource.fastdfs.FileInfo;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;
import org.springframework.web.multipart.commons.CommonsMultipartResolver;
import com.gcx.fileapi.model.FastDFSFile;
import com.gcx.fileapi.model.Params;
import com.gcx.fileapi.service.FastDFSService;
import com.gcx.fileapi.untils.FastDFSUntils;
@Service("fastdfsService")
public class FastDFSServiceImpl implements FastDFSService {
// 上传1
public String upload(String groupName, MultipartFile attach) {
Params params = null;
String filePath = "";
try {
params = getData(groupName, attach);
if (params != null) {
filePath = FastDFSUntils.uploadFile(params.getFile(),
params.getValuePairs());
}
} catch (Exception e) {
e.printStackTrace();
}
return filePath;
}
// 上传2
public String upload(String groupName,String fileFullUrl) {
String filePath = "";
try {
if (fileFullUrl != null && !"".equals(fileFullUrl)) {
filePath = FastDFSUntils.uploadFile(groupName,fileFullUrl);
}
} catch (Exception e) {
e.printStackTrace();
}
return filePath;
}
// 上传3
public String uploadByPlugin(HttpServletRequest request, String groupName) throws Exception {
// 定义回显filePath地址
String filePath = "";
Params params = null;
// 创建一个通用的多部分解析器
CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver(
request.getSession().getServletContext());
// 判断 request 是否有文件上传,即多部分请求
if (multipartResolver.isMultipart(request)) {
// 转换成多部分request
MultipartHttpServletRequest multiRequest = (MultipartHttpServletRequest) request;
// 取得request中的所有文件名
Iterator<String> iter = multiRequest.getFileNames();
while (iter.hasNext()) {
// 取得上传文件
MultipartFile attach = multiRequest.getFile(iter.next());
if (attach != null) {
// 如果名称不为"",说明该文件存在,否则说明该文件不存在
if (attach.getOriginalFilename().trim() != "") {
params = getData(groupName, attach);
if (params != null) {
filePath = FastDFSUntils.uploadFile(
params.getFile(), params.getValuePairs());
}
}
}
}
}
return filePath;
}
// 下载
public void downloadFile(HttpServletResponse response, String filePath) throws IOException {
String fileName = getMetaInfo(filePath).get("FileName");
byte[] content=null;
if (filePath != null && !"".equals(filePath)) {
content = FastDFSUntils.downloadFile(filePath);
InputStream is = new ByteArrayInputStream(content);
// 设置response参数,可以打开下载页面
response.reset();
response.setContentType("application/*;charset=utf-8");
response.setHeader("Content-Disposition", "attachment;filename="+ new String(fileName.getBytes(), "iso-8859-1"));
BufferedInputStream bis = new BufferedInputStream(is);
BufferedOutputStream bos = new BufferedOutputStream(response.getOutputStream());
try {
byte[] buff = new byte[2048];
int bytesRead;
while (-1 != (bytesRead = bis.read(buff, 0, buff.length))) {
bos.write(buff, 0, bytesRead);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (bis != null)
bis.close();
if (bos != null)
bos.close();
}
}
}
// 获取参数
public Params getData(String groupName, MultipartFile attach) throws Exception {
Params param = new Params();
if (groupName != null && !"".equals(groupName) && attach != null) {
// 获取文件后缀名
String ext = attach.getOriginalFilename().substring(
attach.getOriginalFilename().lastIndexOf(".") + 1);
FastDFSFile file = new FastDFSFile(attach.getBytes(), groupName,
attach.getOriginalFilename(), ext, String.valueOf(attach.getSize()));
NameValuePair[] valuePairs = new NameValuePair[4];
valuePairs[0] = new NameValuePair("FileName",
attach.getOriginalFilename());
valuePairs[1] = new NameValuePair("FileLength",
String.valueOf(attach.getSize())+" B");
valuePairs[2] = new NameValuePair("FileExt", ext);
valuePairs[3] = new NameValuePair("FileAuthor",file.getFileAuthor());
param.setFile(file);
param.setValuePairs(valuePairs);
}
return param;
}
// 文件刪除
public int deleteFile(String filePath) {
if (filePath != null && !"".equals(filePath)) {
int flag=FastDFSUntils.deleteFile(filePath);
return flag;
}
return -1;
}
// 获取指定文件信息
public Map<String, String> getFileInfo(String filePath) {
Map<String, String> map=new HashMap<String, String>();
if (filePath != null && !"".equals(filePath)) {
FileInfo info=FastDFSUntils.getFileInfo(filePath);
Date createDate = info.getCreateTimestamp();
map.put("CreateTime", new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(createDate));
long fileSize = info.getFileSize();
map.put("FileLength", fileSize+" B");
String sourceIp = info.getSourceIpAddr();
map.put("SourceIp", sourceIp);
}
return map;
}
// 获取指定文件元信息
public Map<String, String> getMetaInfo(String filePath) {
Map<String, String> map=new HashMap<String, String>();
if (filePath != null && !"".equals(filePath)) {
NameValuePair[] pairs=FastDFSUntils.getMetaInfo(filePath);
for(NameValuePair meta : pairs) {
map.put(meta.getName(),meta.getValue());
}
}
return map;
}
}
package com.gcx.fileapi.service;
import java.io.IOException;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.multipart.MultipartFile;
/**
* @author ShiLei
*
* 创建时间: 2017-4-19 下午
*
*/
public interface FastDFSService {
String upload(String groupName, MultipartFile attach);
String upload(String groupName,String fileFullUrl);
String uploadByPlugin(HttpServletRequest request, String groupName) throws Exception;
void downloadFile(HttpServletResponse response, String filePath) throws IOException;
int deleteFile(String filePath);
Map<String, String> getFileInfo(String filePath);
Map<String, String> getMetaInfo(String filePath);
}
package com.gcx.fileapi.model;
import com.gcx.fileapi.untils.FileManagerConfig;
/**
* FastDFSFile实体类
*
* 2017-4-19 下午
*
* @fileAuthor ShiLei
*/
public class FastDFSFile implements FileManagerConfig {
private static final long serialVersionUID = 1L;
private byte[] content; //上传内容 二进制字节
private String groupName; //组名
private String fileName; //文件名称
private String fileExt; //文件后缀名
private String fileLength; //文件长度
private String fileAuthor = FILE_DEFAULT_AUTHOR;
public FastDFSFile(byte[] content, String fileExt) {
this.content = content;
this.fileExt = fileExt;
}
public FastDFSFile(byte[] content, String groupName,String fileName, String fileExt) {
this.content = content;
this.fileName = fileName;
this.fileExt = fileExt;
this.groupName=groupName;
}
public FastDFSFile(byte[] content,String groupName, String fileName, String fileExt, String fileLength) {
this.content = content;
this.groupName=groupName;
this.fileName = fileName;
this.fileExt = fileExt;
this.fileLength = fileLength;
}
public byte[] getContent() {
return content;
}
public void setContent(byte[] content) {
this.content = content;
}
public String getFileName() {
return fileName;
}
public void setFileName(String fileName) {
this.fileName = fileName;
}
public String getFileExt() {
return fileExt;
}
public void setFileExt(String fileExt) {
this.fileExt = fileExt;
}
public String getFileLength() {
return fileLength;
}
public void setFileLength(String fileLength) {
this.fileLength = fileLength;
}
public String getFileAuthor() {
return fileAuthor;
}
public void setFileAuthor(String fileAuthor) {
this.fileAuthor = fileAuthor;
}
public String getGroupName() {
return groupName;
}
public void setGroupName(String groupName) {
this.groupName = groupName;
}
}
package com.gcx.fileapi.model;
import org.csource.common.NameValuePair;
public class Params {
private NameValuePair[] valuePairs;
private FastDFSFile file;
public FastDFSFile getFile() {
return file;
}
public void setFile(FastDFSFile file) {
this.file = file;
}
public NameValuePair[] getValuePairs() {
return valuePairs;
}
public void setValuePairs(NameValuePair[] valuePairs) {
this.valuePairs = valuePairs;
}
}
package com.gcx.fileapi.model;
public class ReturnUploadImage {
private String title;
private String original;
private String state;
private String url;
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getOriginal() {
return original;
}
public void setOriginal(String original) {
this.original = original;
}
public String getState() {
return state;
}
public void setState(String state) {
this.state = state;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
}
package com.gcx.fileapi.controller;
import java.io.IOException;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.beans.factory.annotation.Autowired;
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;
import org.springframework.web.multipart.MultipartHttpServletRequest;
import com.alibaba.fastjson.JSON;
import com.gcx.fileapi.model.ReturnUploadImage;
import com.gcx.fileapi.service.FastDFSService;
@Controller
@RequestMapping("/fileController")
public class FastDFSController {
@Autowired
private FastDFSService fastdfsService;
/**
* 方法概要: 传统上传1
*
* 创建时间: 2017-4-19 下午
*
* @param String groupName,MultipartFile attach
*
* @return filePath
*
* @author ShiLei
*/
@RequestMapping(value = "/uploadOne")
@ResponseBody
public String upload(String groupName, MultipartFile attach) throws IOException {
String filePath=fastdfsService.upload(groupName, attach);
return filePath;
}
/**
* 方法概要: 根据本地指定全路径上传 上传2
*
* 创建时间: 2017-4-19 下午
*
* @param String groupName,String fileFullUrl
*
* @return filePath
*
* @author ShiLei
*/
@RequestMapping(value = "/uploadTwo")
@ResponseBody
public String upload(String groupName,String fileFullUrl) throws IOException {
String filePath=fastdfsService.upload(groupName,fileFullUrl);
return filePath;
}
/**
* 方法概要: 使用上传插件Uploadify 上传3
*
* 创建时间: 2017-4-19 下午
*
* @param String groupName
*
* @return filePath
*
* @author ShiLei
*/
@RequestMapping("/uploadByPlugin")
@ResponseBody
public String uploadByPlugin(HttpServletRequest request, String groupName)
throws Exception {
String filePath = fastdfsService.uploadByPlugin(request, groupName);
return filePath;
}
/**
* 方法概要: 使用上传插件UEditor 上传4
*
* 创建时间: 2017-4-19 下午
*
* @param String groupName
*
* @return filePath
*
* @author ShiLei
*/
@RequestMapping("/uploadByPluginUE")
@ResponseBody
public void uploadByPluginUE(HttpServletRequest request,HttpServletResponse response,String groupName)
throws Exception {
response.setContentType("text/html;charset=UTF-8");
// 转型为MultipartHttpRequest:
MultipartHttpServletRequest multipartRequest=(MultipartHttpServletRequest) request;
// 获得文件:
MultipartFile attach =multipartRequest.getFile("upfile"); //UEditor传到后台的是这个upfile,其他的文件上传,应该类似
String picaddr = fastdfsService.upload(groupName, attach);
ReturnUploadImage rui = new ReturnUploadImage();
// rui.setTitle(picaddr);//这里需要设置文件名称如:xxx.jpg
// rui.setOriginal(picaddr);//这里需要设置文件名称如:xxx.jpg
rui.setState("SUCCESS");//这里上传成功的话一定要设置大写的 SUCCESS
rui.setUrl(picaddr);//这里是设置返回给UEditor的图片地址
//这个是UEditor需要的返回值内容,UEditor要的返回值需要封装成Json格式
String result = JSON.toJSONString(rui);
response.getWriter().write(result);
}
/**
* 方法概要: 使用wangEditor富文本编辑器上传图片 上传5
*
* 创建时间: 2017-4-19 下午
*
* @param String groupName
*
* @return filePath
*
* @author ShiLei
*/
@RequestMapping("/uploadByPluginWang")
@ResponseBody
public void uploadByPluginWang(HttpServletRequest request,HttpServletResponse response, String groupName)
throws Exception {
// response.setContentType("textml;charset=UTF-8");
// request.setCharacterEncoding("UTF-8");
String filePath = fastdfsService.uploadByPlugin(request,groupName);
// 返回图片的URL地址
response.getWriter().write(filePath);
}
/**
* 方法概要: 文件下载
*
* 创建时间: 2017-6-19 下午
*
* @param String filePath
*
* @return
*
* @author ShiLei
*/
@RequestMapping(value = "/downloadFile")
@ResponseBody
public void downloadFile(HttpServletResponse response, String filePath) throws IOException{
fastdfsService.downloadFile(response,filePath);
}
/**
* 方法概要: 文件刪除
*
* 创建时间: 2017-6-19 下午
*
* @param String filePath 服务器上该文件路径url(将数组转成json字符串)
*
* @return flag 判断文件是否成功删除(0表示成功,-1表示失败)
*
* @author ShiLei
*/
@RequestMapping(value = "/deleteFile")
@ResponseBody
public int deleteFile(String filePath){
int flag=fastdfsService.deleteFile(filePath);
return flag;
}
/**
* 方法概要: 获取指定文件信息
*
* 创建时间: 2017-6-19 下午
*
* @param String filePath 服务器上该文件路径url
*
* @return Map
*
* @author ShiLei
*/
@RequestMapping(value = "/getFileInfo")
@ResponseBody
public Map<String,String> getFileInfo(String filePath){
Map<String,String> map=fastdfsService.getFileInfo(filePath);
return map;
}
/**
* 方法概要: 获取指定文件元信息
*
* 创建时间: 2017-6-19 下午
*
* @param String filePath 服务器上该文件路径url
*
* @return Map
*
* @author ShiLei
*/
@RequestMapping(value = "/getMetaInfo")
@ResponseBody
public Map<String,String> getMetaInfo(String filePath){
Map<String,String> map=fastdfsService.getMetaInfo(filePath);
return map;
}
}
fastDFS.conf:
connect_timeout = 2
network_timeout = 30
charset = UTF-8
http.nginx_http_port = 8090
tracker_server = 119.90.51.183:22122