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 }