Ao lado do artigo anterior:
2. Faça o upload e download do arquivo
Três truques desenvolvidos por Struts2, Page JSP - Arquivo de configuração Struts2.xml - e ação de classe de ação
Arquivo Upload Pré -requisito:
O método do formulário deve ser postado
O encantador do formulário deve ser multipart/formulário
Forneça o campo de entrada de upload do tipo = "arquivo"
Algumas regras para suporte de suportes para uploads de arquivo
1. Upload de arquivo único
Etapas de desenvolvimento:
1) Adicione o Commons-FileUpload-1.2.1.Jar e o Commons-IO-1.3.2.Jar sob a Web-Inf/Lib. Esses dois arquivos podem ser baixados em http://commons.apache.org/
2) Etapa 2: Escreva upfile.jsp e defina o Enctype da tabela de formulários como: "Multipart/formates", como segue:
<%@ Page Language = "java" import = "java.util. ação = "$ {PageContext.Request.ContextPath} /upload1.action" method = "post" Enctype = "Multipart/form-Data"> <!-Passando em MIME-> UserSname: <input Type = "Text" Name = "Username"/> <br/> Beautiful Photos: <input "File =" Name "Name =" Name "/> <br/> value = "upload"/> </morm> </body>Escreva a página de erro Error.jsp
<Body> O servidor está ocupado, tente novamente depois de um tempo. </body>
succcess.jsp
<Body> Carregue com sucesso </body>
3) Escreva o uploadAction1 Classe: Adicione atributos à classe de ação e os atributos correspondem ao nome do campo de arquivo no formulário:
pacote com.itheima.actions; importar java.io.file; importar java.io.ioException; importar org.apache.commons.io.fileutils; importar org.apache.struts2.ServletActionContext; foto de arquivo privado; // consistente com o nome do campo de upload do formulário. O tipo é tipo de arquivo String Private String Photofilename; // Carregue o nome do arquivo Private String PhotoContentType; // Carregar o arquivo de mima // omitir métodos getter e setter public String upload () {System.out.println (photofilename+":"+fotocontentype); // Campo Ordinário: System.out.println (nome de usuário); // Campo de upload: faça o upload para uma pasta. Salve -o no diretório de imagens do aplicativo String realpath = servletActionContext.getServletContext (). GetRealPath ("/imagens"); Diretório de arquivos = novo arquivo (realpath); if (! Directory.Exists ()) {Directory.mkdirs (); } tente {fileutils.copyfile (foto, novo arquivo (diretório, fotofilename)); sucesso de sucesso; } catch (ioexception e) {e.printStackTrace (); erro de retorno; }}}Adicione a seguinte configuração ao arquivo struts.xml
<ação name = "upload1" method = "upload"> <interceptor-ref name = "defaultStack"> <param name = "fileUpload.allowedTypes"> image/jpeg, image/png </param> <param name = "fileUpload.allowedextensionSet"> jpg, jpeg, pg <skerUplePload.AllowEDensionSet "> <sicel> /success.jsp </resultado> <resultado name = "error">/error.jsp </resultado> <resultado name = "input">/index.jsp </resultado> </action>
Análise de princípios:
um. O FileUpload Interceptor é responsável por lidar com operações de upload de arquivos. É um membro da pilha de interceptores de defaultstack padrão. O interceptador possui 3 propriedades que podem ser definidas.
• Maximumsize: o comprimento máximo do arquivo carregado (em bytes), o valor padrão é de 2 MB
• Types permitidos: os tipos que permitem o upload de arquivos, separados por vírgulas.
• Permitirextensões: permite o upload de extensões de arquivo. Essas três propriedades podem ser substituídas no arquivo struts.xml, separando a vírgula de cada extensão.
b. O upload de arquivos que excedem o tamanho ou ilegalmente causará um erro (volte para uma visualização de entrada)
passar:
<s: ActionError/> <s: FeilderRor/> Dica para exibir a mensagem de erro
c. Altere o prompt de mensagem de erro para a versão chinesa: com a ajuda de arquivos internacionais de recursos de mensagens
Se o erro for causado pela configuração de parâmetros padrão globais, é melhor usar o arquivo de recurso de mensagem global.
O arquivo de recurso de prompt de prompt padrão para Struts2: Struts-message.properties Arquivo de struts2-core-**. Jar. Basta comparar o valor da chave para substituir o valor correspondente.
A configuração é a seguinte:
struts.messages.error.Uploading = Erro upload: {0}
struts.messages.error.file.too.large = arquivo muito grande: {0} "{1}" "{2}" {3}
struts.messages.error.content.type.not.allowed = content-type não permitido: {0} "{1}" "{2}" {3}
struts.messages.error.file.extension.not.allowed = extensão de arquivo não permitido: {0} "{1}" "{2}" {3}
{0}: o valor do atributo de nome em <input type = "file" name = "uploadImage">
{1}: o nome real do arquivo carregado
{2}: o nome do arquivo de upload salvo no diretório temporário
{3}: o tipo de arquivo carregado (para struts.messages.error.file.too.large é do tamanho do arquivo carregado)
Código -fonte:
Modifique as informações do arquivo de recursos que exibem o erro
Etapa 1: Crie um novo arquivo de recursos, como o FileUploadMessage.Properties, coloque -o no SRC para adicionar as seguintes informações ao arquivo de recursos
struts.messages.error.Uploading = Erro de upload: {0}
struts.messages.error.file.too.large = O arquivo de upload é muito grande: {0} "{1}" "{2}" {3}
não é permitido struts.messages.error.content.type.not.allowed = o tipo de arquivo carregado não é permitido: {0} "{1}" "{2}" {3}
não é permitido struts.messages.error.file.extension.not.allowed = o nome do sufixo do arquivo carregado não é permitido: {0} "{1}" "{2}" {3}
Etapa 2: carregue o arquivo de recursos no arquivo struts.xml
<!-Configure o arquivo de recursos para obter informações de erro sobre o upload de arquivos->
<constante name = "struts.custom.i18n.resources" value = "cn… .xxx.fileUploadMessage"/>
2. Carregue vários arquivos
Carregar vários arquivos, você pode usar matrizes ou listas e outros são semelhantes aos uploads de arquivos únicos.
pacote com.itheima.actions; importar java.io.file; importar java.io.ioException; importar org.apache.commons.io.fileutils; importar org.apache.struts2.ServletActionContext; arquivo privado [] foto; // consistente com o nome do campo de upload do formulário. Tipo é tipo de arquivo.Array ou List Private String [] Photofilename; // Carregue o nome do arquivo Private String [] PhotoContentType; // Faça o upload do arquivo MIME Tipo public String upload () {// Field Field: Carregar em uma pasta. Salve -o no diretório de imagens do aplicativo String realpath = servletActionContext.getServletContext (). GetRealPath ("/imagens"); Diretório de arquivos = novo arquivo (realpath); if (! Directory.Exists ()) {Directory.mkdirs (); } tente {for (int i = 0; i <foto.length; i ++) {fileutils.copyfile (foto [i], novo arquivo (diretório, photofilename [i])); } retornar sucesso; } catch (ioexception e) {e.printStackTrace (); erro de retorno; }}}3. Download do arquivo
Princípio: o STRUTS2 fornece um tipo de resultado do fluxo, que é um tipo de resultado especificado, tipo especificamente usado para suportar a função de download do arquivo. Requer que um parâmetro de nome de entrada seja especificado. Este parâmetro especifica um fluxo de entrada e fornece a entrada para o arquivo baixado.
Etapas de codificação:
1) Classe de ação DownloadAction:
pacote com.itheima.Actions; importar java.io.file; importar java.io.fileInputStream; importar java.io.filenotfoundException; importar java.io.inputStream; import.ntet.net.net.urlencoder; import org.apache.commons.io.filenametils; com.opensymphony.xwork2.actionsupport; public class DownloadAction estende o Actionsupport {private inputStream Image; // Use no nome do arquivo de string privado com problemas; // Nome do arquivo Private Long FileSee; public inputStream getImage () {return image; } public void setImage (imagem inputStream) {this.image = image; } public string getFilename () {return filename; } public long getFilesize () {return filesize; } public string Download () lança Exceção {// Atribuir valor à imagem Byte Stream string filerealPath = servletActionContext.getServletContext (). getRealPath ("/web-inf/classes/如 .jpg"); FILENAME = FILENAMEUTILS.GETNAME (FileRealPath); // Método 1: O arquivo chinês deve ser codificado de URL // nome do arquivo = urlencoder.encode (nome do arquivo, "utf-8"); fileSize = new File (fileRealPath) .Length (); System.out.println (nome do arquivo); imagem = new FileInputStream (FileRealPath); sucesso de sucesso; }}Arquivo de configuração do Struts.xml: Configure principalmente os resultados do tipo de fluxo
<Truts> <constante name = "struts.devmode" value = "true" /> <nome constante = "struts.ognl.allowstaticmethodAccess" value = "true" /> <ação name = "download" method = "download"> <resultado type = "stream"> <names = "inputName"> imagem < /param <! inputStream-> <param name = "contentType"> Application/Octet-Stream </amp> <!-Diga ao cabeçalho da resposta do navegador, o formato MIME do arquivo e chame o método getContentType na ação-> <!-use a expressão de OGNL em struts.xml para obter o valor da propriedade na classe de ação. Ligue para getFilename () na classe de ação-> <!-Codificação de nome de arquivo chinês: Método 2. Use expressões OGNL para chamar o método estático de urlencode-> <!-OGNL padrão, os métodos estáticos não podem ser feitos. Você precisa ativar um switch constante.struts.ognl.allowstaticmethodAccess = true-> <param name = "contentDispition"> Apptment; filename = $ {@java.net.urlencoder@encode (FileName, 'utf-8')} </param> <!-Dirija o Browser to Download- </resultado> </ction> </cackage> </stuts> O interceptador e o upload de arquivos terminam aqui. É tão cansativo, mas cheio de realização.
O exposto acima é todo o conteúdo deste artigo. Espero que seja útil para o aprendizado de todos e espero que todos apoiem mais o wulin.com.