Bienes comunes de Yakarta El componente de carga de archivos puede manejar solicitudes y respuestas HTTP. A menudo se usa para manejar la carga de archivos. Sin embargo, recientemente descubrimos que cuando personalizamos la carga de archivos, recopilamos información mime nosotros mismos y agregamos nodos principales personalizados al cargar archivos, el componente de carga de archivos no puede manejarse. personalizado. El nodo principal del fileu se analiza cuidadosamente. Después de cargar el código fuente del componente, descubrí que el método principal está en el método findNextItem del archivo FileUploadBase. El problema es que después de que el componente de carga de archivos analizó el nodo principal personalizado, se olvidó de pasarlo a FileItemStreamImpl. revisión, este error se puede corregir.
Copie el código de código de la siguiente manera:
/**Analizar lista de archivos
* Llamado para encontrar el siguiente elemento, si lo hay.
* @return Verdadero, si se encontró el siguiente elemento; en caso contrario, falso.
* @throws IOException Se produjo un error de E/S.
*/
findNextItem() booleano privado lanza IOException {
si (eof) {
devolver falso;
}
si (elementoactual! = nulo) {
elementoactual.close();
elemento actual = nulo;
}
para (;;) {
booleano siguienteParte;
si (omitirPreámbulo) {
nextPart = multi.skipPreamble();
} demás {
nextPart = multi.readBoundary();
}
si (!siguienteParte) {
if (nombre del campo actual == nulo) {
// Multiparte exterior terminada -> No más datos
eof = verdadero;
devolver falso;
}
// multiparte interior terminada -> Volver a analizar el exterior
multi.setBoundary(límite);
nombre de campo actual = nulo;
continuar;
}
Encabezados FileItemHeaders = getParsedHeaders(multi.readHeaders());
if (nombre del campo actual == nulo) {
// Estamos analizando la multiparte externa
String nombre del campo = getFieldName (encabezados);
if (nombre del campo! = nulo) {
Cadena subContentType = headers.getHeader(CONTENT_TYPE);
si (subContentType! = nulo
&& subContentType.toLowerCase()
.startsWith(MULTIPART_MIXED)) {
nombre de campo actual = nombre de campo;
// Múltiples archivos asociados con este nombre de campo
byte[] sublímite = getBoundary(subContentType);
multi.setBoundary(sublímite);
skipPreámbulo = verdadero;
continuar;
}
String fileName = getFileName(encabezados);
elemento actual = nuevo FileItemStreamImpl (nombre de archivo,
Nombre de campo, encabezados.getHeader(CONTENT_TYPE),
fileName == null, getContentLength(encabezados));
notificador.noteItem();
elementoValido = verdadero;
devolver verdadero;
}
} demás {
String fileName = getFileName(encabezados);
if (nombre de archivo! = nulo) {
//El código aquí necesita ser revisado
//Este es el código original, no se pasa ningún encabezado
//currentItem = new FileItemStreamImpl(fileName, currentFieldName,headers.getHeader(CONTENT_TYPE),false, getContentLength(headers));
//Este es un código nuevo, necesitamos pasar el encabezado
currentItem = new FileItemStreamImpl(fileName, currentFieldName,headers.getHeader(CONTENT_TYPE),false, getContentLength(headers),headers);
notificador.noteItem();
elementoValido = verdadero;
devolver verdadero;
}
}
multi.discardBodyData();
}
}
/**Código original, hay un error al perder información de FileItemHeaders
* Crea una nueva instancia.
* @param pName El nombre del archivo de elementos, o nulo.
* @param pFieldName El nombre del campo de elementos.
* @param pContentType El tipo de contenido del elemento, o nulo.
* @param pFormField Si el elemento es un campo de formulario.
* @param pContentLength La longitud del contenido del elemento, si se conoce, o -1
* @throws IOException Error al crear el elemento del archivo.
*/
FileItemStreamImpl(String pName, String pFieldName,
Cadena pContentType, pFormField booleano,
long pContentLength) lanza IOException {
nombre = pNombre;
nombre de campo = pNombre de campo;
tipo de contenido = ptipo de contenido;
formField = pFormField;
final ItemInputStream itemStream = multi.newInputStream();
InputStream istream = itemStream;
si (tamaño de archivoMax! = -1) {
si (pContenidoLongitud! = -1
&& pContentLength > fileSizeMax) {
FileUploadException e =
nueva FileSizeLimitExceededException(
"El campo " + nombre del campo
+ "supera su máximo permitido"
+ " tamaño de " + fileSizeMax
+ "caracteres.",
pContentLength, fileSizeMax);
lanzar una nueva FileUploadIOException(e);
}
istream = nuevo LimitedInputStream(istream, fileSizeMax) {
riseError vacío protegido (pSizeMax largo, pCount largo)
lanza IOException {
itemStream.close (verdadero);
FileUploadException e =
nueva FileSizeLimitExceededException(
"El campo " + nombre del campo
+ "supera su máximo permitido"
+ " tamaño de " + pSizeMax
+ "caracteres.",
pCount, pSizeMax);
lanzar una nueva FileUploadIOException(e);
}
};
}
corriente = icorriente;
}
/** Crear FileItem, código revisado, resolver el error de perder información de FileItemHeaders
* @param pNombre
* @param pFieldName
* @param pContentType
* @param pFormField
* @param pContentLength
* encabezados @param
* @throwsIOException
*/
FileItemStreamImpl(String pName, String pFieldName,
Cadena pContentType, pFormField booleano,
encabezados pContentLength,FileItemHeaders largos) arroja IOException {
nombre = pNombre;
nombre de campo = pNombre de campo;
tipo de contenido = ptipo de contenido;
formField = pFormField;
si (encabezados! = nulo) {
this.headers = encabezados;
}
final ItemInputStream itemStream = multi.newInputStream();
InputStream istream = itemStream;
si (tamaño de archivoMax! = -1) {
si (pContenidoLongitud! = -1
&& pContentLength > fileSizeMax) {
FileUploadException e =
nueva FileSizeLimitExceededException(
"El campo " + nombre del campo
+ "supera su máximo permitido"
+ " tamaño de " + fileSizeMax
+ "caracteres.",
pContentLength, fileSizeMax);
lanzar una nueva FileUploadIOException(e);
}
istream = nuevo LimitedInputStream(istream, fileSizeMax) {
riseError vacío protegido (pSizeMax largo, pCount largo)
lanza IOException {
itemStream.close (verdadero);
FileUploadException e =
nueva FileSizeLimitExceededException(
"El campo " + nombre del campo
+ "supera su máximo permitido"
+ " tamaño de " + pSizeMax
+ "caracteres.",
pCount, pSizeMax);
lanzar una nueva FileUploadIOException(e);
}
};
}
corriente = icorriente;
}