Note d'étude 4: Téléchargement et téléchargement de fichiers

Téléchargement et téléchargement de fichiers

Lorsque vous surfez sur Internet, nous rencontrerons de nombreux cas de téléchargement et de téléchargement, tels que le téléchargement et le téléchargement d'images. Voyons ensuite comment le servlet implémente le chargement et le téléchargement.

Téléchargement de fichiers

Le téléchargement de fichier implique l'écriture de la page de premier plan et du code côté serveur d'arrière-plan, le premier plan envoie le fichier et l'arrière-plan accepte et enregistre le fichier. Il s'agit d'un téléchargement de fichier complet.

Page de garde:

Lors du téléchargement de fichiers, il y aura une interface pour le téléchargement des fichiers. Premièrement, un formulaire est requis et la méthode de demande est POST; deuxièmement, le type de formulaire du formulaire doit être défini sur "multipart / form-data" , c'est-à-dire enctype = "multipart / form-data" signifie définir le type du formulaire sur le formulaire de téléchargement de fichier. Par défaut, ce type de formulaire est "application / x-www-from-urlencoded" et ne peut pas être utilisé pour le téléchargement de fichiers. Ce n'est que lorsque les données multipart / form-data sont utilisées que le fichier de données peut être complètement transféré.

<form action="uploadServlet" method="post" enctype="multipart/form-data">
    姓名:<input type="text" name="uname">
    文件:<input type="file" name="myfile">
    <button>提交</button>
</form>

Mise en œuvre en arrière-plan:

Utilisez l'annotation @MultipartConfig pour identifier un servlet comme supportant le téléchargement de fichiers. Le servlet encapsule la demande POST multipart / form-data dans un objet Part et gère le fichier téléchargé via l'objet Part .

package com.xxxx.servlet;

import javax.servlet.ServletException;
import javax.servlet.annotation.MultipartConfig;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.Part;
import java.io.IOException;

@WebServlet("/uploadServlet")
@MultipartConfig  //如果是文件上传,必须要加这个注解 让这个Servlet支持文件上传
public class UploadServlet extends HttpServlet {
    
    

    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    

        System.out.println("文件上传...");

        //设置请求的编码格式
        request.setCharacterEncoding("utf-8");
        //获取普通表单项
        String uname = request.getParameter("uname");//参数为表单中表单元素的name属性值
        System.out.println("uname = " + uname);

        //获取part对象
        Part part = request.getPart("myfile");//参数为表单中file文件域的name属性值
        String fileName = part.getSubmittedFileName(); //获取提交过来的文件名
        System.out.println("filename = "+fileName);


        String filePath = request.getServletContext().getRealPath("/");//项目根目录
        System.out.println("filepath = "+filePath);
        //上传文件到指定目录(现在我们放在根目录下)
        part.write(filePath+"/"+fileName);

    }
}

Avant la version servlet3.0, vous devez utiliser le package jar tiers commons-fileupload pour télécharger des fichiers. Servlet3.0 et les versions ultérieures ont une API intégrée pour le téléchargement de fichiers. Pas de package jar tiers
servlet3.0 et supérieur. Enregistrer les fichiers téléchargés dans la pièce Dans l'exemple, l'objet de pièce correspondant peut être obtenu en fonction du nom du contrôle de formulaire téléchargé via l'objet de requête. En même temps, il prend également en charge plusieurs téléchargements de fichiers
. La partie gênante est d'obtenir le nom de fichier , car le fichier enregistré ne peut pas être enregistré avec le nom de fichier au moment du téléchargement. Comme nous craignons que de nombreuses personnes téléchargent le même nom de fichier et soient écrasés, il est généralement nécessaire de définir un nom de fichier aléatoire qui ne peut pas être répété. Nous pouvons utiliser UUID comme nom de fichier. Quant au nom du suffixe, il doit être obtenu en fonction du suffixe du fichier lors du téléchargement, partie L'objet lui-même ne stocke pas le nom du fichier téléchargé. Nous devons obtenir le nom du fichier à partir de les informations d'en-tête de la demande. Lorsque le navigateur envoie la demande de téléchargement de fichier, le nom du fichier est stocké dans Content-Disposition dans la tête de demande, mais Content-Disposition a une valeur. Outre les informations sur le nom de fichier, il existe d'autres informations, de sorte que l'extension de fichier ne peut être obtenue que par interception de chaîne.

Content-Disposition : form-data; nom = "fichier"; filename = "test.txt"

Le fichier est stocké dans le dossier de téléchargement sous le répertoire racine du projet actuel du serveur. Obtenez la valeur absolue du serveur via req.getServletContext (). GetRealPath (), puis écrivez le fichier téléchargé.

téléchargement de fichier

Le téléchargement de fichiers consiste à télécharger les ressources du serveur vers le client local. Il existe deux méthodes: la première consiste à télécharger via les caractéristiques du lien hypertexte lui-même et la seconde à télécharger via des opérations de code.
La plupart des téléchargements de fichiers du projet Web n'ont pas besoin d'écrire de code pour atteindre, seul le lien hypertexte peut être atteint, c'est-à-dire que via le lien hypertexte, écrivez le chemin du fichier dans l'adresse de connexion, le navigateur ouvrira automatiquement le fichier, s'il s'agit d'un texte normal, les images et autres navigateurs pouvant afficher directement le contenu peuvent être ouverts et affichés directement, mais s'il s'agit d'un fichier qui ne peut pas être ouvert par le navigateur, tel que rar, docx, exe, etc., puis le navigateur vous invitera à télécharger le fichier modifié ou à utiliser l'actuel Ouvrez le fichier avec l'outil fourni avec le système

Téléchargement du lien hypertexte :

Lorsque nous utilisons la balise a dans la page, nous espérons pouvoir sauter si nous le souhaitons, mais lorsque le lien hypertexte rencontre une ressource que le navigateur ne reconnaît pas, il sera également automatiquement téléchargé;
lorsqu'il rencontre une ressource que le navigateur peut directement afficher, le navigateur sera affiché par défaut, tel que txt, png, jpg, etc. Bien entendu, vous pouvez également spécifier le navigateur à télécharger via l' attribut de téléchargement . Mais certains navigateurs ne le prennent pas en charge.

<!-- 当超链接遇到不识别的资源时,会自动下载-->
<a href="test.zip">超链接下载</a>

Spécifiez l'attribut de téléchargement à télécharger:

<!--当超链接遇到浏览器识别的资源时,默认不会下载。通过download属性可进行强制下载-->
<a href="test.txt" download>超链接下载</a>

L'attribut de téléchargement n'a pas besoin d'écrire d'informations et le nom de fichier par défaut est automatiquement utilisé. Si la valeur de l'attribut de téléchargement est définie, la valeur définie est utilisée comme nom de fichier. Lorsque l'utilisateur clique sur le lien, il sera téléchargé directement.

Il est à noter que si vous souhaitez que le navigateur puisse accéder aux ressources du projet, vous devez configurer l'ajout de ressources externes dans Tomcat, comme suit:
Insérez la description de l'image ici

Téléchargez en arrière-plan :

Étapes de mise en œuvre:

  1. Vous devez utiliser la méthode response.setContentType pour définir la valeur du champ d'en-tête Content-Type sur un type MIME que le navigateur ne peut pas activer d'un programme d'une manière ou d'une autre à traiter, tel que "application / octet-stream" ou "application / x-msdownload ".
  2. La valeur de l'en-tête Content-Disposition doit être définie sur pièce jointe via la méthode response.setHeader; filename = nom de fichier
  3. Lisez le fichier téléchargé et appelez la méthode response.getOutputStream pour écrire le contenu de la pièce jointe sur le client.
@WebServlet("/downloadServlet")
public class DownloadServlet extends HttpServlet {
    
    
    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
        System.out.println("文件下载...");
        request.setCharacterEncoding("utf-8");
        response.setCharacterEncoding("utf-8");
        response.setContentType("text/html");

        String fileName = request.getParameter("fileName");
        //判空 是否输入文件名
        if (fileName == null || "".equals(fileName.trim())){
    
    
            response.getWriter().write("请输入要下载的文件名!");
            response.getWriter().close();
            return;
        }
        //获取download文件夹的绝对路径(也就是存放项目资源的路径)
        String realPath = request.getServletContext().getRealPath("/download/");//获取download文件夹的绝对路径
        //通过路径获得这个file对象
        File file = new File(realPath+fileName);
        //判断这个文件是否存在并且是一个标准文件
        if (file.exists() && file.isFile()){
    
    
            //设置响应类型 浏览器无法使用某种方式激活某个程序来处理的 MIME 类型
            response.setContentType("application/octet-stream");
            //设置响应头
            response.setHeader("Content-Disposition","attachment;filename="+fileName);
            //得到这个文件的输入流
            InputStream in = new FileInputStream(file);
            //得到字节输出流
            ServletOutputStream out = response.getOutputStream();
            //定义byte数组
            byte[] bytes = new byte[1024];
            //定义长度
            int len = 0;
            //循环读取
            while((len = in.read(bytes)) != -1){
    
    
                out.write(bytes,0,len);
            }
            out.flush();
            out.close();
            in.close();

        }else{
    
    
            response.getWriter().write("文件不存在,请重试!");
            response.getWriter().close();
        }
    }
}

Lien de connaissance :

Content-disposition est une extension du protocole MIME, qui indique à l'agent utilisateur MIME comment afficher les fichiers joints. Lorsque Internet Explorer reçoit l'en-tête, il active la boîte de dialogue de téléchargement de fichier et sa zone de nom de fichier est automatiquement remplie avec le nom de fichier spécifié dans l'en-tête. (Veuillez noter que c'est par conception; cette fonction ne peut pas être utilisée pour enregistrer des documents sur l'ordinateur de l'utilisateur sans demander à l'utilisateur l'emplacement d'enregistrement.)

Lorsque le serveur envoie un fichier au navigateur client, s'il s'agit d'un type de fichier pris en charge par le navigateur, il sera généralement ouvert par le navigateur par défaut, tel que txt, jpg, etc., qui sera affiché directement dans le navigateur . Si vous devez inviter l'utilisateur à enregistrer, vous devez Pour utiliser Content-Disposition pour le traitement, la clé est d'ajouter une pièce jointe:

Response.AppendHeader («Content-Disposition», «attachment; filename = FileName.txt»);

Remarque: De cette façon, le navigateur vous demandera d'enregistrer ou d'ouvrir, même si vous choisissez d'ouvrir, il utilisera le programme associé tel que le Bloc-notes pour l'ouvrir directement au lieu d'IE.

Je suppose que tu aimes

Origine blog.csdn.net/qq_40492885/article/details/115265405
conseillé
Classement