Servlets: carga de archivos
Se puede utilizar un servlet con una etiqueta de formulario HTML para permitir que los usuarios carguen archivos en el servidor. Un archivo cargado puede ser un archivo de texto o un archivo de imagen o cualquier documento.
Crear un formulario de carga de archivos
El siguiente código HTM a continuación crea un formulario de carga. Los siguientes son los puntos importantes que se deben anotar:
La forma method el atributo debe establecerse en POST El método y el método GET no se pueden utilizar
La forma enctype el atributo debe establecerse en multipart/form-data.
La forma actionEl atributo debe establecerse en un archivo servlet que manejaría la carga de archivos en el servidor backend. El siguiente ejemplo está usandoUploadServlet servlet para cargar el archivo.
Para cargar un solo archivo, debe usar una sola etiqueta <input ... /> con atributo type = "file". Para permitir la carga de varios archivos, incluya más de una etiqueta de entrada con diferentes valores para el atributo de nombre. El navegador asocia un botón Examinar con cada uno de ellos.
<html>
<head>
<title>File Uploading Form</title>
</head>
<body>
<h3>File Upload:</h3>
Select a file to upload: <br />
<form action = "UploadServlet" method = "post" enctype = "multipart/form-data">
<input type = "file" name = "file" size = "50" />
<br />
<input type = "submit" value = "Upload File" />
</form>
</body>
</html>
Esto mostrará el siguiente resultado que permitirá seleccionar un archivo desde la PC local y cuando el usuario haga clic en "Cargar archivo", el formulario se enviará junto con el archivo seleccionado.
File Upload:
Select a file to upload:
NOTE: This is just dummy form and would not work.
Servlet de backend de escritura
Lo siguiente es el servlet UploadServletque se encargaría de aceptar el archivo cargado y de almacenarlo en el directorio <Tomcat-installation-directory> / webapps / data. Este nombre de directorio también se puede agregar usando una configuración externa como uncontext-param elemento en web.xml de la siguiente manera:
<web-app>
....
<context-param>
<description>Location to store uploaded file</description>
<param-name>file-upload</param-name>
<param-value>
c:\apache-tomcat-5.5.29\webapps\data\
</param-value>
</context-param>
....
</web-app>
A continuación se muestra el código fuente de UploadServlet, que puede manejar la carga de varios archivos a la vez. Antes de continuar, debe asegurarse de lo siguiente:
El siguiente ejemplo depende de FileUpload, así que asegúrese de tener la última versión de commons-fileupload.x.x.jararchivo en su classpath. Puedes descargarlo desdehttps://commons.apache.org/fileupload/.
FileUpload depende de Commons IO, así que asegúrese de tener la última versión de commons-io-x.x.jararchivo en su classpath. Puedes descargarlo desdehttps://commons.apache.org/io/.
Mientras prueba el siguiente ejemplo, debe cargar un archivo que tenga un tamaño menor que maxFileSize; de lo contrario, el archivo no se cargaría .
Asegúrese de haber creado los directorios c: \ temp y c: \ apache-tomcat8.0.28 \ webapps \ data con suficiente antelación.
// Import required java libraries
import java.io.*;
import java.util.*;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.apache.commons.io.output.*;
public class UploadServlet extends HttpServlet {
private boolean isMultipart;
private String filePath;
private int maxFileSize = 50 * 1024;
private int maxMemSize = 4 * 1024;
private File file ;
public void init( ){
// Get the file location where it would be stored.
filePath = getServletContext().getInitParameter("file-upload");
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, java.io.IOException {
// Check that we have a file upload request
isMultipart = ServletFileUpload.isMultipartContent(request);
response.setContentType("text/html");
java.io.PrintWriter out = response.getWriter( );
if( !isMultipart ) {
out.println("<html>");
out.println("<head>");
out.println("<title>Servlet upload</title>");
out.println("</head>");
out.println("<body>");
out.println("<p>No file uploaded</p>");
out.println("</body>");
out.println("</html>");
return;
}
DiskFileItemFactory factory = new DiskFileItemFactory();
// maximum size that will be stored in memory
factory.setSizeThreshold(maxMemSize);
// Location to save data that is larger than maxMemSize.
factory.setRepository(new File("c:\\temp"));
// Create a new file upload handler
ServletFileUpload upload = new ServletFileUpload(factory);
// maximum file size to be uploaded.
upload.setSizeMax( maxFileSize );
try {
// Parse the request to get file items.
List fileItems = upload.parseRequest(request);
// Process the uploaded file items
Iterator i = fileItems.iterator();
out.println("<html>");
out.println("<head>");
out.println("<title>Servlet upload</title>");
out.println("</head>");
out.println("<body>");
while ( i.hasNext () ) {
FileItem fi = (FileItem)i.next();
if ( !fi.isFormField () ) {
// Get the uploaded file parameters
String fieldName = fi.getFieldName();
String fileName = fi.getName();
String contentType = fi.getContentType();
boolean isInMemory = fi.isInMemory();
long sizeInBytes = fi.getSize();
// Write the file
if( fileName.lastIndexOf("\\") >= 0 ) {
file = new File( filePath + fileName.substring( fileName.lastIndexOf("\\"))) ;
} else {
file = new File( filePath + fileName.substring(fileName.lastIndexOf("\\")+1)) ;
}
fi.write( file ) ;
out.println("Uploaded Filename: " + fileName + "<br>");
}
}
out.println("</body>");
out.println("</html>");
} catch(Exception ex) {
System.out.println(ex);
}
}
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, java.io.IOException {
throw new ServletException("GET method used with " +
getClass( ).getName( )+": POST method required.");
}
}
}
Compilar y ejecutar servlet
Compile el servlet UploadServlet anterior y cree la entrada requerida en el archivo web.xml de la siguiente manera.
<servlet>
<servlet-name>UploadServlet</servlet-name>
<servlet-class>UploadServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>UploadServlet</servlet-name>
<url-pattern>/UploadServlet</url-pattern>
</servlet-mapping>
Ahora intente cargar archivos utilizando el formulario HTML que creó anteriormente. Cuando intentara http: // localhost: 8080 / UploadFile.htm, mostraría el siguiente resultado que lo ayudaría a cargar cualquier archivo desde su máquina local.
File Upload:
Select a file to upload:
Si su script de servlet funciona bien, su archivo debe cargarse en el directorio c: \ apache-tomcat8.0.28 \ webapps \ data \.