Linux安装go-fastdfs

news/2024/9/29 15:51:48/

安装

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/news/1531989.html

相关文章

17年数据结构考研真题解析

第一题&#xff1a; 解析&#xff1a; 我们说递归要找出口&#xff0c;这道题的出口是sum<n&#xff0c;经过观察可以得知&#xff1a;sum123。。。k 设第k次循环跳出&#xff0c;则有sum123。。。k<n k<,很显然答案选B 第二题&#xff1a; 解析&#xff1a; 第一句&a…

C++ STL容器(三) —— 迭代器底层剖析

本篇聚焦于STL中的迭代器&#xff0c;同样基于MSVC源码。 文章目录 迭代器模式应用场景实现方式优缺点 UML类图代码解析list 迭代器const 迭代器非 const 迭代器 vector 迭代器const 迭代器非const迭代器 反向迭代器 迭代器失效参考资料 迭代器模式 首先迭代器模式是设计模式中…

如何理解MYSQL的体系结构

1.MySQL服务器进程mysqld由哪三层组成&#xff0c;从各自所实现的功能角度分别加以说明。 连接层 SQL层 存储层 连接层&#xff1a;通讯协议&#xff0c;TCP/IP本地远程通讯、Socket本地通讯&#xff08;Linux&#xff09;;为…

窗口函数用法

窗口函数&#xff08;Window Functions&#xff09;是SQL中一种强大的工具&#xff0c;允许你在数据集的特定“窗口”或“分区”内执行计算&#xff0c;而不需要对数据进行分组汇总&#xff08;即不会减少返回的行数&#xff09;。这些计算可以包括行号、移动平均、排名等。窗口…

24年Novartis诺华制药社招入职SHL测评:综合能力、性格问卷、动机问卷高分攻略

尊敬的求职者&#xff0c;若您渴望在医药行业的领军企业——诺华制药——开启您的职业生涯&#xff0c;深入了解其社招与校招测评流程至关重要。以下是对诺华SHL测评题型的全面解读&#xff0c;助您在招聘季脱颖而出。 测评构成 诺华的招聘测评由以下三个部分组成&#xff1a…

克里金插值算法文件

由于作者时间发布的比较久&#xff0c;导致一些cesium api和当前版本api不同&#xff0c;故改之&#xff1a; 文件名&#xff1a;kriging.js /*!* author: [object Object]* sakitam-gis/kriging v0.1.0* build-time: 2019-7-6 20:41* LICENSE: MIT* (c) 2019-2019 https://gi…

grafana加载缓慢解决方案

背景 目前随着数据和图表的逐渐增多&#xff0c;Grafana 页面加载速度明显变慢&#xff0c;严重影响了用户体验&#xff0c;几次都有骂娘的冲动.&#xff0c;因此我们需要对 Grafana 进行优化&#xff0c;以提升加载性能。 对于速度优化&#xff0c;我们可以从以下方面进行入…

标准化和归一化的定义、公式、作用、示例、区别

标准化&#xff08;Standardization&#xff09; 和 **归一化&#xff08;Normalization&#xff09;**是数据预处理中常用的两种技术&#xff0c;目的是调整数据的尺度&#xff0c;使得不同特征的数据可以在同一水平上进行比较或处理。这两种方法在形式和用途上有所不同&#…