Linux安装go-fastdfs

embedded/2024/9/29 20:57:12/

安装

mkdir /home/go-fastdfs
wget -P /home/go-fastdfs https://github.com/sjqzhang/go-fastdfs/releases/download/v1.4.5/fileserver
chmod +x /home/go-fastdfs/fileserver
cd /home/go-fastdfs
nohup ./fileserver server  &

由于fileserver下载速度巨慢,此处提供下载好的资源

fileserver文件下载

使用

@Component
public class GoFastUtils {private static final Logger logger = LoggerFactory.getLogger(GoFastUtils.class);/*** 返回数据输出格式,json|text|json2*/private static final String OUTPUT = "json";public static String[] imageType = {"jpg", "jpeg", "png"};public static String[] videoType = {"mp4", "avi"};/*** 判断文件类型 <br/>* 文件类型: jpg*/public static boolean isOkFileType(@NotNull MultipartFile file, @NotNull String fileType) throws IOException {String type = FileTypeUtil.getType(file.getInputStream());logger.info("file-type:{}", type);return type.equalsIgnoreCase(fileType);}public static boolean isJpg(@NotNull MultipartFile file) throws IOException {String type = FileTypeUtil.getType(file.getInputStream());logger.info("file-type:{}", type);return type.equalsIgnoreCase("jpg");}/*** 上传文件** @param file* @param path       自定义路径* @param scene      场景* @param serverAddr* @return* @throws Exception*/public static UploadResult upload(MultipartFile file, String path, String scene, String serverAddr)throws IOException {String resp = "";InputStream fileStream = null;String filename = "";try {fileStream = file.getInputStream();String originalFilename = file.getOriginalFilename();if ("blob".equals(originalFilename)) {originalFilename = extractFilename(file);}InputStreamResource isr = new InputStreamResource(fileStream, originalFilename);filename = isr.getName();// 请求参数Map<String, Object> params = new HashMap<>();params.put("file", isr);params.put("output", "json");params.put("path", path);params.put("scene", scene);resp = HttpRequest.post(serverAddr).form(params).timeout(90000).execute().body();} catch (Exception e) {throw new ValidatorException("文件上传发生异常,原因:" + e.getMessage());} finally {if (fileStream != null) {fileStream.close();}}JSONObject jsonObject = JSON.parseObject(resp);if("fail".equals(jsonObject.getString("status"))){throw new RuntimeException(jsonObject.getString("message"));}UploadResult result = JSONObject.parseObject(resp, UploadResult.class);result.setFilename(filename);if (!result.isSuccess()) {throw new RuntimeException("文件上传失败,原因:" + result.getRetmsg());}return result;}/*** 编码文件名*/public static String extractFilename(MultipartFile file) {return StringUtils.format("{}_{}.{}", FilenameUtils.getBaseName(file.getOriginalFilename()),Seq.getId(Seq.uploadSeqType), getExtension(file));}/*** 获取文件名的后缀** @param file*            表单文件* @return 后缀名*/public static String getExtension(MultipartFile file) {String extension = FilenameUtils.getExtension(file.getOriginalFilename());if (StringUtils.isEmpty(extension)) {extension = MimeTypeUtils.getExtension(Objects.requireNonNull(file.getContentType()));}return extension;}/*** 图片上传(带水印)** @param file* @param watermark 水印文字* @return* @throws IOException*/public static UploadResult uploadWithWatermark(MultipartFile file, String watermark, String suffix)throws IOException {UploadResult uploadResult;ByteArrayOutputStream bos = addWatermark(file, watermark);byte[] b = bos.toByteArray();ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(b);InputStreamResource isr = new InputStreamResource(byteArrayInputStream, file.getOriginalFilename());Map<String, Object> params = new HashMap<>();params.put("file", isr);params.put("path", "image");params.put("output", OUTPUT);params.put("scene", "image");String resp = HttpUtil.post(suffix, params);logger.info("GoFastDFSUtils2:uploadWithWatermark:resp: {}", resp);JSONObject exJson = JSONObject.parseObject(resp);uploadResult = JSON.toJavaObject(exJson, UploadResult.class);return uploadResult;}/*** 加水印** @param file* @param watermark* @return* @throws IOException*/private static ByteArrayOutputStream addWatermark(MultipartFile file, String watermark) throws IOException {InputStream in = file.getInputStream();BufferedInputStream bis = new BufferedInputStream(in);BufferedImage image = ImageIO.read(bis);int height = image.getHeight();int width = image.getWidth();// 加水印Graphics2D g = image.createGraphics();g.drawImage(image, 0, 0, width, height, null);g.setColor(new Color(128, 128, 128));// 字体大小int num = width > height ? height / 30 : width / 30;g.setFont(new Font("微软雅黑", Font.PLAIN, num));SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");String date = formatter.format(new Date());String[] rows = {date, watermark};// 设置水印坐标,左上角为起点int x = 10;int y = height - 5;for (String row : rows) {g.drawString(row, x, y -= g.getFontMetrics().getHeight() + 2);}g.dispose();ByteArrayOutputStream bos = new ByteArrayOutputStream();ImageIO.write(image, "jpg", bos);return bos;}/*** 图片删除*/public static void deleteImage(String md5, String suffix) {if (StringUtils.isEmpty(md5)) {return;}try {Map<String, Object> params = new HashMap<>();params.put("md5", md5);HttpUtil.post(suffix, params);} catch (Exception e) {logger.warn(e.getMessage());}}}
public class UploadResult implements Serializable {private static final long serialVersionUID = 1L;/*** 文件访问路径*/private String url;/*** md5码*/private String md5;/*** 文件存储路径*/private String path;/*** 域名:http://192.168.0.198:8080*/private String domain;/*** 场景*/private String scene;private String scenes;/*** 文件大小*/private BigInteger size;private BigInteger mtime;/*** 返回结果消息*/private String retmsg;/*** 返回结果状态编码*/private int retcode;/*** 文件存储路径*/private String src;/*** 文件名*/private String filename;public String getUrl() {return url;}public void setUrl(String url) {this.url = url;}public String getMd5() {return md5;}public void setMd5(String md5) {this.md5 = md5;}public String getPath() {return path;}public void setPath(String path) {this.path = path;}public String getDomain() {return domain;}public void setDomain(String domain) {this.domain = domain;}public String getScene() {return scene;}public void setScene(String scene) {this.scene = scene;}public BigInteger getSize() {return size;}public void setSize(BigInteger size) {this.size = size;}public BigInteger getMtime() {return mtime;}public void setMtime(BigInteger mtime) {this.mtime = mtime;}public String getScenes() {return scenes;}public void setScenes(String scenes) {this.scenes = scenes;}public String getRetmsg() {return retmsg;}public void setRetmsg(String retmsg) {this.retmsg = retmsg;}public int getRetcode() {return retcode;}public void setRetcode(int retcode) {this.retcode = retcode;}public String getSrc() {return src;}public void setSrc(String src) {this.src = src;}public String getFilename() {return filename;}public void setFilename(String filename) {this.filename = filename;}/*** 是否上传成功** @return*/public boolean isSuccess() {return retcode == 0;}@Overridepublic String toString() {final StringBuffer sb = new StringBuffer("UploadResult{");sb.append("url='").append(url).append('\'');sb.append(", md5='").append(md5).append('\'');sb.append(", path='").append(path).append('\'');sb.append(", domain='").append(domain).append('\'');sb.append(", scene='").append(scene).append('\'');sb.append(", scenes='").append(scenes).append('\'');sb.append(", size=").append(size);sb.append(", mtime=").append(mtime);sb.append(", retmsg='").append(retmsg).append('\'');sb.append(", retcode=").append(retcode);sb.append(", src='").append(src).append('\'');sb.append('}');return sb.toString();}
}

调用

UploadResult upload = GoFastUtils.upload(file, null, "image", "http://192.168.3.193:8848/group1/upload");

http://www.ppmy.cn/embedded/119576.html

相关文章

Unity3D PostLateUpdate为何突然占用大量时间详解

在Unity3D中&#xff0c;直接名为PostLateUpdate的函数并不是Unity标准API中的一部分。然而&#xff0c;这个术语可能指的是在LateUpdate之后执行的某些自定义逻辑或Unity内部机制中的某种后续处理。当提到PostLateUpdate或LateUpdate突然占用大量时间时&#xff0c;我们需要考…

Python的Pandas库学习指南

应用场景 Pandas库因其强大的数据处理和分析能力&#xff0c;在数据科学和数据分析领域有着广泛的应用。 1. 数据清洗 处理缺失数据&#xff1a;通过删除或填充缺失值来清洗数据。数据类型转换&#xff1a;将数据转换为合适的格式&#xff0c;例如将日期字符串转换为日期类型…

Android 使用反射 反射获取activity

1. 背景 在andorid开发中&#xff0c;经常遇见在某些工具类中没有Context上下文对象时&#xff0c;一些系统服务的代理对象无法创建出来&#xff0c;举个例子&#xff1a;比如在源码(framework/base/graphics/java/android/graphics)路径下的Canvas.java Bitmap.java Pictur…

UE4_Niagara基础实例—4、静态网格体表面生成粒子

效果图&#xff1a; 分析&#xff1a;在物体面上生成粒子&#xff0c;改变粒子的不透明度&#xff0c;让粒子收到力&#xff0c;并添加紊乱&#xff0c;类似于水蒸气。 操作步骤&#xff1a; 1、创建个niagara 系统&#xff0c;使用模版 simple sprite burst。简单调节参数。…

PL/SOL 连接提示 Initialization error 解决方法

问题 测试连接数据库报错&#xff0c;提示如下 解决方法 1、OCI 库输入的时候&#xff0c;路径两遍有" " 2、Instant Client 和 PL/SOL Developer 位数版本不一致 要么都是x64位&#xff0c;要么都是x86位&#xff08;32位&#xff09;&#xff0c;以下为下载链接…

概率论原理

智慧挺不喜欢我&#xff0c;他告诉我需要有耐心&#xff0c;答案在后面&#xff1b;而我总想马上得到答案&#xff1b;但它也会给我奖励&#xff0c;因为我总会自己去寻找答案 B站 大大的小番茄 普林斯顿微积分 PDF 一化儿 BILIBILI 泰勒展开式 知乎https://www.zhihu.com…

胤娲科技:揭秘AI记忆宫殿—LLM如何用动画玩转乔丹打篮球的秘密

当AI遇上“乔丹打篮球”&#xff0c;真相竟然藏在动画里&#xff1f; 想象一下&#xff0c;你向一位AI大模型轻声询问&#xff1a;“迈克尔・乔丹从事的体育运动是……”几乎在瞬间&#xff0c;它就自信满满地回答&#xff1a;“篮球&#xff01;” 这一刻&#xff0c;你是否曾…

初始C++模板

1.泛型编程 1.1什么事泛型编程 在学习C语言时&#xff0c;我们时常会有这样的烦恼&#xff1a; 在针对每一种不同的类型变量进行函数传参或者是运算处理时&#xff0c;我们总是编写不同的函数或者是进行不同的处理&#xff0c;才能达到目的&#xff0c;这时&#xff0c;我们…