1. fastDFS est un système de fichiers distribué, principalement utilisé pour stocker et gérer de gros fichiers binaires, tels que des images, de l'audio et de la vidéo.
1. Tracker Server (Tracker Server) : Il s'agit du programme serveur de FastDFS, qui est utilisé pour coordonner l'opération de stockage et d'accès aux fichiers, et est responsable de la gestion des informations d'adresse du serveur de stockage (Storage Server) et de juger de la disponibilité. du serveur de stockage.
2. Serveur de stockage (Storage Server) : Le serveur utilisé pour stocker et gérer les fichiers est en fait un nœud de stockage.
3. Groupe (Groupe) : fait référence au regroupement de serveurs de stockage. Après avoir téléchargé les fichiers, ils seront attribués à un serveur sous ce groupe pour le stockage.
4. Client FastDFS (client FastDFS) : composant d'application utilisé pour télécharger, télécharger et supprimer des fichiers, généralement implémenté via l'API du client FastDFS.
5. Chemin de stockage (Storage Path) : un identifiant unique au monde composé du groupe et du nom de fichier, utilisé pour accéder aux fichiers stockés sur FastDFS.
6. Tracker Path (Tracker Path) : un identifiant unique au monde composé de l'adresse IP et du numéro de port du groupe et du serveur de stockage, utilisé pour accéder au serveur Tracker.
7. Métadonnées : fait référence aux métadonnées utilisées pour décrire les attributs du fichier, généralement utilisées pour compléter la description, la classification, les statistiques, la distinction et la récupération du fichier, etc. FastDFS prend en charge le stockage de métadonnées personnalisées et prend en charge les requêtes et les modifications.
2. Le principe et le processus de mise en œuvre de fastDfs
1. Lorsqu'un utilisateur télécharge une image, le client se connectera au trackeServer, et le trackeServer appellera un StorageServer disponible et renverra l'adresse IP et le port du StorageServer.
2. Le client accédera au StorageServer en fonction de l'adresse IP et du prot, transmettra les ressources au StorageServer, puis générera une réponse classée au chemin du fichier et du fichier.
3. TrackeServer et StorageServer doivent maintenir un mécanisme de battement de cœur, afin que trackeServer sache quel StorageServer est disponible.
3. SpringBoot intègre la technologie de téléchargement d'images fastDfs
1. Introduire les dépendances du client FastDFS : introduire les dépendances associées des clients FastDFS dans pom.xml
<!--fastdfs-->
<dependency>
<groupId>cn.bestwu</groupId>
<artifactId>fastdfs-client-java</artifactId>
<version>1.27</version>
</dependency>
2. Utilisez la classe d'outils de fastDfs
package com.lzc.basic.utils;
import org.csource.common.NameValuePair;
import org.csource.fastdfs.*;
/**
* classe d'outils fastDfs
*/
classe publique FastDfsUtils { // depuis classpath : le contenu des ressources est enfin Compilera en public static String CONF_FILENAME = FastDfsUtils.class.getClassLoader() .getResource("fdfs_client.conf").getFile(); /** * upload file * @param file * @param extName * @return */ public static String upload(byte[] file,String extName) { try { ClientGlobal.init(CONF_FILENAME); TrackerClient tracker = new TrackerClient(); TrackerServer trackerServer = tracker.getConnection();
StorageServer stockageServer = null ;
StorageClient storageClient = new StorageClient(trackerServer, storageServer);
NameValuePair nvp [] = new NameValuePair[]{ new NameValuePair("age", "18"), new NameValuePair("sex", "male") }; String fileIds[] = storageClient.upload_file(file,extName,nvp); System.out.println(fileIds.length); System.out.println("组名:" + fileIds[0]); System.out.println("路径: " + fileIds[1]); retourner "/"+fileIds[0]+"/"+fileIds[1]; } catch (Exception e) { e.
téléchargement de chaîne statique publique (chemin de la chaîne, chaîne extName) { try { ClientGlobal.init (CONF_FILENAME); TrackerClient tracker = new TrackerClient(); TrackerServer trackerServer = tracker.getConnection(); StorageServer stockageServer = null ; StorageClient storageClient = new StorageClient(trackerServer, storageServer); String fileIds[] = storageClient.upload_file(path, extName,null); System.out.println(fileIds.length); System.out.println("组名:" + fileIds[0]); System.out.println("路径: " + fileIds[1]); retourner "/"+fileIds[0]+"/"+fileIds[1]; } catch (Exception e) { e.printStackTrace(); renvoie null ; } } /**
* 下载文件
* @param groupName
* @param fileName
* @return
*/
public static byte[] download(String groupName,String fileName) { try { ClientGlobal.init(CONF_FILENAME); TrackerClient tracker = new TrackerClient(); TrackerServer trackerServer = tracker.getConnection(); StorageServer stockageServer = null ; StorageClient storageClient = new StorageClient(trackerServer, storageServer); byte[] b = storageClient.download_file(groupName, fileName); retourner b ; } catch (Exception e) { e.printStackTrace(); renvoie null ; } }
/**
* 删除文件
* @param groupName
* @param fileName
*/
public static void delete(String groupName,String fileName){ try { ClientGlobal.init(CONF_FILENAME); TrackerClient tracker = new TrackerClient(); TrackerServer trackerServer = tracker.getConnection(); StorageServer stockageServer = null ; StorageClient storageClient = new StorageClient(trackerServer, storageServer); int i = storageClient.delete_file(groupName,fileName); System.out.println( i==0 ? "删除成功" : "删除失败:"+i); } catch (Exception e) { e.printStackTrace(); throw new RuntimeException("删除异常,"+e.getMessage()); } }
// public static void main(String[] args) { // FastDfsUtils.delete("group1","M00/00/0F/oYYBAGJ6IGaAWQeOAAbMJw3URKE510.gif"); // } }
3. Interface back-end
package com.lzc.basic.controller ;
importer com.lzc.basic.exception.GlobalExceptionEnum ;
importer com.lzc.basic.utils.AjaxResult ;
importer com.lzc.basic.utils.FastDfsUtils ;
importer org.apache.commons.io .FilenameUtils ;
importer org.springframework.web.bind.annotation.* ;
importer org.springframework.web.multipart.MultipartFile ;
importer java.io.IOException ;
/**
* télécharger
* télécharger = non requis
* view = chemin
* supprimer
* Update = delete + upload
*/
@RestController
@RequestMapping("/fastDfs")
public class FastDfsController { //@RequestPart gère les éléments de formulaire complexes, le nom par défaut="file", qui est cohérent avec la valeur de l'attribut de nom du fichier téléchargé fichier @PostMapping
public AjaxResult upload (@RequestPart(required = true,value = "file") MultipartFile file){ try { System.out.println(file.getOriginalFilename() + ":" + file.getSize()); // 1. Récupère le tableau d'octets du fichier à partir de file.getBytes() dans l'objet complexe getOriginalFilename() Récupère le nom d'origine String originalFilename = file.getOriginalFilename(); // 2.FilenameUtils.getExtension(originalFilename); Récupère le nom d'extension du fichier String extName = FilenameUtils.getExtension(originalFilename); // xxx.jpg // String extName = originalFilename.substring(originalFilename.lastIndexOf(".")+1); String filePath = FastDfsUtils.upload(file.getBytes(), extName) ; return AjaxResult.success(filePath);//Renvoyer le chemin téléchargé } catch (IOException e) { e.printStackTrace();
return AjaxResult.error(GlobalExceptionEnum.UPLOAD_ERROR.getCode(),GlobalExceptionEnum.UPLOAD_ERROR.getMessage());
}
}
/**
* Paramètre : chemin complet /goup1/xxxxx/yyyy
* Valeur de retour : succès ou non, et adresse de retour
* //Le frontal analogique envoie une requête pour appeler cette interface 1 : Supprimer http://localhost:8080/fastDfs//group1/M00/04/72/CgAIC2QetIuAVFPIAAgFDuhQH8Q183.gif - Non //Le frontal analogique envoie un demande d'appel de cette interface 2 :
Supprimer http ://localhost:8080/fastDfs?path=/group1/M00/04/72/CgAIC2QetIuAVFPIAAgFDuhQH8Q183.gif - en utilisant
*/
@DeleteMapping()
public AjaxResult del (@RequestParam(required = true , value = "chemin") Chemin de chaîne ){ String pathTmp = path.substring(1); // goup1/xxxxx/yyyy String groupName = pathTmp.substring(0, pathTmp.indexOf("/")); //goup1
String remotePath = pathTmp.substring(pathTmp.indexOf("/")+1);// /xxxxx/yyyy
FastDfsUtils.delete(groupName, remotePath);
return AjaxResult.success(chemin);
}
}
4. Vue frontale et elementui
1. Introduction du composant elementui
<el-form-item label="resources" prop="resources">
<!--<el-input v-model="editForm.resources" auto-complete="off"></el-input>-- >
<el-upload
class="upload-demo"
action="http://localhost:8080/fastDfs"
:on-remove="handleRemove"
:on-success="handleSuccess"
:file-list="fileList"
liste -type="picture">
<el-button size="small" type="primary">Cliquez pour télécharger</el-button>
<div slot="tip" class="el-upload__tip">Télécharger uniquement jpg/ png et pas plus de 500 Ko</div>
</el-upload>
</el-form-item>
2. Comment télécharger et supprimer des photos
handleSuccess(response, file, fileList) { //1. Tant que l'attribut d'action est écrit correctement, il peut être téléchargé //Traitement des ressources if(this.editForm.resources){//Il existe une valeur this.editForm. resources = this.editForm .resources+","+response.data; }else{ this.editForm.resources = réponse.data; } //Traitement fileList:resources = xx,xx,xx this.fileList=[];// Videz d'abord - puis ajoutez Les dernières photos de tous les animaux if(this.editForm.resources){ let arr = this.editForm.resources.split(",");//[xx,xx,xx] for(var i = 0;i<arr .length;i++){ this.fileList.push({"url":"Adresse enregistrée à distance"+arr[i]}); } } } ,
handleRemove(file, fileList) { //1. Appelez l'interface de suppression pour supprimer les données dans fastdfs : var url = file.url;// var path = url.substring(url.indexOf("/group"));/ / / group1/M00/00/0C/CgAIC2KrU4qAAy6HAAF5fdD2FCI828.jpg this.$http.delete("/fastDfs?path="+path).then(res=>{ if(res.data.success){ this.$message .success ("Supprimer avec succès !!!"); }else{ this.$message.success("Échec de la suppression !!!"); } }) //2. Traiter les ressources if(this.editForm.resources){ / / xx ,yy,zz let arr = this.editForm.resources.split(","); //[xx,yy,zz] for(var i = 0;i<arr.length;i++){ if(path == arr[i]){//trouvé l'image supprimée arr.splice(i,1); break; } } //[xx,zz]
this.editForm.resources = arr.join(","); //xx,zz
console.log(this.editForm.resources)
}
//3. Traitement fileList
this.fileList=[];//Vide d'abord - puis Ajouter le dernier
if(this.editForm.resources){ let arr = this.editForm.resources.split(","); //[xx,xx,xx] for(var i = 0;i<arr.length; i++ ){ this.fileList.push({"url":"Adresse enregistrée à distance"+arr[i]}); } } },