java - servidor - subir archivos con spring mvc
¿Cómo subir archivos al servidor usando JSP/Servlet? (12)
Introducción
Para explorar y seleccionar un archivo para cargar, necesita un campo HTML <input type="file">
en el formulario. Como se indica en la especificación HTML , debe usar el método POST
y el atributo enctype
del formulario debe configurarse en "multipart/form-data"
.
<form action="upload" method="post" enctype="multipart/form-data">
<input type="text" name="description" />
<input type="file" name="file" />
<input type="submit" />
</form>
Después de enviar dicho formulario, los datos del formulario binario multiparte están disponibles en el cuerpo de la solicitud en un formato diferente al de cuando no se establece el enctype
.
Antes de Servlet 3.0, la API de Servlet no admitía de forma nativa multipart/form-data
. Solo admite el formato de formulario predeterminado de application/x-www-form-urlencoded
. El request.getParameter()
y las consortes devolverían null
al usar datos de formulario de varias partes. Aquí es donde el conocido Apache Commons FileUpload entró en escena.
¡No lo analices manualmente!
En teoría, puede analizar el cuerpo de la solicitud basándose en ServletRequest#getInputStream()
. Sin embargo, este es un trabajo preciso y tedioso que requiere un conocimiento preciso de RFC2388 . No intente hacer esto por su cuenta o copie en desecho un código sin biblioteca de origen propio que se encuentra en otros lugares de Internet. Muchas fuentes en línea han fallado mucho en esto, como roseindia.net. Véase también la carga de archivos pdf . Más bien, debería usar una biblioteca real que millones de usuarios utilizan (¡y están probados implícitamente!) Durante años. Tal biblioteca ha demostrado su robustez.
Cuando ya esté en Servlet 3.0 o más reciente, use la API nativa
Si está usando al menos Servlet 3.0 (Tomcat 7, Jetty 9, JBoss AS 6, GlassFish 3, etc.), entonces puede usar la API estándar proporcionada HttpServletRequest#getPart()
para recopilar los elementos de datos de formularios de HttpServletRequest#getPart()
individuales (la mayoría de Servlet ¡Las implementaciones 3.0 en realidad usan Apache Commons FileUpload debajo de las cubiertas para esto!). Además, los campos de formulario normales están disponibles mediante getParameter()
la forma habitual.
Primero anote su servlet con @MultipartConfig
para que reconozca y admita multipart/form-data
solicitudes multipart/form-data
y consiga que getPart()
funcione:
@WebServlet("/upload")
@MultipartConfig
public class UploadServlet extends HttpServlet {
// ...
}
Luego, implemente su doPost()
como sigue:
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String description = request.getParameter("description"); // Retrieves <input type="text" name="description">
Part filePart = request.getPart("file"); // Retrieves <input type="file" name="file">
String fileName = Paths.get(filePart.getSubmittedFileName()).getFileName().toString(); // MSIE fix.
InputStream fileContent = filePart.getInputStream();
// ... (do your job here)
}
Tenga en cuenta la Path#getFileName()
. Este es un arreglo de MSIE para obtener el nombre del archivo. Este navegador envía incorrectamente la ruta completa del archivo a lo largo del nombre en lugar de solo el nombre del archivo.
En caso de que tenga un <input type="file" name="file" multiple="true" />
para la carga de múltiples archivos, recopílelos como se muestra a continuación (desafortunadamente, no existe un método como request.getParts("file")
):
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// ...
List<Part> fileParts = request.getParts().stream().filter(part -> "file".equals(part.getName())).collect(Collectors.toList()); // Retrieves <input type="file" name="file" multiple="true">
for (Part filePart : fileParts) {
String fileName = Paths.get(filePart.getSubmittedFileName()).getFileName().toString(); // MSIE fix.
InputStream fileContent = filePart.getInputStream();
// ... (do your job here)
}
}
Cuando todavía no esté en Servlet 3.1, obtenga manualmente el nombre del archivo enviado
Tenga en cuenta que la Part#getSubmittedFileName()
se introdujo en Servlet 3.1 (Tomcat 8, Jetty 9, WildFly 8, GlassFish 4, etc.). Si aún no está en Servlet 3.1, necesita un método de utilidad adicional para obtener el nombre del archivo enviado.
private static String getSubmittedFileName(Part part) {
for (String cd : part.getHeader("content-disposition").split(";")) {
if (cd.trim().startsWith("filename")) {
String fileName = cd.substring(cd.indexOf(''='') + 1).trim().replace("/"", "");
return fileName.substring(fileName.lastIndexOf(''/'') + 1).substring(fileName.lastIndexOf(''//') + 1); // MSIE fix.
}
}
return null;
}
String fileName = getSubmittedFileName(filePart);
Tenga en cuenta el arreglo de MSIE para obtener el nombre del archivo. Este navegador envía incorrectamente la ruta completa del archivo a lo largo del nombre en lugar de solo el nombre del archivo.
Cuando aún no estés en Servlet 3.0, usa Apache Commons FileUpload
Si aún no está en Servlet 3.0 (¿no es hora de actualizar?), La práctica común es utilizar Apache Commons FileUpload para analizar las solicitudes de datos de formularios de multpartes. Tiene una excelente Guía del usuario y FAQ ( FAQ cuidadosamente ambas). También está el MultipartRequest
O''Reilly (" cos "), pero tiene algunos errores (menores) y ya no se mantiene activamente durante años. No recomendaría usarlo. Apache Commons FileUpload todavía se mantiene activamente y actualmente está muy maduro.
Para usar Apache Commons FileUpload, debe tener al menos los siguientes archivos en su aplicación web /WEB-INF/lib
:
Es probable que tu intento inicial haya fallado porque olvidaste el IO de los comunes.
Aquí hay un ejemplo de cómo el doPost()
de su UploadServlet
puede verse cuando se usa Apache Commons FileUpload:
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
try {
List<FileItem> items = new ServletFileUpload(new DiskFileItemFactory()).parseRequest(request);
for (FileItem item : items) {
if (item.isFormField()) {
// Process regular form field (input type="text|radio|checkbox|etc", select, etc).
String fieldName = item.getFieldName();
String fieldValue = item.getString();
// ... (do your job here)
} else {
// Process form file field (input type="file").
String fieldName = item.getFieldName();
String fileName = FilenameUtils.getName(item.getName());
InputStream fileContent = item.getInputStream();
// ... (do your job here)
}
}
} catch (FileUploadException e) {
throw new ServletException("Cannot parse multipart request.", e);
}
// ...
}
Es muy importante que no llame a getParameter()
, getParameterMap()
, getParameterValues()
, getInputStream()
, getReader()
, etc. en la misma solicitud de antemano. De lo contrario, el contenedor de servlets leerá y analizará el cuerpo de la solicitud y, por lo tanto, Apache Commons FileUpload obtendrá un cuerpo de solicitud vacío. Véase también ao ServletFileUpload # parseRequest (solicitud) devuelve una lista vacía .
Tenga en cuenta los FilenameUtils#getName()
. Este es un arreglo de MSIE para obtener el nombre del archivo. Este navegador envía incorrectamente la ruta completa del archivo a lo largo del nombre en lugar de solo el nombre del archivo.
Alternativamente, también puede envolver todo esto en un Filter
que lo analiza todo de forma automática y volver a colocar el contenido en el parámetro de la solicitud para que pueda continuar utilizando request.getParameter()
la manera habitual y recuperar el archivo cargado por request.getAttribute()
. Puedes encontrar un ejemplo en este artículo del blog .
La solución para el error GlassFish3 de getParameter()
sigue devolviendo null
Tenga en cuenta que las versiones de Glassfish anteriores a 3.1.2 tenían un error en el que el getParameter()
todavía devuelve un null
. Si está apuntando a un contenedor de este tipo y no puede actualizarlo, entonces necesita extraer el valor de getPart()
con la ayuda de este método de utilidad:
private static String getValue(Part part) throws IOException {
BufferedReader reader = new BufferedReader(new InputStreamReader(part.getInputStream(), "UTF-8"));
StringBuilder value = new StringBuilder();
char[] buffer = new char[1024];
for (int length = 0; (length = reader.read(buffer)) > 0;) {
value.append(buffer, 0, length);
}
return value.toString();
}
String description = getValue(request.getPart("description")); // Retrieves <input type="text" name="description">
Guardando el archivo cargado (¡no use getRealPath()
ni part.write()
!)
Diríjase a las siguientes respuestas para obtener detalles sobre fileContent
guardar correctamente el InputStream
(la variable fileContent
como se muestra en los fragmentos de código anteriores) en el disco o la base de datos:
- Manera recomendada para guardar archivos cargados en una aplicación de servlet
- ¿Cómo subir una imagen y guardarla en la base de datos?
- ¿Cómo convertir Part to Blob, para poder almacenarlo en MySQL?
Sirviendo el archivo subido
Diríjase a las siguientes respuestas para obtener detalles sobre cómo servir correctamente el archivo guardado desde el disco o la base de datos al cliente:
- Cargue imágenes desde fuera de la carpeta webapps / webcontext / deploy usando la etiqueta <h: graphicImage> o <img>
- ¿Cómo recuperar y mostrar imágenes de una base de datos en una página JSP?
- La forma más sencilla de servir datos estáticos desde fuera del servidor de aplicaciones en una aplicación web Java
- Plantilla abstracta para servlet de recursos estáticos que admite el almacenamiento en caché de HTTP
Ajaxificando el formulario.
Dirígete a las siguientes respuestas sobre cómo cargar usando Ajax (y jQuery). ¡Tenga en cuenta que el código de servlet para recopilar los datos del formulario no necesita ser cambiado para esto! Solo se puede cambiar la forma en que responde, pero esto es bastante trivial (es decir, en lugar de reenviar a JSP, simplemente imprima algo de JSON o XML o incluso texto sin formato, dependiendo de lo que el script responsable de la llamada Ajax esté esperando).
- ¿Cómo subir archivos al servidor usando JSP / Servlet y Ajax?
- enviando un archivo como multiparte a través de xmlHttpRequest
- Carga de archivos HTML5 a Java Servlet
Espero que todo esto ayude :)
¿Cómo puedo cargar archivos al servidor usando JSP / Servlet? Intenté esto:
<form action="upload" method="post">
<input type="text" name="description" />
<input type="file" name="file" />
<input type="submit" />
</form>
Sin embargo, solo obtengo el nombre del archivo, no el contenido del archivo. Cuando agrego enctype="multipart/form-data"
a <form>
, entonces request.getParameter()
devuelve null
.
Durante la investigación me topé con Apache Common FileUpload . Intenté esto:
FileItemFactory factory = new DiskFileItemFactory();
ServletFileUpload upload = new ServletFileUpload(factory);
List items = upload.parseRequest(request); // This line is where it died.
Desafortunadamente, el servlet lanzó una excepción sin un mensaje claro y causa. Aquí está el stacktrace:
SEVERE: Servlet.service() for servlet UploadServlet threw exception
javax.servlet.ServletException: Servlet execution threw an exception
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:313)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:852)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
at java.lang.Thread.run(Thread.java:637)
Aquí hay un ejemplo usando apache commons-fileupload:
// apache commons-fileupload to handle file upload
DiskFileItemFactory factory = new DiskFileItemFactory();
factory.setRepository(new File(DataSources.TORRENTS_DIR()));
ServletFileUpload fileUpload = new ServletFileUpload(factory);
List<FileItem> items = fileUpload.parseRequest(req.raw());
FileItem item = items.stream()
.filter(e ->
"the_upload_name".equals(e.getFieldName()))
.findFirst().get();
String fileName = item.getName();
item.write(new File(dir, fileName));
log.info(fileName);
Enviando múltiples archivos por archivos tenemos que usar enctype="multipart/form-data"
y para enviar múltiples archivos use multiple="multiple"
en la etiqueta de entrada
<form action="upload" method="post" enctype="multipart/form-data">
<input type="file" name="fileattachments" multiple="multiple"/>
<input type="submit" />
</form>
Estoy usando Servlet común para cada formulario HTML, ya sea que tenga o no archivos adjuntos. Este Servlet devuelve un TreeMap
en el que las claves son el nombre jsp. Los parámetros y los valores son Entradas del usuario, guarda todos los archivos adjuntos en el directorio fijo y luego cambia el nombre del directorio de su elección. Aquí Conexiones es nuestra interfaz personalizada que tiene un objeto de conexión. Creo que esto te ayudará
public class ServletCommonfunctions extends HttpServlet implements
Connections {
private static final long serialVersionUID = 1L;
public ServletCommonfunctions() {}
protected void doPost(HttpServletRequest request,
HttpServletResponse response) throws ServletException,
IOException {}
public SortedMap<String, String> savefilesindirectory(
HttpServletRequest request, HttpServletResponse response)
throws IOException {
// Map<String, String> key_values = Collections.synchronizedMap( new
// TreeMap<String, String>());
SortedMap<String, String> key_values = new TreeMap<String, String>();
String dist = null, fact = null;
PrintWriter out = response.getWriter();
File file;
String filePath = "E://FSPATH1//2KL06CS048//";
System.out.println("Directory Created ????????????"
+ new File(filePath).mkdir());
int maxFileSize = 5000 * 1024;
int maxMemSize = 5000 * 1024;
// Verify the content type
String contentType = request.getContentType();
if ((contentType.indexOf("multipart/form-data") >= 0)) {
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(filePath));
// 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.
@SuppressWarnings("unchecked")
List<FileItem> fileItems = upload.parseRequest(request);
// Process the uploaded file items
Iterator<FileItem> i = fileItems.iterator();
while (i.hasNext()) {
FileItem fi = (FileItem) i.next();
if (!fi.isFormField()) {
// Get the uploaded file parameters
String fileName = fi.getName();
// 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);
} else {
key_values.put(fi.getFieldName(), fi.getString());
}
}
} catch (Exception ex) {
System.out.println(ex);
}
}
return key_values;
}
}
Necesita que se common-io.1.4.jar
archivo common-io.1.4.jar
en su directorio lib
, o si está trabajando en cualquier editor, como NetBeans, debe ir a las propiedades del proyecto y simplemente agregar el archivo JAR. hecho.
Para obtener el archivo common.io.jar
, simplemente common.io.jar
en Google o vaya al sitio web de Apache Tomcat , donde podrá descargar gratuitamente este archivo. Pero recuerda una cosa: descarga el archivo ZIP binario si eres un usuario de Windows.
Otra fuente de este problema ocurre si está utilizando Geronimo con su Tomcat incorporado. En este caso, después de muchas iteraciones de pruebas de commons-io y commons-fileupload, el problema surge de un cargador de clases principal que maneja los tarros de commons-xxx. Esto tiene que ser prevenido. El choque siempre ocurrió en:
fileItems = uploader.parseRequest(request);
Tenga en cuenta que el tipo de archivo de elementos de la lista ha cambiado con la versión actual de commons-fileupload para ser específicamente List<FileItem>
en lugar de versiones anteriores donde era la List
genérica.
Agregué el código fuente de commons-fileupload y commons-io en mi proyecto de Eclipse para rastrear el error real y finalmente obtuve cierta información. Primero, la excepción lanzada es de tipo Throwable, no la excepción FileIOException ni siquiera la excepción (no quedarán atrapadas). En segundo lugar, el mensaje de error es confuso ya que declaró que no se encontró la clase porque axis2 no pudo encontrar commons-io. Axis2 no se usa en mi proyecto en absoluto, pero existe como una carpeta en el subdirectorio del repositorio de Geronimo como parte de la instalación estándar.
Finalmente, encontré 1 lugar que planteaba una solución de trabajo que resolvió con éxito mi problema. Debe ocultar los archivos jar del cargador principal en el plan de despliegue. Esto se puso en geronimo-web.xml con mi archivo completo que se muestra a continuación.
Pasted from <http://osdir.com/ml/user-geronimo-apache/2011-03/msg00026.html>
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<web:web-app xmlns:app="http://geronimo.apache.org/xml/ns/j2ee/application-2.0" xmlns:client="http://geronimo.apache.org/xml/ns/j2ee/application-client-2.0" xmlns:conn="http://geronimo.apache.org/xml/ns/j2ee/connector-1.2" xmlns:dep="http://geronimo.apache.org/xml/ns/deployment-1.2" xmlns:ejb="http://openejb.apache.org/xml/ns/openejb-jar-2.2" xmlns:log="http://geronimo.apache.org/xml/ns/loginconfig-2.0" xmlns:name="http://geronimo.apache.org/xml/ns/naming-1.2" xmlns:pers="http://java.sun.com/xml/ns/persistence" xmlns:pkgen="http://openejb.apache.org/xml/ns/pkgen-2.1" xmlns:sec="http://geronimo.apache.org/xml/ns/security-2.0" xmlns:web="http://geronimo.apache.org/xml/ns/j2ee/web-2.0.1">
<dep:environment>
<dep:moduleId>
<dep:groupId>DataStar</dep:groupId>
<dep:artifactId>DataStar</dep:artifactId>
<dep:version>1.0</dep:version>
<dep:type>car</dep:type>
</dep:moduleId>
<!--Don''t load commons-io or fileupload from parent classloaders-->
<dep:hidden-classes>
<dep:filter>org.apache.commons.io</dep:filter>
<dep:filter>org.apache.commons.fileupload</dep:filter>
</dep:hidden-classes>
<dep:inverse-classloading/>
</dep:environment>
<web:context-root>/DataStar</web:context-root>
</web:web-app>
PAGINA HTML
<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>
ARCHIVO DE SERVLET
// 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.");
}
}
web.xml
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>
Si por casualidad usas Spring MVC, esta es la forma de: (Lo dejo aquí en caso de que alguien lo encuentre útil).
Use un formulario con el atributo enctype
establecido en " multipart/form-data
" (igual que la respuesta de BalusC)
<form action="upload" method="post" enctype="multipart/form-data">
<input type="file" name="file" />
<input type="submit" value="Upload"/>
</form>
En su controlador, asigne el file
parámetros de file
al tipo MultipartFile
siguiente manera:
@RequestMapping(value = "/upload", method = RequestMethod.POST)
public void handleUpload(@RequestParam("file") MultipartFile file) throws IOException {
if (!file.isEmpty()) {
byte[] bytes = file.getBytes(); // alternatively, file.getInputStream();
// application logic
}
}
Puede obtener el nombre de archivo y el tamaño usando el nombre de archivo getOriginalFilename()
y getSize()
.
He probado esto con Spring version 4.1.1.RELEASE
.
puedes subir el archivo usando jsp / servlet.
<form action="UploadFileServlet" method="post">
<input type="text" name="description" />
<input type="file" name="file" />
<input type="submit" />
</form>
en el otro lado del servidor. Utilice el siguiente código.
package com.abc..servlet;
import java.io.File;
---------
--------
/**
* Servlet implementation class UploadFileServlet
*/
public class UploadFileServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
public UploadFileServlet() {
super();
// TODO Auto-generated constructor stub
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
response.sendRedirect("../jsp/ErrorPage.jsp");
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
PrintWriter out = response.getWriter();
HttpSession httpSession = request.getSession();
String filePathUpload = (String) httpSession.getAttribute("path")!=null ? httpSession.getAttribute("path").toString() : "" ;
String path1 = filePathUpload;
String filename = null;
File path = null;
FileItem item=null;
boolean isMultipart = ServletFileUpload.isMultipartContent(request);
if (isMultipart) {
FileItemFactory factory = new DiskFileItemFactory();
ServletFileUpload upload = new ServletFileUpload(factory);
String FieldName = "";
try {
List items = upload.parseRequest(request);
Iterator iterator = items.iterator();
while (iterator.hasNext()) {
item = (FileItem) iterator.next();
if (fieldname.equals("description")) {
description = item.getString();
}
}
if (!item.isFormField()) {
filename = item.getName();
path = new File(path1 + File.separator);
if (!path.exists()) {
boolean status = path.mkdirs();
}
/* START OF CODE FRO PRIVILEDGE*/
File uploadedFile = new File(path + Filename); // for copy file
item.write(uploadedFile);
}
} else {
f1 = item.getName();
}
} // END OF WHILE
response.sendRedirect("welcome.jsp");
} catch (FileUploadException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
Para Spring MVC he intentado hacer esto durante horas y logré tener una versión más sencilla que funcionó para tomar datos tanto de entrada como de imagen.
<form action="/handleform" method="post" enctype="multipart/form-data">
<input type="text" name="name" />
<input type="text" name="age" />
<input type="file" name="file" />
<input type="submit" />
</form>
Controlador para manejar
@Controller
public class FormController {
@RequestMapping(value="/handleform",method= RequestMethod.POST)
ModelAndView register(@RequestParam String name, @RequestParam int age, @RequestParam MultipartFile file)
throws ServletException, IOException {
System.out.println(name);
System.out.println(age);
if(!file.isEmpty()){
byte[] bytes = file.getBytes();
String filename = file.getOriginalFilename();
BufferedOutputStream stream =new BufferedOutputStream(new FileOutputStream(new File("D:/" + filename)));
stream.write(bytes);
stream.flush();
stream.close();
}
return new ModelAndView("index");
}
}
Espero eso ayude :)
Sin componente o biblioteca externa en Tomcat 6 o 7
Habilitando la carga en el archivo web.xml :
<servlet>
<servlet-name>jsp</servlet-name>
<servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class>
<multipart-config>
<max-file-size>3145728</max-file-size>
<max-request-size>5242880</max-request-size>
</multipart-config>
<init-param>
<param-name>fork</param-name>
<param-value>false</param-value>
</init-param>
<init-param>
<param-name>xpoweredBy</param-name>
<param-value>false</param-value>
</init-param>
<load-on-startup>3</load-on-startup>
</servlet>
COMO SE PUEDE VER :
<multipart-config>
<max-file-size>3145728</max-file-size>
<max-request-size>5242880</max-request-size>
</multipart-config>
Subiendo archivos usando JSP. Archivos:
En el archivo html
<form method="post" enctype="multipart/form-data" name="Form" >
<input type="file" name="fFoto" id="fFoto" value="" /></td>
<input type="file" name="fResumen" id="fResumen" value=""/>
En el archivo JSP o Servlet
InputStream isFoto = request.getPart("fFoto").getInputStream();
InputStream isResu = request.getPart("fResumen").getInputStream();
ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte buf[] = new byte[8192];
int qt = 0;
while ((qt = isResu.read(buf)) != -1) {
baos.write(buf, 0, qt);
}
String sResumen = baos.toString();
Edite su código según los requisitos del servlet, como tamaño máximo de archivo, tamaño máximo de solicitud y otras opciones que puede configurar ...
DiskFileUpload upload=new DiskFileUpload();
Desde este objeto, tiene que obtener elementos de archivo y campos para poder almacenar en el servidor como se indica a continuación:
String loc="./webapps/prjct name/server folder/"+contentid+extension;
File uploadFile=new File(loc);
item.write(uploadFile);