Écrivant une version Java de l'album Cloud Simple, les fonctions implémentées sont:
Les utilisateurs peuvent en télécharger un sur plusieurs fichiers à la fois.
Les utilisateurs peuvent télécharger des photos téléchargées par d'autres.
Les utilisateurs peuvent afficher des photos de tout le monde.
Les utilisateurs ne peuvent supprimer que des images téléchargées via leur propre IP.
Techniques utilisées:
Téléchargement et téléchargement de fichiers, mode de conception, DOM4J, XPATH, etc.
Regardons les deux pages suivantes:
Code source:
web.xml:
<? xml version = "1.0" encoding = "utf-8"?> <web-app version = "3.0" xmlns = "http://java.sun.com/xml/ns/javaee" xmlns: xsi = "http://www.w3.org/2001/xmlschema-ristance" XSI: ScheMalation = "http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"> <splay-name> </ stadelname> <servlet> <Servlet-Name> uploadservlet </ serplet-name> <Serplet-Class> CN.hncu.serservlets.uploadservlet </vrlett-class> </vrlet> <Serplet> <Serplet-Name> CloudphotoServlet </vrlet-name> <servlet-class> cn.hncu.servlets.cloudphotoservlet </servlet-Class> </servlet> <servlet> </servlet-name> Class> </servlet> <frlet> <servlet-class>cn.hncu.servlets.DownServlet</servlet-class> </servlet> <servlet> <servlet-name>DelServlet</servlet-name> <servlet-class>cn.hncu.servlets.DelServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>UploadServlet</servlet-name> <URL-PATTERN> / Téléchargez </ url-Pattern> </ Servlet-Mapping> <Servlet-Mapping> <Serplet-Name> CloudPhotoServlet </ Servlet-Name> <Url-Pattern> / CloudPhoto </url-Pattern> </ Servlet-Mapping> <Servlet-Mapping> <Serplet-Mapping> <ServLet-name> DownServlet> </ Servlet-Name> <URL-Pattern> / Servlet / Downservlet </ url-Pattern> </ Servlet-Mapping> <Serplet-Mapping> <Servlet-Name> DELSERVLET </ Servlet-Name> <Url-Pattern> / Servlet / Delservlet </rll-Pattern> </vreentlet-Mapping> <Deen welcome-File> <Welcome-file> INDEX.JP </ Welcome-File-list> </ web-app>
index.jsp:
<% @ Page Language = "Java" Import = "Java.util. *" Pageencoding = "UTF-8"%> <! DocType Html public "- // w3c // dtd html 4.01 transitional // en"> <html> input.parerentelement.parerentelement.pare-ParentElement; // Table.NodeName TBODY Table.RemoveChild (Input.Parerentelement.Pare-ParentElement); } var t = 1; fonction addFile (input) {tr = input.parerentelement.pare-centeilment; //alert(tr.nodeName); var str = "<td> sélectionnez le fichier: </td>" + "<td> <entrée type = 'file' name = 'file" + t + "'> </td>" + "<td> Description du fichier: </td>" + "<Td> <entrée = 'text' name = 'text" + t + "'> </td>" + "<td> <put-type = 'bouton' bouth = 'bouth =' File onClick = 'Delfile (this)'> </td> "; tr.insertAdjacentHtml ("avantbegin", str); } fonction move () {window.location.href = "/ myphoto / cloudphoto"; } </ script> <style type = "text / css"> #font {couleur: rouge; } </ style> </ head> <body> <h1> <font id = "font"> Album upload: </font> </h1> <form action = "/ myphoto / upload" metheth = "post" encType = "multipart / form-data"> <table <td> Description du fichier: </td> <td> <input type = "text" name = "text1"> </td> <td> <input type = "Button" value = "Delete File" onClick = "Delfile (this)"> </td> </ tr> <tr> <td ColSpan = 2> <puty Type = "Soumider" Value = "Upload Fichier"> <TD> type = "Button" value = "add file" onClick = "addFile (this)"> </td> </tr> </s table> </ form> <form action = "/ Myphoto / CloudPhoto" Method = "Post" EncType = "multipart / form-data"> <table onClick = "move ()"> </td> </tr> </ table> </ form> </ body> </html>Photo.xml:
<? xml version = "1.0" Encoding = "UTF-8"?> </ Photos> </ Photos>
Myutils.java:
package cn.hncu.utils; import java.text.simpledateformat; import java.util.date; import java.util.uuid; public class myutils {/ ** * @return get uuid * / public static string genting () {return uuid.randoUUid (). tostring (). } / ** * @param UUID * @return Obtenez le chemin cassé via UUID * / public static String getDir (String UUID) {String dir1 = Integer.tohexString (uUid.hashCode () & 0xf); String dir2 = Integer.tohexString ((uUid.hashcode () & 0xf0) >> 4); return "/" + dir1 + "/" + dir2; } // Format de date-temps privé statique SimpledateFormat sdf = new SimpledateFormat ("Yyyyy Year MM mois DD DAT HH: MM: SS"); / ** * @return renvoie la date et l'heure à la téléchargement * / String statique public getCurrentDatetime () {return sdf.format (new Date ()); }}Dom4jfactory.java:
Package Cn.hncu.utils; import java.io.fileInputStream; import java.io.filenotfoundException; import java.io.fileOutStream; import java.io.ioexception; import java.io.unsuppordedencodingException; import org.dom4j.Document; import org.DoDoDoCumentException; importation; org.dom4j.element; import org.dom4j.node; import org.dom4j.io.saxreader; import org.dom4j.io.xmlwriter; classe publique Dom4jfactory {document statique privé Dom = null; Path de chaîne statique privé; // Bloc statique! Ne fonctionnera qu'une seule fois! La fonctionnalité est que lorsque la classe est chargée, statique {try {saxReader sax = new saxReader () est exécutée; // Parce que nos ressources ont été publiées de Myelipse au serveur Tomcat, elle est différente du projet Java pur d'origine. // Utilisez la classe actuelle pour trouver son chargeur de classe, puis obtenez le chemin de ressource via le chargeur de classe. path = dom4jfactory.class.getClassloadher (). getResource ("photo.xml"). getPath (); // getClassLoader () Renvoie: Chargement du chargeur de classe de la classe ou de l'interface représentée par cet objet // URL public getResource (nom de chaîne) Renvoie: la lecture de l'objet URL de la ressource; Si la ressource ne peut être trouvée ou si l'appelant n'a pas suffisamment d'autorisation pour obtenir la ressource, renvoyez NULL. // Cette méthode recherche d'abord le chargeur de classe parent de la ressource; Si le chargeur de classe parent est nul, le chemin de recherche est le chemin du chemin du chargeur de classe intégré de la machine virtuelle. // public String getPath () obtient la partie de la trajectoire de cette URL. System.out.println (chemin); dom = sax.read (new FileInputStream (path)); } catch (filenotfoundException e) {lancer une nouvelle RuntimeException (e); } catch (documentException e) {lancez new RuntimeException (e); }} / ** * @return Obtenez le document de l'album * / document statique public getDocument () {return Dom; } / ** * Enregistrer Photo.xml et enregistrer sur local * / public static boolean Save () {try {xmlwriter w = new xmlwriter (new FileOutputStream (path)); W.Write (DOM); w.close (); Retour Vrai; } catch (UnportEnCcodingException e) {return false; } catch (filenotfoundException e) {return false; } catch (ioException e) {return false; }} public static boolean del (String UUID) {node node = dom.selectsingLenode ("[@ uuid = '" + uuid + "']"); if (node == null) {return false; } node.getParent (). retire (nœud); Retour Vrai; } / ** * test * @param args * / public static void main (String [] args) {System.out.println (getDocument ()); }}Photomodel.java - objet de valeur
Package CN.hncu.domain; / ** * Value Object Encapsulation * @author Chen Haoxiang * 2016-7-24 * / public class photomodel {private String uuid; // uUid private String realName = ""; // le nom de fichier réel de l'image (nom de fichier lorsque la chaîne de la chaîne de la mise en charge; Fichier Private String ip; // La chaîne privée IP du Uploader desc; // le fichier Description publique String getUUID () {return uUid; } public void setuuid (String UUID) {this.uuid = uuid; } public String getRealName () {return realName; } public void setRealName (String realName) {this.realName = realName; } public String getext () {return ext; } public void sext (string ext) {this.ext = ext; } public String getDir () {return dir; } public void setDir (string dir) {this.dir = dir; } public String getDateTime () {return DateTime; } public void SetDateTime (String DateTime) {this.dateTime = DateTime; } public String getIP () {return ip; } public void setIP (String ip) {this.ip = ip; } public String getDesc () {return desc; } public void setDesc (String desc) {this.desc = desc; } @Override public String toString () {return "photomodel [uuid =" + uuid + ", realname =" + realname + ", ext =" + ext + ", dir =" + dir + ", dateTime =" + DateTime + ", ip =" + ip + ", desc =" + desc + "]";; }}Photodao.java:
package cn.hncu.photodao.dao; import java.util.list; import Cn.hncu.domain.photomodel; interface publique Photodao {/ ** * @param photo * @return data * / public boolean Save (Photomodel Photo); / ** * @return Renvoie toutes les informations de l'image * / Liste publique <Comodel> getall (); / ** * @param uuid * @return Trouver l'objet de valeur encapsulé via uUID * / public photomodel getSingleByUUID (String UUID); / ** * @param uuid * @return Supprimer les informations de l'image dans Photos.xml via UUID * / public boolean Deletexml (String UUID); / ** * @param dir * @return Supprimer les informations de l'image dans le disque du serveur via le chemin * / public boolean DeleteFile (String PathFileName);}PhotosERImpl.java:
package cn.hncu.photodao.impl; import java.io.file; import java.util.arraylist; import java.util.iterator; import java.util.list; import org.dom4j.document; import org.dom4j.element; import org.dom4j.node; import Cn.hhncU.Domain.photoMoDel; import; cn.hncu.photodao.dao.photodao; Importer cn.hncu.utils.dom4jfactory; classe publique PhotoSerimpl implémente Photodao {@Override public boolean Save (PhotoModel Photo) {document Dom = Dom4jfactory.getDocument (); Élément root = dom.getrootelement (); // Ajouter l'élément d'attribut p = root.addelement ("photo"); P.AddAttribute ("UUID", photo.getUuid ()); P.AdDattribute ("RealName", photo.GetRealName ()); P.AdDattribute ("DateTime", photo.GetDateTime ()); p.AdDattTribute ("ip", photo.getIp ()); P.AdDattribute ("ext", photo.getExt ()); P.AddAttribute ("dir", photo.getDir ()); P.AddAttribute ("desc", photo.getDesc ()); return Dom4jfactory.save (); } @Override Public List <Motomodel> getAll () {list <gomodel> list = new ArrayList <Gomodel> (); Document Dom = dom4jfactory.getDocument (); Élément root = dom.getrootelement (); Iterator <element> it = root.elementIterator ("photo"); // Obtenez l'itérateur de l'élément photo via DOM4J, et vous pouvez également trouver toutes les photos via xpath // list <Node> lists = dom.selectNodes ("// photo [@uuid]"); // iterator <Node> it = listS.Itator (); while (it.hasnext ()) {élément e = it.next (); Photomodel Photo = nouveau photomodel (); Photo.SetUUID (e.AttributeValue ("UUID")); Photo.SetRealName (e.AttributeValue ("RealName")); Photo.SetDateTime (e.AttributeValue ("DateTime")); Photo.SeText (E.AttributeValue ("ext")); Photo.setip (E.AttributeValue ("IP")); Photo.setDir (e.AttributeValue ("dir")); Photo.setDesc (e.AttributeValue ("desc")); list.add (photo); } Retour List; } @Override public photomodel getSingleByUUID (String UUID) {list <gomodel> photos = getall (); pour (Photomodel Photo: Photos) {if (photo.getUUID (). equals (uuid)) {return Photo; }} return null; } @Override public boolean Deletexml (String UUID) {document Dom = dom4jfactory.getDocument (); Élément e = (élément) dom.selectSingLenode ("// Photo [@Uuid = '" + uuid.trim () + "']"); return e.getParent (). retirer (e); } @Override public boolean DeleteFile (String pathFileName) {try {file file = new File (pathFileName); if (file.exists ()) {file.delete (); } return true; } catch (exception e) {return false; }}}Photodaofactory.java:
package cn.hncu.photodao.factory; import Cn.hncu.photodao.impl.photoserimpl; / ** * Méthode d'usine * @author chen haoxiang * 2016-7-24 * / public class Photodaofactory {public static Photoserimplt getphotodao () {return new PhotoseriMpl ();); }}UploadServlet.java:
Package CN.HNCU.Servlets; Import Java.io.file; import java.io.ioexception; import java.io.printwriter; import java.util.list; importer javax.servlet.servletException; import javax.servlet.http.httpservlet; import javax.servlet.http.http. javax.servlet.http.httpservletResponse; import org.apache.commons.fileupload.fileitem; import org.apache.commons.fileupload.disk.diskfileitemfactory; org.apache.commons.fileupload.servlet.servletfileupload; import Cn.hncu.domain.photomodel; import Cn.hncu.photodao.dao.photodao; cn.hncu.utils.myutils; public class uploadServlet étend httpservlet {public void doget (httpservletRequest request, httpservletResponse réponse) lève ServletException, ioexception {réponse.SetContentType ("text / html; charset = utf-8"); réponse.getWriter (). print ("<h1> Désolé, cette page ne prend pas en charge l'accès !!! </h1>"); réponse.getwriter (). print ("<a href = 'javascript: history.go (-1)'> revenez à la page précédente </a>"); } public void doPost (requête HttpServletRequest, réponse httpservletResponse) lève ServletException, ioException {réponse.setContentType ("text / html; charset = utf-8"); Printwriter final out = réponse.getWriter (); // Anti-Black-Non-Multipart Form Remise // Utilisez Téléchargez Tool Boolean Boo = ServletFileUpload.ismulTipartContent (demande); if (! boo) {out.print ("<h1> ne prend pas en charge la méthode de soumission des formulaires ordinaires! </h1>"); retour; } Fichier file = new File ("d: / photocache"); if (! file.exists ()) {file.mkdir (); } DiskfileItemfactory fifactory = new DiskFileItemFactory (1024 * 10, fichier); ServletFileUpload upload = new ServletFileUpload (Fifactory); upload.setheDereencoding ("utf-8"); // définir le nom de fichier Encoding String path = getServletContext (). getRealPath ("/ Photos"); FileItem fi = null; essayez {list <FeleItem> list = upload.parsErequest (request); Photomodel Photo = Nouveau photomodel (); // Encapsulation de données --- 7 propriétés sont requises Photo.SetRealName (""); int cont = 0; for (fileItem f: list) {if (cont! = 0 && cont% 2 == 0 &&! Photo.getRealName (). Equals ("")) {Photo = new Photomodel (); // re-data Encapsulation} fi = f; if (fi.isformfield ()) {// composant de formulaire normal // get file Description String desc = fi.getString ("utf-8"); Photo.setDesc (desc); // # 1} else {// anti-Black 3-si le fichier n'est pas sélectionné dans le composant de fichier if (fi.getSize () == 0) {Photo.SetRealName (""); cont ++; continuer; } String filename = fi.getName (); filename = filename.substring (filename.lastIndexof ("//") + 1); // nom de fichier vrai photo.SetRealName (fileName); // # 2 string ext = filename.substring (filename.lastIndexof (".")); // extension Photo.sext (ext); // # 3 3. Photo.SetDateTime (myutils.getCurrentDateTime ()); // # 4 Photo.SetIP (request.getReMoteadDr ()); // # 5 String UUID = myutils.getUUID (); Photo.SetUUID (UUID); // # 6 Photo.setDir (myutils.getdir (UUID)); // # 7 // perturber le fichier du répertoire dfile = nouveau fichier (path + photo.getdir ()); if (! dfile.exists ()) {dfile.mkdir (); } fi.write (nouveau fichier (path + photo.getdir () + "/" + photo.getUuid () + photo.getExt ())); } cont ++; if (cont% 2 == 0 &&! Photo.getRealName (). equals ("")) {Photodao dao = photodaofactory.getPhotoDao (); boo = dao.save (photo); // Enregistrer sur le disque - Méthode 2: FileUtils.copyInputStreamtoFile (IN, nouveau fichier (filename2)); // ※ 2 ※ stockant le fichier image sur le disque dur du serveur photo = new Photomodel (); // Reencapsulation}}} catch (fileUpLaDexception e) {e.printStackTrace (); } catch (exception e) {e.printStackTrace (); } enfin {if (fi! = null) {fi.delete (); } if (dom4jfactory.save ()) {out.print ("<h1> téléchargé avec succès! </h1>"); out.print ("<a href = 'javaScript: history.go (-1)'> revenez à la page précédente </a>"); } else {out.print ("<h1> a échoué! </h1>"); out.print ("<a href = 'javaScript: history.go (-1)'> revenez à la page précédente </a>"); }}}}Afficher tous les fichiers -cloudphotoservlet.java
package cn.hncu.servlets; import java.io.ioexception; import java.io.printwriter; import java.util.list; import javax.servlet.servletException; import javax.servlet.http.httpservlet; import javax.servlet.http.http.httpleservlet; import; javax.servlet.http.httpservletResponse; import Cn.hncu.domain.photomodel; import Cn.hncu.photodao.dao.photodao; Import Cn.hncu.photodao.factory.photodaofactory; public class CloudPhotoSerd extend httpsservlet {public voids DOGT (HttpServLetRequest Request, HttpServletResponse Response) lève Servlexception, ioException {String pwd = (String) request.getParameter ("pwd"); if ("chx" .equals (pwd)) {doPost (request, réponse); } else {réponse.setContentType ("text / html; charset = utf-8"); réponse.getWriter (). print ("<h1> désolé, vous n'avez pas la permission d'accès !!! </h1>"); }} public void doPost (httpsservletRequest request, httpservletResponse réponse) lève ServletException, ioException {réponse.setContentType ("text / html; charset = utf-8"); Printwriter out = réponse.getWriter (); out.println ("<! doctype html public /" - // w3c // dtd html 4.01 transitional // en / ">"); out.println ("<html>"); Out.println ("<A-Head> <Title> Chx Cloud Album </Title> </Ead>"); out.println ("<porce>"); out.println ("<Table Border = '1Px; double; # ff0000'>"); out.println ("<tr>"); out.println ("<tr>"); out.println ("<td> nom de fichier </td>"); out.println ("<td> Téléchargement du temps"); out.println ("<td> fichier </td>"); out.println ("<td> Description du fichier </td>"); out.println ("<td> opération </td>"); out.println ("</tr>"); String tdwh = "style = 'width: 200px; hauteur: 200px;'"; // Affiche toutes les images Photodao dao = Photodaofactory.getPhotoDao (); List <photomodel> photos = dao.getall (); pour (Photomodel Photo: Photos) {String FileName = Photo.getRealName (); String time = photo.getDateTime (); // PATURE DE SORTIE PATH PATH = request.getContextPath () + "/ Photos /" + Photo.getDir () + "/" + Photo.getUuid () + Photo.getExt (); // System.out.println (chemin); //! String desc = Photo.getDesc (); String delstr = "<a href = '/ myphoto / servlet / delservlet? Uuid =" + photo.getUuid () + "'> delete </a>"; String downstr = "<a href = '/ myphoto / servlet / downservlet? Uuid =" + photo.getUuid () + "'> télécharger </a>"; out.println ("<td" + tdwh + ">" + nom de fichier + "</td>"); out.println ("<td" + tdwh + ">" + time + "</td>"); out.println ("<td" + tdwh + ">" + img + "</td>"); out.println ("<td" + tdwh + ">" + desc + "</td>"); out.println ("<td" + tdwh + ">" + delstr + "" + downstr + "</td>"); out.println ("</tr>"); } out.println ("<tr>"); out.println ("</tr>"); out.println ("</pally>"); out.println ("</body>"); out.println ("</html>"); out.flush (); out.close (); }}Supprimer le fichier - delservlet.java
Package Cn.hncu.servlets; Importer java.io.ioException; import java.io.printwriter; import javax.servlet.servletException; import javax.servlet.http.httpservlet; import javax.servlet.http.httpservletRequest; Importer Javax.servlet.http. Javax.servlet.http.httpservletResponse; import Cn.hncu.domain.photomodel; import Cn.hncu.photodao.factory.photodao; Photodaofactory.getPhotoDao (); public void doGet (demande httpservletRequest, réponse httpservletResponse) lève ServletException, ioException {doPost (request, réponse); } public void doPost (request httpServLetRequest, httpsservletResponse réponse) lève Servlexception, ioException {String uuid = request.getParameter ("uUID"); String ip = request.getReMoteaddr (); Response.SetContentType ("Text / HTML; charSet = UTF-8"); Printwriter out = réponse.getWriter (); Photomodel Photo = dao.getSingleByUUID (UUID); if (Photo! = null) {if (! Photo.getIp (). equals (ip)) {out.print ("<h1> Vous n'avez pas la permission de supprimer ce fichier!!! </h1>"); out.print ("<a href = 'javaScript: history.go (-1)'> revenez à la page précédente </a>"); retour ; } // 1. Supprimer des informations dans la base de données boolean boo = dao.deletexml (UUID); if (boo) {string filename = "Photos /" + Photo.getDir () + "/" + Photo.getUuid () + Photo.getExt (); String pathFileName = getServletContext (). GetRealPath (filename); if (dao.deleteFile (pathFileName)) {// rediriger vers la page de l'album Response.SenDredirect ("/ myphoto / cloudphoto? pwd = chx"); } else {out.print ("<h1> ne peut pas être supprimé du serveur, le fichier est occupé !!! </h1>"); out.print ("<a href = 'javascript: history.go (-1)'> revenez à la page précédente </a>"); }} else {out.print ("<h1> Le fichier n'existe plus !!! </h1>"); out.print ("<a href = 'javascript: history.go (-1)'> revenez à la page précédente </a>"); }}}}Télécharger le fichier -downservlet.java
Package CN.hncu.servlets; import java.io.fileInputStream; import java.io.ioexception; import java.io.inputstream; import java.io.outputstream; import java.net.urlencoder; Javax.servlet.http.httpservletRequest; Importer javax.servlet.http.httpservletResponse; import Cn.hncu.daain.photomodel; import Cn.hncu.photodao.dao.photodao; Import Cn.hncu.Photodao.factory.photodao; Downservlet étend httpServlet {private Photodao dao = Photodaofactory.getPhotoDao (); public void doGet (demande httpservletRequest, réponse httpservletResponse) lève ServletException, ioException {doPost (request, réponse); } public void doPost (request httpServLetRequest, httpsservletResponse réponse) lève Servlexception, ioException {String uuid = request.getParameter ("uUID"); System.out.println (UUID); Photomodel Photo = dao.getSingleByUUID (UUID); System.out.println (photo); if (Photo! = null) {// Définissez l'en-tête de réponse - récepteur de contenu - lorsque le navigateur voit cet en-tête de réponse, il ouvrira le programme de téléchargement qu'il pense être // (si le tonnerre est reconnu, Thunder s'ouvrira automatiquement, sinon, un fichier de disque de dialogue sera ouvert); String realName = Photo.getRealName (); String agent = request.getheader ("user-agent"); System.out.println (agent); if (agent.indexof ("Mozilla")! = - 1) {// Firefox Browser Response.sethEader ("Content-Disposition", "attachement; filename =" + new String (realName.getBytes ("gb2312"), "iso-8859-1"); } else {// Résolvez le problème des chinois broulés (utilisez simplement la phrase suivante pour coder le nom du fichier) realName = urlencoder.encode (realName, "utf-8"); // Utilisez le mécanisme de codage spécifié pour convertir la chaîne en format d'application / x-www-forform-urlencod. Response.sethEader ("Content-Disposition", "Pixe; FileName = /" "+ RealName +" / ""); // Remarque: "Cttachment;" Impossible de manquer, sinon le navigateur s'ouvrira directement dans une nouvelle fenêtre} String filename = "Photos /" + Photo.getDir () + "/" + Photo.getUuid () + Photo.getExt (); String pathFileName = getServletContext (). GetRealPath (filename); InputStream dans = new FileInputStream (pathFileName); OutputStream out = réponse.getOutputStream (); octet buf [] = nouveau octet [2048]; int len = 0; while ((len = in.read (buf))! = - 1) {out.write (buf, 0, len); } out.close (); joindre(); } else {réponse.setContentType ("text / html; charset = utf-8"); réponse.getWriter (). println ("<h1> Ce fichier a été supprimé </h1>"); }}}Résultats de la démonstration
Je ne le démontrerai pas, il y a des photos devant elle, et j'ai donné tous les codes source. Si vous êtes intéressé, vous pouvez apporter des améliorations par vous-même.
En fait, cela peut également télécharger tout autre type de fichiers, car nous n'avons pas de nom de suffixe protecteur, et nous utilisons le streaming de caractères pour le transmettre, et il ne sera pas déformé (il peut être traité comme un disque de nuage ~~)! !
Ce qui précède est tout le contenu de cet article. J'espère que cela sera utile à l'apprentissage de tous et j'espère que tout le monde soutiendra davantage Wulin.com.