En el desarrollo del sistema de aplicaciones web, la función de carga y descarga del archivo del archivo se usa muy comúnmente hoy.
Para la carga de archivos, el navegador envía el archivo al lado del servidor durante la carga del navegador. problemático, por lo que generalmente elige usar Apache's Apache's de la herramienta de código abierto. Este paquete JAR de componente de carga común se puede descargar en el sitio web oficial de Apache, o puede encontrarlo en la carpeta LIB Struts. Common-FileUpload depende del paquete Common-IO, por lo que debe descargar este paquete.
1. Construcción del entorno de desarrollo
Cree un proyecto FileUploadandDownload, agregue el archivo Apache Commons-FileUpload para cargar el paquete jar relacionado del componente, como se muestra en la figura a continuación:
2. Implementar la carga de archivos
2.1, página de carga de archivo y página de mensaje de mensaje
El código de la página upload.jsp es el siguiente:
<%@ page lenguaje = "java" pageEncoding = "utf-8"%> <! }/Servlet/uploadHandleServlet "enctype =" multipart/form-data "método =" post "> Úser de carga: <input type =" text "name =" username "> <br/> archivo de carga 1: <input type =" Archivo "name =" file1 "> <br/> archivo de carga 2: <input type =" file "name =" file2 "> <br/> <input type =" shit "value =" valor = "enviar" <// Forma> </body> </html>
El código de Message.jsp es el siguiente:
<%@ page lenguaje = "Java" PageEncoding = "UTF-8"%> <!
2.2, maneje el servicio cargado por el archivo
El código de la carga de carga es el siguiente:
paquete me.gacl.web.controller; ; termina httpservlet {Public OID DOGET (httpservletRequest request, httpservletResponse Response) Throws ServLetexception, IOEXCEPTION {// Wet the preservation directory of the uploaded file, and store the uploaded files In the web-inf directory, it is not allowed to be accessed directly to ensure that Safe String savePath = this.getServletContext (). ) &&! "" "; intente {// use el archivo Apache para cargar los pasos de carga de archivo de procesamiento de componentes: // 1. Cree una fábrica de diskfileitemFactory diskfileiiItemFactory = newFileItem Factor (); // 2. Cree una carga de archivo el Parser ServletFileUpload upload = new ServletFileUpload (( Fábrica); 4. Utilice el analizador de servicio de servicio para analizar y cargar datos. item if (item.isformfield ())) {name de cadena = item. // value = new String (value.getBytes ("ISO8859-1"), "UTF -8"); encapsulado en el archivo, el nombre del archivo cargado, string filename = item.getName (); Continuar;} // NOTA: Los nombres de archivo enviados por diferentes navegadores son diferentes, algunos navegadores envían los nombres de archivo con rutas, como: c: /a/b/1.txt, y algunos son solo nombres de archivo simples, como : 1.txt // procesar en la ruta del nombre, solo la parte del nombre del archivo FileName = FileName.substring (FileName.lastIndexof ("//"); // Obtenga la secuencia de entrada en el archivo de carga en el elemento InputStream in = item.getInputStream ();//Crear una salida de archivo FileOutputStream Out = New FileOutputStream (SavePath + "//" + FileName); si los datos en el flujo de entrada han leído el logotipo terminado int len = 0; in)> 0) {// Escribe los datos del búfer en el directorio especificado (SavePath + "//" + FileName) usando la transmisión de salida FileOutputStream. cerrar (); ";}}} Catch (Exception e) {Message =" ¡Falló la carga de archivo! "; E.PrintStackTrace ();} request.setTtribute (" Mensaje ", mensaje); request.getRequestDisPatcher (" /Message.jsp ") .;} public void dopost (httpservletRequest solicitud, respuesta httpservletreSponse) tira servletException, iOexception (Solicitud, respuesta);}}
Registre la carga de carga de la carga en el archivo web.xml
<Servlet> <Servlet-name> uploadHandleServlet </servlet-name> <ervlet-class> me.gacl.web.controller.uploadleservlet </servlet-class> </servlet> <erv> letrajes> <servlet-name > uploadhandleservlet </servlet-name> <url-pattern>/servlet/uploadhandleservlet </url-patern> </servlet-mapping>
El efecto de ejecución es el siguiente:
Una vez que el archivo se carga correctamente, el archivo cargado se almacena en el directorio de carga en el directorio web-INF, como se muestra en la figura a continuación:
2.3.
Aunque el código anterior se puede cargar correctamente en el directorio designado en el servidor, hay muchos pequeños detalles que necesitan atención a la función de carga de archivos.
1. Para garantizar la seguridad del servidor, el archivo de carga debe colocarse en el directorio al que el mundo exterior no puede acceder directamente, como en el directorio web-INF.
2. Para evitar la cobertura del archivo, es necesario generar un nombre de archivo único para cargar archivos.
3. Para evitar demasiados archivos en un directorio, use el algoritmo hash para dispersar el almacenamiento.
4. Limite el valor máximo de los archivos de carga.
5. Es necesario limitar el tipo de archivos de carga.
En respuesta a los 5 detalles de los anteriores, mejoremos el UploadHandleServlet.
paquete me.gacl.web.controller; Import javax.servlet.servletException; .apache.commons.fileUppload.ProgressListener; @Author: Disponibilidad Wolf * @Date: 2015-1-3 PM 11:35:50 * */ Public Class Sobre Ej. El directorio de los archivos de carga se almacena en el directorio de Web-INF. La carga guarda la cadena de directorio testH = this.getServletContext (). Mensaje de mensaje Mensaje = "" "" ""; El búfer de la fábrica. Factory.setsizethreshold (1024*100); // 2. Cree un archivo para cargar el servicio de analizador PatserFileUpload upload = new ServiceFileUpload (fábrica); {System.处理: 7367 El tamaño del archivo es: 14608, el procesamiento actual: 11419 El tamaño del archivo es: 14608, actualmente procesado: 14608 */}}); -8 "); // 3. Determine si los datos enviados son los datos if (! ServletFileUpload.IsmultipartCont (request)) {// Obtenga el retorno de datos de manera tradicional; 1024*1024 bytes, es decir, 1MB upload.setFilesEmAx (1024*1024); 、使用 ServletFileUpload 解析器解析上传数据 , 解析结果返回的是一个 List <StilEitem> 集合 每一个 每一个 FileItem 对应一个 Formulario 表单的输入项 List <FileItem> List = upload.Parserequest (solicitud); ) {// Si está encapsulado en el FileItem, los datos de los elementos de entrada ordinarios son (itemFormfield)) {string name = item.getFieldName (). Valor de cadena = item.getString ("UTF-8"); + valor);} else {// Si el nombre de archivo está cargado por el archivo cargado en el archivo de archivo, string fileName = item.getName (); ") {Continuar;} // NOTA: Los nombres de archivo enviados por diferentes navegadores son diferentes, algunos archivos enviados por los navegadores El nombre es con la ruta, como: c: /a/b/1.txt, y algunos son solo Nombres de archivo simples, tales como: 1.txt // procesar el nombre del archivo del nombre del archivo del archivo cargado obtenido, solo conserva solo el nombre de archivo = filename.substring (filename.lastindexof ("//"); // Obtener la extensión de la cadena de archivo cargada fileExtName = FileName.substring (FileName.lastIndexOf ("..") +1); System.out.println ("La extensión del archivo cargado es:"+FileExtName); El archivo es String SaveFileName = MakeFileName (FileName); Nuevo byte [1024]; Indica que hay datos mientras ((len = in.read (buffer)) >> 0) {// Escribe los datos del búfer en el directorio especificado (SavePath + "//" + FileName) usando la transmisión de salida FileOutputSream . ";}}} Capt (fileuploadbase.filesizeLimitexCException e) {E.PrintStackTrace (); request.SetAttribute (" Mensaje "," Un solo archivo excede el valor máximo !!! ") .Forward (solicitud, respuesta); return;} catch (fileUploadbase.sizelimitExCeException e) {E.PrintStackTrace (); edad", "El tamaño total del archivo de carga está más allá del límite máximo!" "/Message.jsp"). "; E.PrintStackTrace ();} request.SetAttribute (" Mensaje ", mensaje); request.getRequestDisPatcher (" /Message.jsp "). Nombre del archivo de carga, el nombre del archivo es: uuid+"_"+nombre original del archivo* @anthor: el nombre original del lobo orgulloso solitario* @param archivo de nombre de archivo* @return uuid+"_"+el nombre original del archivo * /String private MakefileName (nombre de archivo de cadena) {//2.jpg // Para evitar la cobertura de archivos, es necesario generar un nombre de archivo único uUid.randomuuid (). * Para evitar demasiados archivos en un directorio, use el algoritmo hash para dispersar el almacenamiento * @method: makepath * @description: * @anthor: el nombre de archivo de archivo de nombre de archivo Wolf * @param disponible, de acuerdo con el nombre de almacenamiento de la generación del directorio de almacenamiento * @Param SavePath Ruta de almacenamiento de archivos* @return Directorio de almacenamiento nuevo*/private String MakePath (String FileName, String SavePath) {// El valor del Code hashcode del nombre del archivo es el objeto FileNam E -String en esta dirección de la memoria int hashcode = FileName.hashCode (); "//" + dir2; File.exist ()) {// Crea el directorio file.mkdirs ();} return dir;} public void dopost (httpservletRequest, httpservletreSponse respuesta) servletException, ioexception {doget (solicitud, respuesta);
Después de mejorar los 5 pequeños detalles anteriores recaudados, nuestra función de carga de archivos es más completa.
Tres, descargar archivos
3.1. Enumere los recursos de archivo para proporcionar descargas
Necesitamos proporcionar los recursos de archivo en el sistema de aplicaciones web al usuario para descargar. La operación de descarga se realiza.
El código de ListFileServlet es el siguiente:
paquete me.gacl.web.controller; ; -4 9:54:40 **/ Public Class ListFearServlet extiende httpservlet {public void doget (httpservletRequest request, httpservletResponse) ows servletException, ioException {// Obtener el directorio de la carga de la carga String uploadfilePath = this.getServletContext () .getRealpath ("" /Web-inf/upload "); // almacena el mapa del nombre del archivo <string, string> filenamEmap = new Hashmap <string, string> (); archivos y directorio, almacene el nombre del archivo del archivo en el archivo list (nuevo archivo (nuevo FilePILEPATH), FileNAmEmap); /Listfile.jsp "). ADELAR (solicitud, respuesta);}/*** @method: listfile* @Descripting: Traversal recursivo en el directorio especificado Todos los archivos* @anthor: el archivo Wolf* @param disponible significa un archivo, y también representa un directorio de archivos* @param Map de almacenamiento Nombre del archivo Map Collection*/ public void listFile (archivo de archivo, map <string, string> map) {// si el archivo no representa un archivo, sino un directorio if (! Archivo .ISfile ()) {// Enumere todos los archivos y directorio en los archivos de archivos de directorio [] = file.listFiles (); map);}} else {/*** Nombre del archivo de procesamiento, el archivo cargado se renombra en forma de nombre de archivo uuid_ para cambiar el nombre de UUID_ del archivo de archivo. La primera posición del carácter "_" apareció en la cadena de la cadena. ") +1 puede obtener un ventilador _ 达 达 .Avi Part*/String realName = file.getName () .substring (file.getName (). IndexOf (" _ ")+1); // file.getName () Obtiene el nombre original del archivo. );}}
Aquí hay una breve charla sobre el método de archivos de lista en ListFileservlet. Directorio del archivo a través del formulario de consulta. y almacenado, por lo que debe usarse para la recursión.
Configurar listFileServlet en el archivo web.xml
<Servlet> <Servlet-name> listFileservlet </servlet-name> <ervlet-class> me.gac l.web.controller.listfileServlet </servlet-class> </servlet mapping> <ervlet-name> listfileservlet <// Servlet-Name> <Url-Pattern>/Servlet/ListFileservlet </url-Pattern> </servlet-mapping>
La página ListFile.jsp del archivo de descarga es la siguiente: como sigue:
<%@ page lenguaje = "java" image = "java.util.*" PageEncoding = "utf-8"%> <%@ taglib prefix = "c" uri = "http://java.sun.com/jsp /jstl/core " %> <! Doctype html> <html> <lefe> <title> Descargar la página de visualización de archivos </title> </head> <body> <!-Recogida de mapas de mapas-> <c: foreach var = "Me" elementos = "$ {FileNamEmap}"> <c: url value = "/server/doubledServlet" var = "double"> <c: param name = "fileename =" $ {me.key} "> </ c: param> </c: url> $ {me.value} <a href = "$ {doublel}"> descargar </a> <br/> </c: foreach> </body> </html>
Visite ListFileServlet, puede mostrar los recursos del archivo proporcionados al usuario en la página ListFile.jsp, como se muestra en la figura a continuación ::
3.2.
Escriba un servlet para procesar archivos.
paquete me.gacl.web.controller; ; GetParameter ("FileName"); en el directorio/Web-Inf/Supe. Si el archivo no existe if (! Xists ()) {request.setAttribute ("Mensaje", "Los recursos que desea descargar se han eliminado!") Solicitud, respuesta); Code (RealName, "UTF-8"); .getputStream (); (buffer))> 0) {// El contenido del búfer de salida al navegador, implementa el archivo descargar out.write (buffer, 0, len);} // Cierre el flujo de entrada del archivo en.close (); / Cerrar la salida stream out.close ();}/ *** @method: findfilesavePathByFileName* @Description: busque la ruta del archivo al archivo que se descargará a través del nombre del archivo y el almacenamiento del directorio root de archivo* @anthor: E El nombre del archivo descargado* @param saverootpath cargue el directorio raíz guardado por el archivo, es decir, el directorio de almacenamiento de los archivos a descargar por/web-inf/subiendo directorio* @return al archivo de descarga que se descargará*/ Cadena pública FindFilesAppilename (String FileName, S Tring Saverootpath) {int hashcode = filename.hashcode (); Dir = saveroolpath + "//" + dir1 + "//" // "" + d ir2; )) {// Cree un directorio file.mkdirs ();} return dir;} public void oest solicitud, respuesta httpservlesponse) lanza ServletException, ioexception {doget (request, respuesta);}}
Configurar descargaServlet en el archivo web.xml
<Servlet> <Servlet-name> downloadServlet </servlet-name> <ervlet-class> me.g acl.web.controller.downloadServlet </servlet-class> </servlet> <servlet-map-map-map ping> <Servlet-name> downloadServlet </servlet-name> <url-pattern>/servlet/downloadServlet </url-Pattern> </servlet-mapping>
Haga clic en [Descargar] Hyperlink, envíe la solicitud a Descargar Descargarlo para procesarlo, puede descargar la descarga del archivo.
De los resultados de la operación, podemos ver que nuestra función de descarga de archivos ya puede descargar el archivo normalmente.
Este artículo ha sido compilado para "habilidades de operación de carga Java", bienvenida a todos para aprender y leer.
Hay tantos contenidos sobre la carga de archivos y la descarga de funciones en Javaweb.