O componente fileupload comum de Jacarta pode lidar com solicitações e respostas HTTP. É frequentemente usado para lidar com uploads de arquivos. No entanto, foi descoberto recentemente que, quando personalizamos uploads de arquivos, montamos nós mesmos informações mime e adicionamos nós de cabeçalho personalizados ao fazer upload de arquivos, o componente fileupload. não pode ser obtido. Depois de analisar cuidadosamente o código-fonte do componente fileupload, descobrimos que o método principal está no método findNextItem do arquivo FileUploadBase. O problema é que depois que o componente fileupload analisou o nó principal personalizado, ele se esqueceu de passá-lo. para FileItemStreamImpl. Revise-o um pouco, o bug pode ser corrigido.
Copie o código do código da seguinte forma:
/**Analisar lista de arquivos
* Chamado para encontrar o próximo item, se houver.
* @return Verdadeiro, se um próximo item for encontrado, caso contrário, falso.
* @throws IOException Ocorreu um erro de E/S.
*/
private boolean findNextItem() lança IOException {
se (eof) {
retornar falso;
}
if (ItemAtual! = Nulo) {
itematual.close();
itemAtual = null;
}
para (;;) {
booleano próximaPart;
if (skipPreâmbulo) {
próximaPart = multi.skipPreamble();
} outro {
próximaPart = multi.readBoundary();
}
if (!nextPart) {
if (nomeCampoAtual == null) {
// Multipart externo encerrado -> Não há mais dados
eof = verdadeiro;
retornar falso;
}
// Multiparte interna encerrada -> Retornar para análise da parte externa
multi.setBoundary(limite);
nomeCampoAtual = null;
continuar;
}
Cabeçalhos FileItemHeaders = getParsedHeaders(multi.readHeaders());
if (nomeCampoAtual == null) {
//Estamos analisando o multipart externo
String nomeDoCampo = getNomeCampo(cabeçalhos);
if (nomedocampo! = nulo) {
String subContentType = headers.getHeader(CONTENT_TYPE);
if (subContentType! = nulo
&& subContentType.toLowerCase()
.startsWith(MULTIPART_MIXED)) {
nomeCampoAtual = nomeCampo;
// Vários arquivos associados a este nome de campo
byte[] subBoundary = getBoundary(subContentType);
multi.setBoundary(subBoundary);
skipPreamble = verdadeiro;
continuar;
}
String nomeArquivo = getNomeArquivo(cabeçalhos);
itemAtual = new FileItemStreamImpl(nomeArquivo,
nomedocampo, headers.getHeader(CONTENT_TYPE),
nomeArquivo == null, getContentLength(cabeçalhos));
notifier.noteItem();
itemValid = verdadeiro;
retornar verdadeiro;
}
} outro {
String nomeArquivo = getNomeArquivo(cabeçalhos);
if (nomedoarquivo! = nulo) {
//O código aqui precisa ser revisado
//Este é o código original, nenhum cabeçalho é passado
//currentItem = new FileItemStreamImpl(fileName, currentFieldName,headers.getHeader(CONTENT_TYPE),false, getContentLength(headers));
//Este é um novo código, precisamos passar o cabeçalho
currentItem = new FileItemStreamImpl(fileName, currentFieldName,headers.getHeader(CONTENT_TYPE),false, getContentLength(headers),headers);
notifier.noteItem();
itemValid = verdadeiro;
retornar verdadeiro;
}
}
multi.discardBodyData();
}
}
/**Código original, há um erro de perda de informações de FileItemHeaders
* Cria uma nova instância.
* @param pName O nome do arquivo de itens ou nulo.
* @param pFieldName O nome do campo dos itens.
* @param pContentType O tipo de conteúdo do item ou nulo.
* @param pFormField Se o item é um campo de formulário.
* @param pContentLength O comprimento do conteúdo dos itens, se conhecido, ou -1
* @throws IOException Falha na criação do item de arquivo.
*/
FileItemStreamImpl(String pNome, String pFieldName,
String pContentType, booleano pFormField,
longo pContentLength) lança IOException {
nome = pNome;
NomeCampo = pNomeCampo;
contentType = pContentType;
formField = pFormField;
final ItemInputStream itemStream = multi.newInputStream();
InputStream istream = itemStream;
if (fileSizeMax! = -1) {
if (pContentLength! = -1
&& pContentLength > fileSizeMax) {
FileUploadException e =
novo FileSizeLimitExceededException(
"O campo" + nomedocampo
+ "excede o máximo permitido"
+ "tamanho de" + fileSizeMax
+ "caracteres.",
pContentLength, fileSizeMax);
lançar novo FileUploadIOException(e);
}
istream = novo LimitedInputStream(istream, fileSizeMax) {
protegido void raiseError (pSizeMax longo, pCount longo)
lança IOException {
itemStream.close(true);
FileUploadException e =
novo FileSizeLimitExceededException(
"O campo" + nomedocampo
+ "excede o máximo permitido"
+ " tamanho de " + pSizeMax
+ "caracteres.",
pCount, pSizeMax);
lançar novo FileUploadIOException(e);
}
};
}
fluxo = istream;
}
/** Crie FileItem, código revisado, resolva o bug de perda de informações de FileItemHeaders
* @param pNome
* @param pFieldName
* @param pContentType
* @param pFormField
* @param pContentLength
* @param cabeçalhos
* @throwsIOException
*/
FileItemStreamImpl(String pNome, String pFieldName,
String pContentType, booleano pFormField,
longo pContentLength, cabeçalhos FileItemHeaders) lança IOException {
nome = pNome;
NomeCampo = pNomeCampo;
contentType = pContentType;
formField = pFormField;
if(cabeçalhos!=nulo){
this.headers = cabeçalhos;
}
final ItemInputStream itemStream = multi.newInputStream();
InputStream istream = itemStream;
if (fileSizeMax! = -1) {
if (pContentLength! = -1
&& pContentLength > fileSizeMax) {
FileUploadException e =
novo FileSizeLimitExceededException(
"O campo" + nomedocampo
+ "excede o máximo permitido"
+ "tamanho de" + fileSizeMax
+ "caracteres.",
pContentLength, fileSizeMax);
lançar novo FileUploadIOException(e);
}
istream = novo LimitedInputStream(istream, fileSizeMax) {
protegido void raiseError (pSizeMax longo, pCount longo)
lança IOException {
itemStream.close(true);
FileUploadException e =
novo FileSizeLimitExceededException(
"O campo" + nomedocampo
+ "excede o máximo permitido"
+ " tamanho de " + pSizeMax
+ "caracteres.",
pCount, pSizeMax);
lançar novo FileUploadIOException(e);
}
};
}
fluxo = istream;
}