javaweb archivos de subida
JSP carga de archivos en la parte
Carga de archivos también puede utilizar el formulario formulario para enviar la solicitud de back-end, también puede enviar una solicitud al servidor utilizando ajax
1. enviando una solicitud a la forma forma de back-end
<Form id = acción "postForm" = "$ {} pageContext.request.contextPath / UploadServlet" method = "post" enctype = "multipart / form-data">
<Div class = "wrap bbxx">
<InputType = id "texto" = nombre de "lado-perfil-name" = clase "nombre de usuario" = "forma-control">
<InputType = id "archivo" = nombre de "ejemplo-archivo-entrada" = "avatar">
<= Tipo de botón "enviar" class = "btn btn-efecto de ondulación-BTN-primaria"> Guardar </ botón>
</ Div>
</ Form>
etiquetas de código mejoradas no es necesario que la forma, implementado directamente por el control. Los desarrolladores sólo tienen que centrarse en la lógica de negocio puede ser. JS ha sido cerrado para ayudarnos mejor
this.post_file = function ()
{
$ Each (this.ui.btn, la función (i, n) {n.hide ();});
this.ui.btn.stop.show ();
this.State = this.Config.state.Posting; //
this.app.postFile ({id: this.fileSvr.id, pathLoc: this.fileSvr.pathLoc, pathSvr: this.fileSvr.pathSvr, lenSvr: this.fileSvr.lenSvr, campos: this.fields});
};
Los controles pueden ver los datos enviados a través de la herramienta de monitoreo, la depuración muy claro, muy simple.
2. enviar una solicitud al programa de fondo a través de AJAX
$ .Ajax ({
url: "$ {} pageContext.request.contextPath / UploadServlet",
escribir: "POST",
datos:. $ ( '#postForm') serialize (),
el éxito: function (datos) {
$ ( '#ServerResponse') html (datos).;
},
error: function (datos) {
$ ( '#ServerResponse') html (data.status + ":" + data.statusText + ":" + data.responseText).;
}
});
ajax divide en dos partes, parte de la inicialización, la notificación de solicitud de carga de archivos antes de la operación de inicialización del servidor realiza mediante AJAX
this.md5_complete = function (JSON)
{
this.fileSvr.md5 = json.md5;
this.ui.msg.text ( "cálculo de MD5 se ha completado, la conexión con el servidor ...");
this.event.md5Complete (esto, json.md5); // evento biz
var loc_path = encodeURIComponent (this.fileSvr.pathLoc);
var loc_len = this.fileSvr.lenLoc;
var loc_size = this.fileSvr.sizeLoc;
var PARAM = jQuery.extend ({}, this.fields, this.Config.bizData, {md5: json.md5, id: this.fileSvr.id, LENLOC: loc_len, sizeLoc: loc_size, pathLoc: loc_path, tiempo: nuevo . fecha () getTime ()});
$ .Ajax ({
escribir: "GET"
, Tipo de datos: 'jsonp'
, Jsonp: "devolución de llamada" devolución de llamada // nombre de la función de jsonp definido, nombres de función aleatoria por defecto se genera automáticamente para jQuery
, Url: this.Config [ "UrlCreate"]
, Los datos: param
, El éxito: function (SV)
{
_this.svr_create (sv);
}
, Error: function (req, txt, err)
{
_this.Manager.RemoveQueuePost (_this.fileSvr.id);
alert ( "! MD5 mensaje enviado al error del servidor" + req.responseText);
_this.ui.msg.text ( "información Enviar MD5 para el error de servidor");
_this.ui.btn.cancel.show ();
_this.ui.btn.stop.hide ();
}
, Completa: function (req, sta) {req = null; }
});
};
La notificación se envía al servidor después de la carga del archivo
this.post_complete = function (JSON)
{
this.fileSvr.perSvr = "100%";
this.fileSvr.complete = true;
$ Each (this.ui.btn, la función (i, n)
{
n.hide ();
});
this.ui.process.css ( "ancho", "100%");
this.ui.percent.text ( "(100%)");
this.ui.msg.text ( "carga completa");
this.Manager.arrFilesComplete.push (this);
this.State = this.Config.state.Complete;
// eliminar de la lista de carga
this.Manager.RemoveQueuePost (this.fileSvr.id);
// eliminar la lista nunca se carga
this.Manager.RemoveQueueWait (this.fileSvr.id);
var PARAM = {md5: this.fileSvr.md5, uid: this.uid, id: this.fileSvr.id, tiempo: new Date () getTime ().};
$ .Ajax ({
escribir: "GET"
, Tipo de datos: 'jsonp'
, Jsonp: "devolución de llamada" devolución de llamada // nombre de la función de jsonp definido, nombres de función aleatoria por defecto se genera automáticamente para jQuery
, Url: _this.Config [ "UrlComplete"]
, Los datos: param
, El éxito: function (msg)
{
_this.event.fileComplete (_Está); // evento de disparo
_this.post_next ();
}
Error: function (req, txt, err) {alert ( "Archivo - mensaje completo transmitida al servidor Error!" + Req.responseText);}
, Completa: function (req, sta) {req = null; }
});
};
Debe ser MD5 una segunda transmisión procesamiento de la lógica, y cuando la presencia del mismo servidor de archivos, el usuario no tiene que volver a subir, sino que pasan directamente a notificar a los segundos de usuario
this.post_complete_quick = function ()
{
this.fileSvr.perSvr = "100%";
this.fileSvr.complete = true;
this.ui.btn.stop.hide ();
this.ui.process.css ( "ancho", "100%");
this.ui.percent.text ( "(100%)");
this.ui.msg.text ( "la presencia del mismo servidor de archivos, subir rápidamente con éxito.");
this.Manager.arrFilesComplete.push (this);
this.State = this.Config.state.Complete;
// eliminar de la lista de carga
this.Manager.RemoveQueuePost (this.fileSvr.id);
// eliminar la lista nunca se carga
this.Manager.RemoveQueueWait (this.fileSvr.id);
// añadir a la lista de archivos
this.post_next ();
this.event.fileComplete (this); // evento de disparo
};
Aquí se puede ver el segundo paso lógico es muy simple, no es particularmente compleja.
Hay formdat para formar = new ();
form.append ( "nombre de usuario", "ZXJ");
form.append ( "Avatar", archivo);
// forma var = new FormData ($ ( "# postForm") [0]);
$ .Ajax ({
url: "$ {} pageContext.request.contextPath / UploadServlet",
escribir: "post",
formulario de datos,
processData: falso,
contentType: falso,
el éxito: function (datos) {
console.log (datos);
}
});
java parte
inicialización de archivo lógico, el código principal es el siguiente
FileInf fileSvr = nuevo FileInf ();
fileSvr.id = id;
fileSvr.fdChild = false;
fileSvr.uid = Integer.parseInt (UID);
fileSvr.nameLoc = PathTool.getName (pathLoc);
fileSvr.pathLoc = pathLoc;
fileSvr.lenLoc = Long.parseLong (LENLOC);
fileSvr.sizeLoc = sizeLoc;
fileSvr.deleted = false;
fileSvr.md5 = md5;
fileSvr.nameSvr = fileSvr.nameLoc;
// todos los archivos individuales se almacenan archivos UUID /
PathBuilderUuid pb = new PathBuilderUuid ();
fileSvr.pathSvr = pb.genFile (fileSvr.uid, fileSvr);
fileSvr.pathSvr = fileSvr.pathSvr.replace ( "\\", "/");
Dbconfig cfg = new dbconfig ();
DBFILE db = cfg.db ();
FileInf fileExist = nuevo FileInf ();
boolean existen = db.exist_file (md5, fileExist);
// mismo archivo de base de datos ya existe, y hay progreso de carga, el uso directo de esta información
si (exist && fileExist.lenSvr> 1)
{
fileSvr.nameSvr = fileExist.nameSvr;
fileSvr.pathSvr = fileExist.pathSvr;
fileSvr.perSvr = fileExist.perSvr;
fileSvr.lenSvr = fileExist.lenSvr;
fileSvr.complete = fileExist.complete;
db.Add (fileSvr);
// evento de disparo
up6_biz_event.file_create_same (fileSvr);
} // Este archivo no existe
más
{
db.Add (fileSvr);
// evento de disparo
up6_biz_event.file_create (fileSvr);
FileBlockWriter fr = new FileBlockWriter ();
fr.CreateFile (fileSvr.pathSvr, fileSvr.lenLoc);
}
Recibir bloques de datos de archivos, en esta lógica, recibimos los bloques de datos de archivo. Los datos de control se optimizaron para facilitar la depuración. Si puede ver los datos presentados con los controles de los instrumentos de seguimiento.
boolean isMultipart = ServletFileUpload.isMultipartContent (petición);
FileItemFactory fábrica = new DiskFileItemFactory ();
Subir ServletFileUpload = new ServletFileUpload (de fábrica);
archivos de lista = null;
tratar
{
archivos = upload.parseRequest (petición);
}
captura (FileUploadException e)
{// analizar el error de datos de archivos
out.println ( "error de datos de archivos de lectura:" + e.ToString ());
regreso;
}
FileItem rangeFile = null;
// obtener todos los archivos subidos
Iterator fileItr = files.iterator ();
// bucle para procesar todos los archivos
while (fileItr.hasNext ())
{
// obtener el archivo actual
rangeFile = (FileItem) fileItr.next ();
si (StringUtils.equals (rangeFile.getFieldName (), "pathSvr"))
{
pathSvr = rangeFile.getString ();
pathSvr = PathTool.url_decode (pathSvr);
}
}
boolean verificar = false;
Cadena msg = "";
Cadena md5Svr = "";
largo blockSizeSvr = rangeFile.getSize ();
if (! StringUtils.isBlank (blockMd5))
{
md5Svr = Md5Tool.fileToMD5 (rangeFile.getInputStream ());
}
verificar = Integer.parseInt (blockSize) == blockSizeSvr;
if (! verificar)
{
msg = "error tamaño de bloque sizeSvr:" + blockSizeSvr + "sizeLoc:" + blockSize;
}
si (verificar &&! StringUtils.isBlank (blockMd5))
{
verificar = md5Svr.equals (blockMd5);
si (verificar!) msg = "error de bloque MD5";
}
si (verificar)
{
// Guardar los datos del bloque de archivos
res FileBlockWriter = nuevo FileBlockWriter ();
// crear sólo el primero
si (Integer.parseInt (blockIndex) == 1) res.CreateFile (pathSvr, Long.parseLong (LENLOC));
res.write (Long.parseLong (blockOffset), pathSvr, rangeFile);
up6_biz_event.file_post_block (id, Integer.parseInt (blockIndex));
JSONObject o = new JSONObject ();
o.put ( "msg", "ok");
o.put ( "md5", md5Svr);
o.put ( "compensación", blockOffset); // posición de desplazamiento basado en el bloque de archivos
msg = o.toString ();
}
rangeFile.delete ();
out.write (msg);
nota:
1. La parte superior del código de Java se puede utilizar directamente, escribir sólo tiene que cargar el recorrido de la imagen y para recoger los datos y la base de datos puede ser
2. Utilice los archivos de carga superiores a un flujo de bytes, de hecho, también puede utilizar otras corrientes, la necesidad de mejorar la propia prueba del lector más adelante
3. BeanUtils es una herramienta para facilitar los atributos asignados a una entidad correspondiente a la entidad
4. subir archivos no se pueden utilizar request.getParameter ( "") los parámetros de adquisición, sino directamente a la solicitud de análisis, determinando si o no cada archivo es un archivo, y después realice las operaciones correspondientes (archivo de flujo a continuación, se leen, no archivo, guardará temporalmente en un mapa.)
La mayor parte de la lógica del código de fondo es la misma, actualmente soporta MySQL, Oracle, SQL. Antes de usar la necesidad de configurar la base de datos, usted me puede referirse a escribir este artículo: http://blog.ncmem.com/wordpress/2019/08/12/java-http%E5%A4%A7%E6%96%87 % E4% BB% B6% E6
% 96% AD% E7% 82% B9% E7% BB% AD% E4% BC% A0% E4% B8% 8A% E4% BC% A0 / acoja en que el grupo discuta "374992201 "