O exemplo deste artigo descreve como implementar a função de upload e download de arquivos em struts2 em java. Compartilhe com todos para sua referência. A análise específica é a seguinte:
1. Carregamento de arquivo
O primeiro é o código da página jsp
Defina uma tag de upload na página jsp
Copie o código do código da seguinte forma:<tr>
<td align="right" bgcolor="#F5F8F9"><b>Anexo:</b></td>
<td bgcolor="#FFFFFF">
<input type="arquivo" nome="upload" />
</td>
<td bgcolor="#FFFFFF"></td>
</tr>
Então os atributos relacionados definidos em BaseAction são omitidos (você também pode defini-los em sua própria Action, basta alterar o modificador de acesso)
Copie o código do código da seguinte forma:/**
*Classe base de ação
**/
classe pública BaseAction estende ActionSupport {
upload de lista protegida<Arquivo>;
protected List<String> uploadContentType; //Tipo de arquivo
protected List<String> uploadFileName; //Nome do arquivo
String protegida savePath; //salva caminho
}
Depois existe um método de upload em Action, o código é o seguinte:
Copie o código do código da seguinte forma:/**
* 8. Carregar anexos * @param upload
*/
public void uploadAccess(List<Arquivo> upload){
tentar {
if (nulo! = upload) {
for (int i = 0; i < upload.size(); i++) {
String caminho = getSavePath() + ""+ getUploadFileName().get(i);
System.out.println(caminho);
item.setAccessory(getUploadFileName().get(i));
FileOutputStream fos = novo FileOutputStream(caminho);
FileInputStream fis = new FileInputStream(getUpload().get(i));
byte[] buffer = novo byte[1024];
int len=0;
enquanto ((len = fis.read(buffer)) > 0) {
fos.write(buffer, 0, len);
}
fis.close();
fos.close();
}
}
} catch (Exceção e) {
logger.error("Erro ao enviar anexo.", e);
}
}
Então o código de cópia do meu arquivo struts2.xml é o seguinte: <action name="itemRDAction_*" method="{1}">
<param name="savePath">e:upload</param>
<interceptor-ref name="defaultStack">
<param name="fileUpload.allowedTypes">
aplicação/octeto-stream,imagem/pjpeg,imagem/bmp,imagem/jpg,imagem/png,imagem/gif,imagem/jpeg,application/msword,application/vnd.openxmlformats-officedocument.wordprocessingml.document,application/vnd. ms-excel
</param>
<param name="fileUpload.maximumSize">8000000</param>
</interceptor-ref>
<result name="show_item_rd_upd"> /WEB-INF/jsp/page_item/updItem_rd.jsp</result>
<result name="show_item_rd_list"> /WEB-INF/jsp/page_item/listItem_rd.jsp</result>
<result name="show_item_rd_push"> /WEB-INF/jsp/page_item/pushItem_rd.jsp</result>
</action>
savePath é o caminho para salvar, fileUpload.allowedTypes é usado para limitar o tipo de arquivo de upload fileUpload.maximumSize limite de tamanho do arquivo
2.Baixar arquivo
Primeiro, copie o código do link de download na página da seguinte forma: <tr>
<td align="right" bgcolor="#F5F8F9"><b>Anexo:</b></td>
<td bgcolor="#FFFFFF">
<div>${item.acessório}</div>
<c:if test="${!empty item.acessório}">
<div style="float: left;"><a style="color: black; text-decoration: none;" href="download.action?filename=${item.acessório}">Baixar</a>< /div>
</c:se>
</td>
<td bgcolor="#FFFFFF"></td>
</tr>
A seguir está o código para DownloadAction:
Copie o código do código da seguinte forma:/**
* BaixarAção
*
* @autor zhaoxz
*
*/
@Controller("downloadAction")
@Scope("protótipo")
classe pública DownloadAction estende BaseAction {
/**
*
*/
privado estático final longo serialVersionUID = -4278687717124480968L;
Logger estático privado logger = Logger.getLogger (DownloadAction.class);
nome do arquivo String privado;
private InputStream inputStream;
string privada savePath;
string privada mimeType;
public InputStream getInputStream() {
tentar {
String caminho = getSavePath() + "//"+ new String(filename.getBytes("ISO8859-1"), "utf-8");
System.out.println(caminho);
mimeType = ServletActionContext.getServletContext().getMimeType(caminho)+ ";charset=UTF-8";
inputStream = novo FileInputStream(caminho);
String agente = request.getHeader("USER-AGENT");
System.out.println(agente);
if (nulo! = agente) {
if (-1 != agent.indexOf("Firefox")) {// Firefox
mimeType = mimeType.replace("UTF-8", "ISO8859-1");
} else {// IE7+ Chrome
System.out.println("IE,Chrome");
nome do arquivo = new String(nomedoarquivo.getBytes("ISO8859-1"),"utf-8");
nome do arquivo = java.net.URLEncoder.encode(nome do arquivo, "UTF-8");
}
}
} catch (Exceção e) {
logger.error("Erro ao baixar informações do arquivo.", e);
}
if (nulo == inputStream) {
System.out.println("erro getResource");
}
retornar inputStream;
}
public void setInputStream(InputStream inputStream) {
this.inputStream = inputStream;
}
@Substituir
public String execute() lança exceção {
retornar SUCESSO;
}
/****************************** prepare-se ***************** ******* **********/
string pública getSavePath() {
retorne este.savePath;
}
public void setSavePath(String savePath) {
this.savePath = savePath;
}
public String getNomeArquivo() {
retornar nome do arquivo;
}
public void setFilename(String nome do arquivo) {
este.nomedoarquivo = nome do arquivo;
}
}
Depois, há o arquivo struts2.xml:
Copie o código da seguinte forma: <action name="download">
<param name="savePath">E:/upload</param>
<result type="stream">
<param name="contentType">${mimeType}</param>
<param name="contentDisposition">anexo;filename="${filename}"</param>
<param name="inputName">inputStream</param>
</resultado>
</action>
Ao fazer o download, preste atenção ao formato de codificação e não deverá haver problemas.
Problemas encontrados durante o upload
1. Ocorre um erro ao enviar arquivos grandes. Solução 1.
Os erros que ocorrem são os seguintes:
1. 24/02/2012 11:06:31.937 ERRO (org.apache.struts2.dispatcher.Dispatcher:512) - Não foi possível encontrar ação ou resultado
Nenhum resultado definido para a ação com.iman.portal.action.QuestionActionImpl e resultado problemPage - action - file:/E:/myeclipse/workspaces/portal/WebRoot/WEB-INF/classes/struts2/struts-question.xml:51: 55
2. a solicitação foi rejeitada porque seu tamanho (2973652) excede o máximo configurado (2097152)
Significado chinês: A solicitação foi rejeitada porque seu tamanho (2973652) excede o máximo configurado (2097152),
Considerando a experiência do usuário, é necessário interceptar tais exceções ao fazer upload de anexos. A solução é a seguinte:
1. Os arquivos carregados são armazenados primeiro no cache durante o processo de upload. Por razões de segurança, adicione um caminho de armazenamento temporário ao arquivo struts.properties do projeto, embora o caminho físico do servidor tenha sido definido no projeto.
Copie o código da seguinte forma: struts.multipart.saveDir=/temp
2. Considerando que o tamanho do upload do arquivo poderá ser modificado posteriormente, independente de ser o padrão ou não, adicione a seguinte configuração ao arquivo struts.properties do projeto:
Copie o código da seguinte forma: <!-- O tamanho do arquivo de upload permitido é 2M -->
<constant name="struts.multipart.maxSize" value="2097152"/>
3. configuração do struts.xml
Copie o código da seguinte forma: <!-- Como modificar o problema -->
<action name="updateProblem" método="updateProblem">
<interceptor-ref name="fileUpload"/>
<interceptor-ref name="defaultStack" />
<result name="input">/page/question/page/problemPage.jsp</result>
</action>
4. A etapa mais importante e crítica
O interceptador fileUpload determina apenas o tipo e o tamanho do arquivo depois que ele é carregado no servidor. Se não fizermos nada em Action, a exceção será exibida na frente do usuário, então pensei em uma maneira de definir as informações da exceção como uma mensagem de erro em nível de ação. Ou seja, substitua o método addActionError.
Copie o código da seguinte forma: @Override
public void addActionError(String anErrorMessage) {
// Aqui precisamos primeiro determinar se é um erro que queremos substituir antes de processá-lo.
if (anErrorMessage.startsWith("a solicitação foi rejeitada devido ao seu tamanho")) {
Padrão padrão = Pattern.compile("d+");
Correspondente m = padrão.matcher(anErrorMessage);
//Corresponde uma vez
encontrar();
String s1 =m.group();//Tamanho do arquivo enviado
//Combina novamente
encontrar();
String s2 =m.group();//tamanho limitado
if(!s1.equals("") && !s2.equals("")){
fileUploadErrorMessage="O tamanho do arquivo que você enviou (" + Long.valueOf(s1)/1024 + "bytes) excede o tamanho permitido (" + Long.valueOf(s2)/1024/1024 + "M)";
getRequest().setAttribute("fileUploadErrorMessage","O arquivo é muito grande e excede o tamanho permitido ("+Long.valueOf(s2)/1024/1024+"M). O upload falhou!");
//Substitui as informações
super.addActionError(fileUploadErrorMessage);
}
} else {// Caso contrário, trate de acordo com o método original
super.addActionError(anErrorMessage);
}
}
Sim, use <s:fielderror/> <s:fielderror/> na página de retorno para obter o conteúdo do erro em addActionError.
Como não quero exibir a causa do erro na página e quero abrir uma caixa de prompt, coloco as informações no objeto de solicitação.
Quando a página é carregada, a seguinte verificação js é adicionada:
Copie o código da seguinte forma: // Determine se o arquivo foi carregado com sucesso
var mensagem="${request.fileUploadErrorMessage}";
if(mensagem!=null && ""!=trim(mensagem) && mensagem!="null"){
self.parent.diag.close();
alerta(mensagem);
retornar;
}
Aqui estão algumas referências para entender Dongdong:
struts.multipart.maxSize controla o tamanho máximo dos arquivos carregados por todo o projeto
Os atributos MaximumSize dos interceptores struts.multipart.maxSize e fileUpload têm diferentes divisões de trabalho, que são resumidas a seguir:
1.struts.multipart.maxSize controla o tamanho máximo dos arquivos carregados em todo o projeto.
Se esse tamanho for excedido, um erro será relatado em segundo plano e o programa não poderá lidar com um arquivo tão grande. Haverá o seguinte prompt no fielderror:
a solicitação foi rejeitada porque seu tamanho (16272982) excede o máximo configurado (9000000)
2. O atributo maximumSize do interceptor fileUpload deve ser menor que o valor de struts.multipart.maxSize.
O padrão struts.multipart.maxSize é 2M. Quando MaximumSize é maior que 2M, o valor de struts.multipart.maxSize deve ser definido como maior que MaximumSize.
3. Quando o arquivo transferido por upload é maior que struts.multipart.maxSize, o sistema relata um erro. Quando o arquivo transferido por upload está entre struts.multipart.maxSize e MaximumSize, o sistema solicita:
Arquivo muito grande: arquivo "MSF concept.ppt" "upload__5133e516_129ce85285f__7ffa_00000005.tmp" 6007104
Quando o arquivo enviado for menor que MaximumSize, o upload será bem-sucedido.
Copie o código da seguinte forma: <action name="UploadFile">
<result name="UploadFileResult">/pages/ShowOtherFiles.jsp</result>
<result name="JGBsuccess">/pages/JGBdetail.jsp</result>
<interceptor-ref name="fileUpload">
<param name="savePath">/dados</param>
<param name="maximumSize">52428800</param>
</interceptor-ref>
<interceptor-ref name="defaultStack"></interceptor-ref>
</action>
Ocorre um erro ao fazer upload de arquivos grandes. Solução 2:
Problema: Erro ao enviar arquivos grandes...
Solução: modifique os parâmetros no arquivo struts.xml conforme a seguir: <constant name="struts.multipart.maxSize" value="55000000"/>.
<nome da ação="CarregarArquivo">
<result name="UploadFileResult">/www.VeVB.COm/ShowOtherFiles.jsp</result>
<result name="JGBsuccess">/pages/JGBdetail.jsp</result>
<interceptor-ref name="fileUpload">
<param name="savePath">/dados</param>
<param name="maximumSize">52428800</param>
</interceptor-ref>
<interceptor-ref name="defaultStack"></interceptor-ref>
</action>
A relação entre o tamanho no arquivo struts.xml e o tamanho real do arquivo: 1048576 (Bytes) = 1024*1024 = 1M de tamanho real do arquivo.
struts.multipart.maxSize controla o tamanho máximo dos arquivos enviados por todo o projeto
Os atributos MaximumSize dos interceptores struts.multipart.maxSize e fileUpload têm diferentes divisões de trabalho, que são resumidas a seguir:
1.struts.multipart.maxSize controla o tamanho máximo dos arquivos carregados em todo o projeto. Se esse tamanho for excedido, um erro será relatado em segundo plano e o programa não poderá lidar com um arquivo tão grande. Haverá o seguinte prompt no fielderror:
a solicitação foi rejeitada porque seu tamanho (16272982) excede o máximo configurado (9000000)
2. O atributo maximumSize do interceptor fileUpload deve ser menor que o valor de struts.multipart.maxSize.
O padrão struts.multipart.maxSize é 2M. Quando MaximumSize é maior que 2M, o valor de struts.multipart.maxSize deve ser definido como maior que MaximumSize.
3. Quando o arquivo transferido por upload é maior que struts.multipart.maxSize, o sistema relata um erro. Quando o arquivo transferido por upload está entre struts.multipart.maxSize e MaximumSize, o sistema solicita:
Arquivo muito grande: arquivo "MSF concept.ppt" "upload__5133e516_129ce85285f__7ffa_00000005.tmp" 6007104
Quando o arquivo enviado for menor que MaximumSize, o upload será bem-sucedido.
Carregar restrições de tipo de arquivo
Configurar interceptador de upload de arquivo
O defaultStack do struts2 já contém o interceptor fileupload. Se você deseja adicionar o parâmetro AllowTypes, você precisa escrever um novo defaultstack, copiá-lo e modificá-lo:
Copie o código da seguinte forma: <interceptores>
<interceptor-stack name="myDefaultStack">
<interceptor-ref name="exceção"/>
<interceptor-ref name="alias"/>
<interceptor-ref name="servletConfig"/>
<interceptor-ref name="i18n"/>
<interceptor-ref nome=www.VeVB.COm/>
<interceptor-ref name="chain"/>
<interceptor-ref name="depuração"/>
<interceptor-ref name="criação de perfil"/>
<interceptor-ref name="scopedModelDriven"/>
<interceptor-ref name="modelDriven"/>
<interceptor-ref name="fileUpload">
<param name="allowedTypes">
imagem/png,imagem/gif,imagem/jpeg
</param>
</interceptor-ref>
<interceptor-ref name="caixa de seleção"/>
<interceptor-ref name="staticParams"/>
<interceptor-ref name="actionMappingParams"/>
<interceptor-ref name="params">
<param name="excludeParams">dojo..*,^struts..*</param>
</interceptor-ref>
<interceptor-ref name="conversionError"/>
<interceptor-ref name="validação">
<param name="excludeMethods">entrar,voltar,cancelar,navegar</param>
</interceptor-ref>
<interceptor-ref name="fluxo de trabalho">
<param name="excludeMethods">entrar,voltar,cancelar,navegar</param>
</interceptor-ref>
</interceptor-stack>
</interceptores>
<default-interceptor-ref name="myDefaultStack"></default-interceptor-ref>
Modifique apenas o código copiado no código da seguinte forma: <interceptor-ref name="fileUpload">
<param name="allowedTypes">
imagem/png,imagem/gif,imagem/jpeg
</param>
</interceptor-ref>
A pilha do interceptor é configurada dentro da tag <package> e fora da tag <action> como acima. Se o definirmos como o interceptor padrão, não precisamos fazer isso.
Introduza-o na tag <action>. Caso contrário, você precisará introduzir um interceptor. Copie o código: <action>.
<result name="input">/error/dbError.jsp</result>
<interceptor-ref name="myDefaultStack"></interceptor-ref>
</action>
A ação de erro do tipo upload de arquivo retornará diretamente a entrada, portanto não há necessidade de retornar "entrada" na ação;
Você também pode definir o caminho e o tamanho da sua solicitação de upload fora da tag <package>:
Copie o código da seguinte maneira: <constant name="struts.multipart.saveDir" value="/upload/detailed"></constant>
<constant name="struts.multipart.maxSize" value="1024"></constant>
O ponto mais importante: o formulário para upload de arquivos deve adicionar: enctype="multipart/form-data". Caso contrário, um erro de entrada será relatado.
Espero que este artigo seja útil para a programação Java de todos.