Se você precisar fazer upload de arquivos nos servidores, estará enviando nossos arquivos locais para o servidor de recursos. A melhor maneira é enviá -los através do FTP. Isso é carregado em combinação com SpringMVC+FTP. Precisamos primeiro entender como configurar o springmvc, depois configurar o FTP e finalmente fazer o upload do arquivo em combinação com o multipartfile.
O upload da SpringMVC requer vários pacotes de JAR, a mola e os pacotes associados podem ser configurados por você mesmo. Aqui explicamos principalmente os principais pacotes de jar
1: Spring-web-3.2.9.release.jar (o pacote Key Jar da primavera, você pode escolher a versão)
2: Commons-io-2.2.jar (alguns pacotes de ferramentas usados para lidar com IO no projeto)
Arquivo de configuração
Springmvc usa o multipartfile para fazer upload de arquivos, por isso precisamos configurar multipartresolver para lidar com arquivos no formulário
<!-Faça o upload do Interpreter do arquivo-> <bean id = "multipartresolver"> <propriedade name = "defaultEncoding" value = "utf-8" /> <names name = "maxuploadSize" value = "10485760" /> <bound = "maxinmyerySize")
Os atributos são explicados em detalhes:
DefaultEncoding configura o formato de codificação da solicitação, ISO-8859-1 padrão
A unidade máxima do arquivo de configuração MaxuploadSize, em bytes
MaxinMemorySize configura o cache de arquivos carregados, em bytes
A propriedade Resolvelazily está habilitada para atrasar a resolução do arquivo, para que as exceções do tamanho do arquivo possam ser capturadas no uploadAction
Configuração da página
Adicione ENCTYPE = "Multipart/Form-Data" à forma da página
<form id = "" name = "" method = "post" action = "" Enctype = "multipart/form-data">>
Definir ENCTYPE = "Multipart/Form-Data" na tag Formulário para garantir a codificação correta do arquivo uploado anônimo.
É a codificação MIME da forma. Por padrão, esse formato de codificação é aplicativo/x-www-form-urlencoded, que não pode ser usado para upload de arquivo; Somente usando os dados multipart/formulários, os dados do arquivo podem ser totalmente passados e as seguintes operações são executadas. Enctype = "Multipart/Form-Data" é fazer upload de dados binários. O valor de entrada no formulário é passado de maneira 2 dígitos, para que a solicitação não possa obter o valor.
Escreva aula de controle de upload
Escreva um método de upload e não há resultado retornado aqui. Se você precisar pular para a página ou retornar outros valores, poderá alterar o void para string, mapa <string, objeto> e outros valores e depois retornar para retornar para retornar o resultado.
/** * Upload* @param request * @return */ @ResponseBody @RequestMapping(value = "/upload", method = {RequestMethod.GET, RequestMethod.POST}) public void upload(HttpServletRequest request) { MultipartHttpServletRequest multipartRequest=(MultipartHttpServletRequest)request; Arquivo multipart -arquivo = multipartrequest.getfile ("arquivo"); // arquivo é o nome do nome da página de entrada string basepath = "caminho do arquivo" tente {multipartresolver resolver = new commonsmultipartresol (request.getSession (). GetServletContext ()); if (resolver.ismultipart (request)) {string filestoredPath = "Caminho da pasta"; // Nome do arquivo gerado aleatório String RandomName = StringUtil.GetrandomFilename (); String uPLOPLefilename = FILE.GETORGINALFILENAME (); if (stringUtils.isnotblank (uploadFilename)) {// intercepte o nome do arquivo name string suffix = uploadFilename.substring (uploadFileName.indexof (".")); // Remomble o nome do arquivo string newFileName = RandomName + Suffix; String savePath = BasEpath + "/" + newFileName; Arquivo savefile = novo arquivo (savePath); Arquivo parentfile = savefile.getParentFile (); if (savefile.exists ()) {SaveFile.Delete (); } else {if (! ParentFile.exists ()) {parentFile.mkdirs (); }} // Copie o arquivo para o caminho especificado FileUtils.copyInputStreamTofile (FILE.GETINPUTSTREAM (), SAVEFILE); // Carregar o arquivo no servidor ftpclientUtil.upload (savefile, filestoredPath); }}} catch (Exceção e) {e.printStackTrace (); }} Ferramenta de upload do cliente FTP
pacote com.yuananding.common.util; importar java.io.file; importar java.io.fileInputStream; importar java.io.fileOutputStream; importar java.io.ioException; importar java.io.inputStream; importar java.io.OutputStream; importar java.net.socketexception; importar java.util.hashmap; importar java.util.map; importar java.util.properties; importar org.apache.commons.lang.stringutils; importar org.apache.commons.net.ftp.ftp; importar org.apache.commons.net.ftp.ftpClient; importar org.apache.commons.net.ftp.ftpreply; importar org.slf4j.logger; importar org.slf4j.loggerFactory; / *** Ferramentas do cliente FTP*/ public class ftpClientUtil {/ *** log*/ private estático final logger = loggerFactory.getLogger (ftpClientUtil.class); / ** * Configuração do servidor FTP-Chave, o valor é tipo de string */ public static final string server_ip = "server_ip"; / ** * Configuração do servidor FTP-tecla de portão, o valor é tipo de número inteiro */ public static final string server_port = "server_port"; / ** * Configuração do servidor FTP-Login anônimo, o valor é o tipo de string final booleana */ public static final is_anonymous = "is_anonymous"; / ** * Nome de usuário do login anônimo */ public static string final anonymous_user_name = "anonymous"; / ** * Senha do login anônimo */ public static string final anonymous_password = ""; / ** * Configuração do servidor FTP-Log no nome do usuário, o valor é tipo de string */ public static final string user_name = "user_name"; / ** * Configuração do servidor FTP-log na senha, o valor é tipo de string */ public static final string senha = "senha"; / ** * Configuração do servidor FTP-a tecla PASV, o valor é tipo de string final boolean */ public static string is_pasv = "is_pasv"; /** * Configuração do servidor FTP-Chave do diretório que trabalha, o valor é o tipo de string durante o login, o diretório atual * é o diretório inicial do usuário, o director de trabalho deve ser definido com base nele. Além disso, o diretor de trabalho deve * existir, não pode ser criado automaticamente. Caso contrário, o arquivo será enviado no diretório inicial do usuário. Se * não atribuído, "/" for usado. */ public static final string working_directory = "working_directory"; mapa estático público <string, objeto> servercfg = new hashmap <string, object> (); Propriedades estáticas Prop; static {Logger.info ("Comece a carregar o arquivo ftp.properties!"); prop = new Properties (); tente {inputStream fps = ftpClientUtil.class.getResourceasStream ("/ftp.properties"); Prop.Load (FPS); fps.Close (); } catch (Exceção e) {Logger.error ("Exceção lê o arquivo ftp.properties!", e); } servercfg.put (ftpClientUtil.server_ip, valores ("server_ip")); Servercfg.put (ftpclientutil.server_port, Integer.parseint (valores ("server_port"))); servercfg.put (ftpclientutil.user_name, valores ("user_name")); servercfg.put (ftpClientUtil.password, valores ("senha")); Logger.info (String.ValueOf (Servercfg)); } /*** Carregue um arquivo no servidor FTP. * * @param servercfg: FTP Server Configuration * @param filepathoupload: caminho do arquivo para fazer upload * @param filestoredName: o nome para fornecer o arquivo armazenado remoto, null, "" e outra palavra em branco será substituída * o nome do arquivo para upload * @throws ioxexception * @THOTHETETETETEXEXCOMPEXCOMPEX * String filepathTOUPLOAD, string filestoredName) lança Socketexception, ioException {upload (servercfg, novo arquivo (filepathoupload), filestoredName); } /*** Carregue um arquivo no servidor FTP. * * @param serverCfg : FTP server configuration * @param fileToUpload : file to upload * @param fileStoredName : the name to give the remote stored file, null, "" and other blank word will be replaced * by the file name to upload * @throws IOException * @throws SocketException */ public static final void upload(Map<String, Object> serverCfg, File FileTOUPLOAD, String filestoredName) lança SockeTexception, ioException {if (! FileTouPload.exists ()) {TOME NOVO ILEGALARGUMENTEXCECTION ("O arquivo para o upload não existe:" + fileTouPload.getAlTepath ()); } if (! FileTouPload.isfile ()) {tiro o novo ilegalargumentException ("o arquivo para fazer upload não é um arquivo:" + fileTouPload.getabsolutepath ()); } if (stringUtils.isblank ((string) servercfg.get (server_ip))) {lança new ilegalargumentException ("server_ip deve estar contido na configuração do servidor FTP."); } transferfile (true, servercfg, fileTOUPLOAD, FILESTOREDNAME, NULL, NULL); } / ** * Baixe um arquivo do servidor FTP * * @Param ServerCfg: Configuração do servidor FTP * @param filenameToDownload: nome do arquivo a ser baixado * @param filestoredPath: Storled Path of the Filked File em download * @Throws SockeTexception * @THOWS IOException * / public STATION VAID FilestoredPath) lança o SockeTexception, IoException {if (stringutils.isblank (filenameToDownload)) {tiro novo ilegalArgumentException ("o nome do arquivo a ser baixado não pode estar em branco."); } if (stringutils.isblank (filestoredPath)) {tire nova ilegalArgumentException ("Caminho armazenado do arquivo baixado no local não pode ficar em branco."); } if (stringUtils.isblank ((string) servercfg.get (server_ip))) {lança new ilegalargumentException ("server_ip deve estar contido na configuração do servidor FTP."); } transferfile (false, servercfg, null, null, filenameToDownload, filestoredPath); } private estático final void transferfile (boolean isupload, map <string, object> servercfg, arquivo fileTouPload, string serverFileStoredName, string filenameToDownload, string localFilestoredPath) lança SockeTexception, ioexception {string host = (string) servercfg.get; Porta inteira porta = (número inteiro) servercfg.get (server_port); Boolean isanonymous = (boolean) servercfg.get (is_anonymous); String userName = (string) servercfg.get (user_name); String senha = (string) servercfg.get (senha); Boolean iSpasv = (boolean) servercfg.get (is_pasv); String WorkingDirectory = (String) Servercfg.get (Working_Directory); FtpClient ftpClient = new ftpClient (); InputStream filein = null; OutputStream fileout = null; tente {if (port == null) {logger.debug ("conectar ao servidor FTP no" + host + ":" + ftp.default_port); ftpClient.Connect (host); } else {Logger.debug ("Conecte -se ao servidor FTP no" + host + ":" + porta); ftpClient.Connect (host, porta); } int reply = ftpClient.getReplyCode (); if (! ftpreply.ispositiveciction (resposta)) {Logger.error ("O servidor FTP recusa a conexão"); retornar; } if (isanonymous! = null && isanonymous) {nome de usuário = anonymous_user_name; senha = anonymous_password; } Logger.debug ("Log em servidor FTP com nome de usuário =" + nome de usuário + ", senha =" + senha); if (! ftpClient.login (nome de usuário, senha)) {Logger.error ("Falha ao fazer login no servidor FTP com nome de usuário =" + nome de usuário + ", senha =" + senha); ftpClient.logout (); retornar; } // Aqui usaremos o modo binário como o tipo de arquivo de transferência, // o modo ASCII não é suportado. Logger.debug ("Definir tipo de arquivo, que é fazer upload, para binário."); ftpClient.SetFileType (ftp.binary_file_type); if (ispasv! = null && ispasv) {logger.debug ("use o modo PASV para transferir o arquivo."); ftpClient.enterlocalPassivEMode (); } else {Logger.debug ("Use o modo ativo para transferir o arquivo."); ftpClient.enterlocalActiveMode (); } if (stringUtils.isblank (WorkingDirectory)) {WorkingDirectory = "/"; } Logger.debug ("Altere o diretório de trabalho atual para" + WorkingDirectory); ChangeWorkingDirectory (FTPClient, WorkingDirectory); if (isupload) {// upload if (stringUtils.isblank (serverFilestoredName)) {serverFileStoredName = filetouPload.getName (); } fileIn = new FileInputStream (FileTouPload); Logger.debug ("File de upload:" + fileTouPload.getabsolutepath () + "para servidor FTP com nome:" + serverFilestoredName); if (! ftpClient.storeFile (ServerFilestoredName, filein)) {Logger.error ("Falha ao fazer upload de arquivo" + ftpclient.getReplyString ()); } else {Logger.debug ("Sucesso para fazer upload de arquivo."); }} else {// Download // Verifique se o diretório de arquivos existe arquivo filestored = new File (localFilestoredPath); if (! filestored.getParentFile (). Exist ()) {filestored.getParentFile (). mkdirs (); } fileout = new FileOutputStream (FileStored); Logger.debug ("FILHO DOWNLOAD:" + FILENAMETODOWNLOAD + "do servidor FTP para Local:" + LocalFilestoredPath); if (! ftpClient.retrievefile (filenameToDownload, fileout)) {Logger.error ("Falha no download do arquivo" + ftpClient.getReplyString ()); } else {Logger.debug ("Sucesso para baixar o arquivo."); }} ftpClient.noop (); ftpClient.logout (); } finalmente {if (ftpClient.isconnected ()) {try {ftpclient.disconnect (); } catch (ioexception f) {}} if (filein! = null) {try {filein.close (); } catch (ioexception e) {}} if (fileout! = null) {try {fileout.close (); } catch (ioexception e) {}}} estático privado final booleano changeworkingDirectory (ftpclient ftpClient, string workingDirectory) lança ioexception {if (! para (int i = 0; i <paths.length; i ++) {if (! "". Equals (caminhos [i])) {if (! ftpClient.ChangeWorkingDirectory (Paths [i])) {ftpcient.Makedirectory (caminhos [i]); ftpClient.ChangeWorkingDirectory (caminhos [i]); }}} retorna true; } public static final void upload (map <string, object> servercfg, string filepathoupload, string filestoredPath, string filestoredName) lança demãos, ioexception {upload (servercfg, novo arquivo (filepathtouPload), filestoredPath, filestoredName); } public static final void upload (map <string, object> servercfg, arquivo fileTOUPLOAD, string filestoredPath, string filestoredName) lança a SockeTexception, ioexception {if (filestoredPath! = null &&! ". } upload (servercfg, fileTouPload, filestoredName); } upload public static final void (string filepathouPload, string filestoredPath) lança demãos, ioexception {upload (servercfg, filepathoupload, filestoredPath, ""); } public static final void upload (arquivo fileTOUPLOAD, string filestoredPath) lança Socketexception, IoException {upload (servercfg, fileTouPload, FileSoredPath, ""); } public static string valores (chave de string) {string value = prop.getProperty (key); if (value! = null) {return value; } else {return null; }}} ftp.properties
#SERVER ENDEREÇO SERVER_IP = 192.168.1.1 #SERVER PORT SERVER_PORT = 21 #ACCOUNT NOM
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.