View Javadoc

1   /*
2    * Criado em 20/01/2005
3    *
4    */
5   package comum.util;
6   
7   import java.io.File;
8   import java.text.SimpleDateFormat;
9   import java.util.ArrayList;
10  import java.util.Date;
11  import java.util.Iterator;
12  import java.util.List;
13  
14  import javax.servlet.http.HttpServletRequest;
15  
16  import org.apache.commons.fileupload.FileItem;
17  import org.apache.commons.fileupload.disk.DiskFileItemFactory;
18  import org.apache.commons.fileupload.servlet.ServletFileUpload;
19  
20  /**
21   * @author felipev
22   * @since N/C
23   * @version N/C
24   */
25  public class FileUpload extends org.apache.commons.fileupload.FileUpload {
26          
27      
28      /**
29       * Salva um FileItem no path especificado.<br>
30       * 
31       * @author felipev
32       * @since 20/01/2005
33       * @version N/C
34       * @param FileItem arquivo
35       * @param String path
36       * @throws Exception
37       */
38      public static File salvarNoDisco(FileItem arquivo, String path) throws Exception{
39          // extrai os diretorios do nome do arquivo
40          File caminho = new File(path.substring(0, path.lastIndexOf("/")));
41          File file = new File(path);
42          
43          // se o diretorio nao existir, cria-o
44          if (!caminho.isDirectory())
45              caminho.mkdirs();
46          
47          /*
48           * Referente ao Bug 2714 - item 3
49           */
50          if (file.exists()){
51          	String formato = "ddMMyyyyHHmmssSSS";
52              SimpleDateFormat formatter = new SimpleDateFormat(formato);
53              
54          	String novoCaminho = path.substring(0, path.lastIndexOf("/")) + "/" + formatter.format(new Date()) + " - " + file.getName();
55          	File fileRenomeado = new File(novoCaminho);
56          	file = fileRenomeado;
57          }
58          
59          arquivo.write(file);
60          return file;
61      }
62      
63      /**
64       * Apaga arquivo especificado se esse existir.<br>
65       * 
66       * @author N/C
67       * @since N/C
68       * @version N/C
69       * @param String fileName
70       * @return boolean
71       * @throws Exception
72       */
73      public static boolean apagarArquivo(String fileName) throws Exception{
74          File arquivo = new File(fileName);
75          if (arquivo.exists()){
76          	return arquivo.delete();
77          }
78          else{
79          	return true;
80          }
81      }
82      
83      /**
84       * Cria uma lista de campos do tipo FileItem a partir do request multipart/mixed.<br>
85       * 
86       * @author N/C
87       * @since N/C
88       * @version N/C
89       * @param HttpServletRequest request
90       * @return List
91       * @throws Exception
92       */
93      public static List criaListaCampos(HttpServletRequest request) throws Exception{
94      	ServletFileUpload upload = new ServletFileUpload(new DiskFileItemFactory());
95          List items = upload.parseRequest(request);
96          return items;
97      }
98          
99      /**
100      * Retorna o valor de um campo passado por request ( M�todo para ser usado em formul�rios de upload).<br>
101      * Um formulario de upload possui campos de form simples e campos de upload propriamente ditos.<br>
102      * Utilizando isFormField() pode-se disntinguir entre os dois tipos.<br>
103      * 
104      * @author N/C
105      * @since N/C
106      * @version N/C
107      * @param List items		- a lista de campos FileItem do request
108      * @param String campo		- o nome do campo que se quer obter o valor (seu conteudo)
109      * @return String
110      * @throws Exception
111      */
112     public static String verificaValorCampo(List items, String campo) throws Exception{
113         Iterator it = items.iterator();         
114         while(it.hasNext()){
115             FileItem fileItem = (FileItem) it.next();             
116             if(fileItem.isFormField()){                             
117                 if(fileItem.getFieldName()!=null && fileItem.getFieldName().equals(campo)){
118                     return Util.normalizaQuebraDeLinha(fileItem.getString());             
119                 }
120             }                           
121         }   
122         return "";             
123     }
124     
125     
126     /**
127      * Retorna o valor de um campo passado por request ( M�todo para ser usado em formul�rios de upload).<br>
128      * Um formulario de upload possui campos de form simples e campos de upload propriamente ditos.<br>
129      * Utilizando isFormField() pode-se disntinguir entre os dois tipos.<br>
130      * 
131      * @author N/C
132      * @since N/C
133      * @version N/C
134      * @param List items		- a lista de campos FileItem do request
135      * @param String campo		- o nome do campo que se quer obter o valor (seu conteudo)
136      * @return String
137      * @throws Exception
138      */
139     public static Date verificaValorCampoDataBanco(List items, String campo) throws Exception{
140     	String valor = verificaValorCampo(items, campo);
141     	if ((valor != null) && (!"".equals(valor))) {
142             try {
143             	return(new Date(valor.substring(6)+"/"+valor.substring(3,5)+"/"+valor.substring(0,2)));
144             } catch (Exception e) {
145                 return(null);
146             }
147 		} else {
148 	        return(null);
149 		}
150 		   
151 	}
152     
153     
154     /** 
155      * Se o campo n�o existir retorna null.<br>
156      * Retorna o valor de um campo passado por request ( M�todo para ser usado em formul�rios de upload).<br>
157      * Um formulario de upload possui campos de form simples e campos de upload propriamente ditos.<br>
158      * Utilizando isFormField() pode-se disntinguir entre os dois tipos.<br>
159      * 
160      * @author N/C
161      * @since N/C
162      * @version N/C
163      * @param List items		- a lista de campos FileItem do request
164      * @param String campo		- o nome do campo que se quer obter o valor (seu conteudo)
165      * @return String
166      * @throws Exception
167      */
168     public static String verificaValorCampoNull(List items, String campo) throws Exception{
169         Iterator it = items.iterator();         
170         while(it.hasNext()){
171             FileItem fileItem = (FileItem) it.next();             
172             if(fileItem.isFormField()){                             
173                 if(fileItem.getFieldName()!=null && fileItem.getFieldName().equals(campo)){
174                     if("".equals(fileItem.getString()))
175                         return null;
176                     else
177                         fileItem.getString();
178                 }
179             }                           
180         }   
181         return null;             
182     }
183     
184     /**
185      * Retorna um array com valores de um campo passado por request 
186      * ( M�todo para ser usado em formul�rios de upload).<br>
187      * Para ser usado quando se deseja retornar na forma de array valores de campos que tenham o mesmo nome 
188      * em um formulario.<br>
189      * Um formulario de upload possui campos de form simples e campos de upload propriamente ditos.
190      * Utilizando isFormField() pode-se disntinguir entre os dois tipos.<br>
191      * 
192      * @author N/C
193      * @since N/C
194      * @version N/C
195      * @param List items		- a lista de campos FileItem do request
196      * @param String campo		- o nome do campo que se quer obter o valor (seu conteudo)
197      * @return Object[]
198      * @throws Exception
199      */
200     public static Object[] verificaValorCampoArray(List items, String campo) throws Exception{
201         List retorno = new ArrayList();
202         Iterator it = items.iterator();         
203         while(it.hasNext()){
204             FileItem fileItem = (FileItem) it.next();             
205             if(fileItem.isFormField()){                             
206                 if(fileItem.getFieldName()!=null && fileItem.getFieldName().equals(campo)){
207                     retorno.add(fileItem.getString());             
208                 }
209             }                           
210         }   
211         return retorno.toArray();             
212     }
213     
214     
215     
216     
217     /**
218      * Devolve o nome original do arquivo como � conhecido pelo sistema de arquivos do lado do cliente.<br>
219      * Na maioria das vezes devolve apenas o nome do arquivo.<br> Dependendo do browser, devolve o path + o nome
220      * do arquivo.<br> Este m�todo garante que somente ser� devolvido o nome do arquivo. (sem path)
221      * 
222      * @author ..., rogerio
223      * @since N/C
224      * @version 0.1, 05/03/2007 
225      * @param FileItem arquivo
226      * @return String		- String do nome do arquivo.
227      */
228     public static String getNomeArquivo(FileItem arquivo) {
229         String nomeArquivo = arquivo.getName();
230         
231         /* tratamento especial para getName no MSWIndows 
232          * no windows: getName() retorna c:\pasta\pasta\arquivo.xyz
233          * no linux: getname() retorna arquivo.xyz
234          */
235         if(nomeArquivo.lastIndexOf("\\") != -1) {
236             nomeArquivo = nomeArquivo.substring(nomeArquivo.lastIndexOf("\\") + 1); 
237         } else if (nomeArquivo.lastIndexOf("/") != -1)     // pode ser que aconteca no linux tb
238             nomeArquivo = nomeArquivo.substring(nomeArquivo.lastIndexOf("/") + 1);
239 
240         return nomeArquivo;
241     }
242     
243     /**
244      * Dado um caminho f�sico completo de um arquivo e seu contexto, retorna a string a partir do contexto.<br>
245      * Ex: pathFisico = /home/garten/projetos/eclipse/ecar/upload/imagem.jpg<br>
246      *     contextName = /ecar<br>
247      * Retorna: /ecar/upload/imagem.jpg<br>
248      * Utilizado para montar links em paginas jsp utilizando um caminho fixo de onde est� o arquivo.<br>
249      * 
250      * @author N/C
251      * @since N/C
252      * @version N/C
253      * @param String pathFisico
254      * @param String contextName
255      * @return String 
256      */
257     public static String getPathLogico(String pathFisico, String contextName) {
258     	if(pathFisico.indexOf(contextName)!= -1)
259     		return pathFisico.substring(pathFisico.indexOf(contextName), pathFisico.length());
260     	else 
261     		return "";
262     }
263     
264     /**
265      * A partir do caminho fisico desde a raiz at� o contexto, devolve um caminho fisico NORMALIZADO.<br>
266      * As barras usados pelo windows ser�o trocadas por /.<br>
267      * 
268      * @author N/C
269      * @since N/C
270      * @param String realPath		- caminho desde a raiz
271      * @param String caminho		- caminho a aprtir do contexto
272      * @param String nomeArquivo	- nome do arquivo (apenas o nome)<br>
273      * Ex: realPath = /home/garten/eclipse/ecar<br>
274      * caminho = /upload<br>
275      * arquivo = /imagem.jpg<br> 
276      * @return String				- caminho fisico completo.<br>
277      * Ex: /home/garten/eclipse/ecar/upload/imagem.jpg<br>
278      */
279     public static String getPathFisico(String realPath, String caminho, String nomeArquivo){
280     	
281     	StringBuffer retorno = new StringBuffer();
282     	realPath = realPath.replaceAll("\\\\", "/");               
283 
284         /* se existir um nome, concatena a '/' antes */
285         if (!"".equals(nomeArquivo))
286             nomeArquivo = "/" +  nomeArquivo;
287         
288        	retorno.append(realPath);
289        	retorno.append(caminho);
290        	retorno.append(nomeArquivo);
291        
292        	return retorno.toString();
293     }
294 }