Feindre la fonction de téléchargement et de téléchargement de fichiers

Prenez l'habitude d'écrire ensemble ! C'est le 15ème jour de ma participation au "Nuggets Daily New Plan·April Update Challenge", cliquez pour voir les détails de l'événement .

FeindreTéléchargerTélécharger

fond de problème

Sur la base de certains des frameworks courants actuels, qui sont essentiellement 微服务des architectures utilisées, les fonctions de gestion de fichiers sont souvent fileextraites d'un 微服务exemple indépendant file微服务.

Les requêtes front-end, font toutes appel à la fonction file微服务de sommation de fichiers de manière unifiée ! ! !上传下载

Il semble n'y avoir rien de mal à une telle conception, une gestion unifiée ! ! !

image.png

Étant donné que le fichier est téléchargé, il peut également être nécessaire de l'écrire 业务数据, par exemple, 附件的信息etc., qui doit être extrait dans un microservice indépendant pour 前端être utilisé.

Alors il y aura un problème : ! ! ! T_T

1. Que se passe-t-il si mes pièces jointes ne sont pas téléchargées via l'interface ? Je suis un service backend et j'ai besoin d'enregistrer une pièce jointe, alors que faites-vous ?

2. Un service dans mon backend a besoin de lire un fichier et de l'analyser. Parce qu'il s'agit d'une architecture distribuée, il peut y être déployé file微服务. Comment devrions-nous le déployer , de sorte que le fichier ne puisse pas être lu du tout, alors comment gérez-vous avec un chiffon de laine?服务器A后端服务服务B磁盘路径

Hmmmm, ce que vous dites est logique, c'est en effet un gros problème ! ! !

image.png

Pas de panique, nous résoudrons ce problème aujourd'hui ! ! !

Car l'invocation de l'interface entre nos services, dans le 微服务système, se fait généralement par feignde-tuning. Alors, le fichier peut-il également être feignappelé ?

La réponse est définitivement oui, haha ​​! ! ! ^_^

Pas beaucoup de bêtises, passons au code! ! !

Feindre la préparation de l'interface

  • Définir une Feigninterface de chargement et de téléchargement
@FeignClient(name = "file", configuration = {FileClient.MultipartSupportConfig.class})
public interface FileClient {
    /**
     * 上传文件
     * @param file
     * @return
     */
    @RequestMapping(path = "/file/upload", consumes = {"multipart/form-data"})
    JsonResult upload(@RequestPart(name="file") MultipartFile file);

    /**
     * 下载文件
     */
    @GetMapping(path = "/file/download/{fileId}")
    Response download(@PathVariable(name = "fileId") String fileId);
       
    public class MultipartSupportConfig {
        @Bean
        @Primary
        @Scope("prototype")
        public Encoder feignFormEncoder() {
            return new SpringFormEncoder();
        }
    }
}
复制代码
  • file微服务Fournir une 上传interface de fichier
@RequestMapping("/file/upload")
public JsonResult upload(MultipartHttpServletRequest request) throws Exception {
    JsonResult jsonResult = new JsonResult();
    String timestamp = request.getParameter("time");
    MultiValueMap<String, MultipartFile> multiFileMap = request.getMultiFileMap();
    List<MultipartFile> files = multiFileMap.get("files");
    if (BeanUtil.isEmpty(files)) {
        files = multiFileMap.get("file");
    }
    Iterator<MultipartFile> it = files.iterator();
    while (it.hasNext()) {
        MultipartFile multipartFile = it.next();
        //保存到磁盘
        multipartFile.transferTo(new File("文件路径"));
        
        //记录文件上传业务数据
        ...
        xxxxFileDao.saveFile(xxxFile);
    }
    jsonResult.setSuccess(true);
    jsonResult.setData(fileList);
    jsonResult.setMessage("成功上传!");
    return jsonResult;
}
复制代码
  • file微服务Fournir une 下载interface de fichier
@GetMapping("/download/{fileId}")
public void feigndownloadOne(@PathVariable("fileId") String fileId, HttpServletResponse response) throws Exception {
    
    //通过fileId查找文件
    ...
    xxxFile = xxxxFileDao.getFile(fileId);
    File file = new File("文件路径");
    
    String filename = xxxFile.getName();
    String type ="attachment";
    response.setHeader("Content-Disposition", type + ";filename=" + filename);
    FileInputStream fis = new FileInputStream(file);
    BufferedInputStream buff = null;
    OutputStream out = null;
    try {
        buff = new BufferedInputStream(fis);
        out = response.getOutputStream();
        IOUtils.copy(buff, out);
    } finally {
        out.flush();//注意out流,对象不能close
        fis.close();
        buff.close();
    }
}
复制代码

下载这个接口,有个比较重要的地方就是,out流,不能close(),否则就算获取到该流,也无法处理业务逻辑。

image.png

好了,上面就是咋们定义好的feign接口,和提供服务的file微服务上传下载接口!!!

上传下载接口,只是给出一个demo,大家伙,可自行修改,相应的业务逻辑!!!^_^

Feign上传下载

接下来,咋们就开始使用到这个feign上传下载功能!!!

image.png

  • 上传feign接口,使用

import java.io.File;
import java.io.FileInputStream;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.mock.web.MockMultipartFile;
import org.apache.http.entity.ContentType;
 
 
File pdfFile = new File("D://test.pdf");
FileInputStream fileInputStream = new FileInputStream(pdfFile);
MultipartFile multipartFile = new MockMultipartFile(pdfFile.getName(), pdfFile.getName(),
					ContentType.APPLICATION_OCTET_STREAM.toString(), fileInputStream);

//上传
JsonResult jsonResult = fileClient.upload(multipartFile);
if (jsonResult.isSuccess() && jsonResult.getCode() == 200) {
   
}
复制代码

注意了 注意了 注意了!!!

这里,有个要注意的地方,因为我们的upload接口,即controller接口一般使用MultipartFile对象接收文件,那么我们就得把File,对象先转成MultipartFile对象,才可以调通这个接口!!!

转换方式,看上面代码即可!!!

好了,这个就是上传文件的示例,也是比较简单啦!!!

  • 下载feign接口,使用
import feign.Response;

//文件流
Response response = fileClient.download(fileId);
InputStream in = null;
if(response.status() == 200){
    Response.Body body = response.body();
    in = body.asInputStream();
    
    //拿到这个in流,处理相应的业务逻辑
    ...

    
    //处理完成后,记得关闭一下inputStream流
    if(in != null){
        in.close();
    }
}
复制代码

注意了 注意了 注意了!!!

这里有两个地方需要注意:

1.因为我们的download接口,out流是还没有close(),所以这里的in流,用完得close()一下。

2.这里的代码,在开发过程中,不能打断点调试,不能打断点调试,不能打断点调试!!!

重要的事情得说三遍,不能打断点调试,因为你断点调试后,这里的in流,会因为执行了toString()方法,导致in流被关闭了,无法再使用,即不能处理业务逻辑代码了!!!

image.png

好了,这个就是上传文件的示例,也是比较简单啦!!!

好了,Feign上传和下载,大概的实现,就是这样了!!!^_^

Ensuite, nous pouvons écrire du code avec plaisir ! ! ! ^_^

image.png

Je suppose que tu aimes

Origine juejin.im/post/7086827087260024845
conseillé
Classement