精选文章 feign调用文件上传服务

feign调用文件上传服务

作者:IT_CREATE 时间: 2019-11-11 04:49:16
IT_CREATE 2019-11-11 04:49:16

引入openfeign

记住必须引入openfeign依赖,而不是feign依赖,引入openfeign就不用了feign了,openfeign包含了feign的所有功能

2.1.1.RELEASE


      org.springframework.cloud
      spring-cloud-starter-openfeign
      ${springcloud.openfeign.version}

文件上传微服务:

必须指定为表单数据类型,文件接收加入@RequestPart注解指定文件名,这个名字是MultipartFile 的getName方法可以拿到的,也就是前端传输构造的表单提交对应的file的name值,或者是自己用js构造表单数据自己指定的名字,记住如果@RequestPart注解指定的值和getName() 方法拿到的值不对应,是接收不到的

@RestController
@RequestMapping("/file")
public class UploadController {

    @Autowired
    private FastDfsService fastDfsService;

    /**
     * 单文件上传
     * @param file
     * @return
     */
    @PostMapping(value = "/upload",consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
    public JsonResult uploadFile(@RequestPart("file") MultipartFile file) {
        System.out.print("文件上传服务中:"+file.getOriginalFilename());
        Map map = null;
        try {
            map = fastDfsService.uploadFile(file);
        } catch (IOException e) {
            new JsonResult<>(e);
        }
        return new JsonResult(map, "文件上传成功");
    }

    /**
     * 多文件上传
     * @param
     * @return
     */
    @PostMapping(value = "/uploadFiles",consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
    public JsonResult uploadFiles(@RequestPart("files") MultipartFile[] files) {
        List data = new ArrayList<>();
        for (MultipartFile file:files){
            Map map = null;
            try {
                map = fastDfsService.uploadFile(file);
                data.add(map);
            } catch (IOException e) {
                new JsonResult<>(e);
            }
        }
        return new JsonResult(data, "文件上传成功");
    }

    @PostMapping(value = "/deleteFile")
    public Map deleteFile(@RequestParam("fileUrl") String fileUrl){
        int t =  fastDfsService.deleteFile(fileUrl);
        Map message = new HashMap<>();
        if(t==1){
            message.put("code",1);
            message.put("msg","删除文件成功");
            return message;
        }
        message.put("code",0);
        message.put("msg","删除文件失败");
        return message;
    }


} 

调用服务:

@FeignClient(value = "file-upload", configuration = UpLoadFeignClient.MultipartSupportConfig.class)
public interface UpLoadFeignClient {

    @PostMapping(value = "/file/upload", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
    public JsonResult uploadFile(@RequestPart("file") MultipartFile file);

    @PostMapping(value = "/file/uploadFiles",consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
    public JsonResult uploadFiles(@RequestPart("files") MultipartFile[] files);

    @PostMapping(value = "/file/deleteFile")
    public Map deleteFile(@RequestParam("fileUrl") String fileUrl);

    @Configuration
    class MultipartSupportConfig {

        @Bean
        public Encoder feignFormEncoder() {
            return new SpringFormEncoder();
        }
    }

}

UploadFileServiceImpl.java

@Service
public class UploadFileServiceImpl implements UploadFileService {

    @Autowired
    private  UpLoadFeignClient upLoadFeignClient;

    @Override
    public JsonResult uploadFile(MultipartFile file) {
        return upLoadFeignClient.uploadFile(file);
    }

    @Override
    public JsonResult uploadFiles(MultipartFile[] files) {
        return upLoadFeignClient.uploadFiles(files);
    }

    @Override
    public Map deleteFile(String fileUrl) {
        return upLoadFeignClient.deleteFile(fileUrl);
    }

}

 

配置fdfs文件服务器:

1.26.1-RELEASE


     com.github.tobato
     fastdfs-client
     ${fastDFS.client.version}

application.yml或application.properties

server:
  port: 8082
spring:
  application:
    name: file-upload
  servlet:
    multipart:
      max-file-size: 10MB #限制文件大小

eureka:
  client:
    service-url:
      defaultZone: http://xx:xx@127.0.0.1:10086/eureka
  instance:
    ip-address: 127.0.0.1
    prefer-ip-address: true

fdfs:
  soTimeout: 1500 #socket连接超时时长
  connectTimeout: 600 #连接tracker服务器超时时长
  resHost: 61.157.96.xx
  storagePort: 22100
  thumbImage: #缩略图生成参数,可选
    width: 150
    height: 150
  trackerList: #TrackerList参数,支持多个,我这里只有一个,如果有多个在下方加- x.x.x.x:port
    - 61.157.96.xx:22122

FastDFSConfig.java

@Component
@Data
public class FastDFSConfig {

    @Value("${fdfs.resHost}")
    private String resHost;

    @Value("${fdfs.storagePort}")
    private String storagePort;

}

FastDFSClientImporter.java

@Configuration
@Import(FdfsClientConfig.class) 解决jmx重复注册bean的问题
@EnableMBeanExport(registration = RegistrationPolicy.IGNORE_EXISTING)
public class FastDFSClientImporter {

    @Bean
    public MultipartConfigElement multipartConfigElement(){
        MultipartConfigFactory factory = new MultipartConfigFactory();

        // 一个文件最大KB,MB
        factory.setMaxFileSize(DataSize.ofMegabytes(10));
        // 设置总上传数据总大小
        factory.setMaxRequestSize(DataSize.ofMegabytes(20));

        // 设置文件大小限制 ,超出设置页面会抛出异常信息,
        // 这样在文件上传的地方就需要进行异常信息的处理了;
        //factory.setMaxFileSize("128MB"); // KB,MB
        /// 设置总上传数据总大小
        //factory.setMaxRequestSize("256MB");
        //设置文件路径
        //factory.setLocation("/excel_src");

        return factory.createMultipartConfig();

    }
}

FastDfsService.java

import com.github.tobato.fastdfs.domain.StorePath;
import com.github.tobato.fastdfs.domain.ThumbImageConfig;
import com.github.tobato.fastdfs.exception.FdfsUnsupportStorePathException;
import com.github.tobato.fastdfs.proto.storage.DownloadByteArray;
import com.github.tobato.fastdfs.proto.storage.DownloadFileWriter;
import com.github.tobato.fastdfs.service.FastFileStorageClient;
import com.xx.upload.config.FastDFSConfig;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.io.FilenameUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import org.springframework.web.multipart.MultipartFile;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.nio.charset.Charset;
import java.util.HashMap;
import java.util.Map;
/**
 * @data ${DATA}
 */@Slf4j
@Component
public class FastDfsService {

    @Autowired
    private FastFileStorageClient storageClient;

    @Autowired
    private FastDFSConfig fastDFSConfig;   // 项目参数配置

    @Autowired
    private ThumbImageConfig thumbImageConfig;

    /**
     * 上传一个文件
     */
    public Map uploadFile(MultipartFile file) throws IOException {
        StorePath storePath = storageClient.uploadFile(file.getInputStream(), file.getSize(), FilenameUtils.getExtension(file.getOriginalFilename()), null);
        return getResult(storePath);
    }

    /**
     * 将一段字符串生成一个文件上传
     */
    public Map uploadFile(String content, String fileExtension) {
        byte[] buff = content.getBytes(Charset.forName("UTF-8"));
        ByteArrayInputStream stream = new ByteArrayInputStream(buff);
        StorePath storePath = storageClient.uploadFile(stream, buff.length, fileExtension, null);
        return getResult(storePath);
    }

    /**
     * 上传一张图片, 服务器生成2张图片, 一张原图, 一张缩略图
     */
    public Map uploadImg(MultipartFile file) throws IOException {
        StorePath storePath = storageClient.uploadImageAndCrtThumbImage(
                file.getInputStream(), file.getSize(), FilenameUtils.getExtension(file.getOriginalFilename()), null);
        String smallImgPath = thumbImageConfig.getThumbImagePath(storePath.getPath());
        Map resultMap = getResult(storePath);
        resultMap.put("smallImgPath", smallImgPath);
        return resultMap;
    }

    // 封装上传的 返回结果
    private Map getResult(StorePath storePath) {
        Map resultMap = new HashMap();
        String fileUrl = "http://" + fastDFSConfig.getResHost() + ":" + fastDFSConfig.getStoragePort() + "/" + storePath.getFullPath();
        resultMap.put("fileUrl", fileUrl);
        resultMap.put("fullPath", storePath.getFullPath());
        resultMap.put("path", storePath.getPath());
        resultMap.put("group", storePath.getGroup());
        return resultMap;
    }

    /**
     * 下载文件
     */
    public String downloadFile(String group, String path, String filePath) {
        String downloadFile = storageClient.downloadFile(group, path, new DownloadFileWriter(filePath));
        return downloadFile;
    }

    /**
     * 下载文件
     */
    public byte[] downloadFile(String group, String path) {
        byte[] bytes = storageClient.downloadFile(group, path, new DownloadByteArray());
        return bytes;
    }


    /**
     * 删除文件
     */
    public int deleteFile(String fileUrl) {
        if (StringUtils.isEmpty(fileUrl)) {
            return 0;
        }
        try {
            StorePath storePath = StorePath.praseFromUrl(fileUrl);
            storageClient.deleteFile(storePath.getGroup(), storePath.getPath());
        } catch (FdfsUnsupportStorePathException e) {
            log.warn(e.getMessage());
            return 0;
        }
        return 1;
    }

    /**
     * 删除文件
     */
    public int deleteFile(String group, String path) {
        if (StringUtils.isEmpty(group) || StringUtils.isEmpty(path)) {
            return 0;
        }
        try {
            storageClient.deleteFile(group, path);
        } catch (Exception e) {
            log.warn(e.getMessage());
            return 0;
        }
        return 1;
    }
}

 

 

 

 

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

上一篇:学习凭自学C语言能到达什么高度

下一篇:LeetCode-57、插入区间-困难

您可能感兴趣

  • IntellIJ IDEA2020新功能

    一、java 1、Java 14支持:记录和模式匹配 IntelliJ IDEA 2020.1添加了对Java 14及其新功能的支持。IDE不仅添加了对Records的完整代码洞察支持,而且还使您能够快速创建新记录并生成其构造函数和组件,并警告存在的错误。您还将发现对instanceof运算符的模式匹配的支持,包括新的检查和快速修复,该快速修复通过用新的简洁模式变量替换它们来快速简化冗长的i...

  • 编程小白的毕设开发教程-filter实战

    在filter中可以得到代表用户请求和响应的request、response对象,因此在编程中可以使用Decorator(装饰器)模式对request、response对象进行包装,再把包装对象传给目标资源,从而实现一些特殊需求。 一、Decorator设计模式 1.1、Decorator设计模式介绍   当某个对象的方法不适应业务需求时,通常有2种方式可以对方法进行增强: 编写子类,覆盖需...

  • 前端实习生面试题分析(一)

    最近面试拿了很多公司的实习offer,只要是面试的都通过了。 接下来就分析下面试题,也能给自己一个提升吧,以便后续的面试更轻车熟路些,题目没什么顺序,想起什么写什么,还有我面试过程中的一些小套路。 估计要写好多,每天写几道题,而且有些经验性的东西也不容易写出来 这篇写的都是类似一些概念性的理论东西。 1.JS防抖和节流 先说为什么要做防抖和节流,针对一些会频繁触发的事件,像scroll、re...

  • 使用spring cloud alibaba-网关(gateway)+安全认证(springsecurity+jwt)

    上一篇博客开头说到了gateway服务之前调用有些特殊,那是因为webflux和spring-webmvc; gateway不兼容spring-webmvc所以项目创建的时候也就剔除了,剔除之后无法使用HttpServletRequest,所以之前搭建的不能简单的替换zuul,改动太大。只能将zuul从安全认证这个模块中移除,然后独立成一个模块供gateway认证时调用。 改造之前的spri...

  • 爱了,3174页实战pdf集锦:Redis+多线程+Dubbo+JVM+kafka+MySQL

    写在前面 作为一名Java开发者,在现在这个信息化时代很快的时代,很少会有人停下脚步去思考以及去总结,忽略了很重要的一个步骤,没有反思和总结,只会用原来固有的想法去做事情,所以还是需要隔一段时间去总结。LZ今天总结了自己在平时会用到的一些: 01—Redis实战 在Redis诞生数年之后的今天,这个项目已经发生了显著的变化:我们现在拥有了一个更为健壮的系统,并且随着Redis 2.6的发布,...

  • Centos7添加项目启动脚步到systemctl

    该文档针对springboot等项目可以通过java -jar命令启动等服务 配置脚步 脚步命名名称可为${project_desc}.service [Unit] Description=${project_desc} After=network.target remote-fs.target nss-lookup.target [Service] Type=simple PIDFile=...

  • 【STM32F429开发板用户手册】第38章 STM32F429的FMC总线应用之是32路高速IO扩展

    最新教程下载:http://www.armbbs.cn/forum.php?mod=viewthread&tid=93255 第38章 STM32F429的FMC总线应用之是32路高速IO扩展 本章教程为大家讲解利用STM32429的FMC总线扩展出32路高速IO,且使用简单,实际项目中也比较有实用价值。 目录 第38章 STM32F429的FMC总线应用之是32路高速IO扩展 38.1 初...

  • 【计算机网络】第七章:网络安全

    【计算机网络】第七章:网络安全 目录 网络安全问题概述 1.1.计算机网络面临的安全性威胁 1.2.被动攻击和主动攻击 1.3.计算机网络通信安全的目标 1.4.恶意程序(rogue program) 1.5.计算机网络安全的内容 1.6.一般的数据加密模型 两类密码体制 一、对称密钥密码体制 1.1.对称密钥的缺点与优点 1.2.数据加密标准 DES 1.3.DES 的保密性 二、公钥密码...

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

免费套餐,马上领取!
CSDN

CSDN

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