I use Apache FileUpload to manage the process:
http://commons.apache.org/fileupload/
Here's the doPost() method from my FileUploadServelet:
@Override
public void doPost(HttpServletRequest p_request,
HttpServletResponse p_response)
throws ServletException, IOException
{
ServletFileUpload upload = new ServletFileUpload();
/*
* This tracks the state of the upload progress. The client
will
* occasionally request a progress update; the doGet() method
* returns this information to the client in an XML structure.
*/
FileUploadProgress progress = new FileUploadProgress();
HttpSession session = p_request.getSession();
session.setAttribute("progress", progress);
upload.setProgressListener(progress);
try
{
FileItemIterator iter = upload.getItemIterator(p_request);
StringBuilder response = new StringBuilder();
Integer id = null;
while (iter.hasNext())
{
FileItemStream item = iter.next();
String name = item.getFieldName();
InputStream stream = item.openStream();
if (item.isFormField())
{
String value = Streams.asString(stream);
if ("id".equals(name))
{
id = Integer.valueOf(value);
}
if ("saveAs".equals(name))
{
if (id == null)
{
p_response.sendError(SC_INTERNAL_SERVER_ERROR,
"No filesystem id for " + name + " " +
value);
return;
}
File f =
ClientFileSystemBridge.createTempFile(value);
ClientFileSystemBridge.put(id, value, f);
}
response.append(name).append(' ')
.append(value).append('\n');
}
else
{
String filename = item.getName();
if (id == null)
{
p_response.sendError(SC_INTERNAL_SERVER_ERROR,
"No filesystem id for file " + filename);
return;
}
File f =
ClientFileSystemBridge.createTempFile(filename);
OutputStream out = new FileOutputStream(f);
try
{
// This WILL fail with
org.mortbay.jetty.EofException
// if the client form disappears before we've
read the
// entire stream.
int bytes;
byte buf[] = new byte[32768];
while ((bytes = stream.read(buf)) > 0)
out.write(buf, 0, bytes);
}
catch (Throwable t)
{
p_response.sendError(SC_INTERNAL_SERVER_ERROR,
t.getClass().getName() + " " +
t.getMessage());
t.printStackTrace();
}
finally
{
out.close();
stream.close();
}
ClientFileSystemBridge.put(id, filename, f);
response.append(name).append(' ').
append(f.length()).append(' ').
append(filename).append('\n');
}
}
String message = response.toString();
p_response.reset();
p_response.setContentType("text/plain");
p_response.setContentLength(message.length());
Writer writer = p_response.getWriter();
writer.append(message);
writer.flush();
}
// catch (FileUploadException e)
// {
// p_response.sendError(SC_INTERNAL_SERVER_ERROR,
e.getMessage());
// e.printStackTrace();
// }
catch (Throwable e)
{
p_response.sendError(SC_INTERNAL_SERVER_ERROR,
e.getMessage());
e.printStackTrace();
}
}
And a helper function for reporting progress:
import org.apache.commons.fileupload.ProgressListener;
public class FileUploadProgress implements ProgressListener
{
private volatile long m_bytesRead;
private volatile long m_contentLength;
private volatile int m_item;
public FileUploadProgress()
{
super();
}
public void update(long p_bytesRead, long p_contentLength, int
p_item)
{
m_bytesRead = p_bytesRead;
m_contentLength = p_contentLength;
m_item = p_item;
}
public long getBytesRead()
{
return m_bytesRead;
}
public long getContentLength()
{
return m_contentLength;
}
public int getItem()
{
return m_item;
}
}
On Mar 2, 5:26 am, Leonardo Terrão <leonardoter...@gmail.com> wrote:
> Hello everybody!
>
> Following are some examples found right here in the discussion group
> took two classes below.
>
> In my class I have ArquivoUpload umTextBox a form with a ListBox and a
> FileUpload. In class FileUploadServlet're getting only the data from
> the FileUpload. Could someone help me also take the data from the
> TextBox?
> In debug mode I see everything that is in the form of the request but
> I can not extract the values.
>
> public class ArquivoUpload implements EntryPoint {
>
> public static final String UPLOAD_ACTION_URL = GWT.getModuleBaseURL()
> + "upload";
>
> @Override
> public void onModuleLoad() {
>
> // Cria um FormPanel e apontá-lo para um serviço.
> final FormPanel form = new FormPanel();
> form.setAction(UPLOAD_ACTION_URL);
>
> // Porque nós vamos adicionar um widget FileUpload, vamos precisar
> para
> // definir o
> // Form usar o método POST, e codificação MIME multipart.
> form.setEncoding(FormPanel.ENCODING_MULTIPART);
> form.setMethod(FormPanel.METHOD_POST);
>
> // Cria um painel para conter todos os elementos do formulário.
> VerticalPanel panel = new VerticalPanel();
> form.setWidget(panel);
>
> // Criar um TextBox, dando-lhe um nome para que ele será submetido.
> final TextBox tb = new TextBox();
> tb.setName("TextBoxFormElement");
> panel.add(tb);
>
> // Criar um ListBox, dando-lhe um nome e alguns valores que devem
> ser
> // associados
> // Com suas opções.
> ListBox lb = new ListBox();
> lb.setName("listBoxFormElement");
> lb.addItem("foo", "fooValue");
> lb.addItem("bar", "barValue");
> lb.addItem("baz", "bazValue");
> panel.add(lb);
>
> // Criar um widget FileUpload.
> final FileUpload upload = new FileUpload();
> upload.setName("uploadFormElement");
> panel.add(upload);
>
> panel.add(new UploadForm());
>
> // Adicionar um botão 'Enviar'.
> panel.add(new Button("Submit", new ClickHandler() {
> public void onClick(ClickEvent event) {
> form.submit();
> }
> }));
>
> //Adicionar um manipulador de eventos para o formulário.
> form.addSubmitHandler(new FormPanel.SubmitHandler() {
>
> @Override
> public void onSubmit(SubmitEvent event) {
>
> if (upload.getFilename().equals("")) {
> event.cancel();
> return;
> }
>
> //Este evento é disparado pouco antes do formulário é submetido.
> //Podemos aproveitar esta oportunidade para realizar a validação.
> String filename= upload.getFilename();
> int index = filename.lastIndexOf(".");
> String ext = filename.substring(index + 1);
> if (!(ext.equals("gif") || ext.equals("jpg") || ext.equals("GIF")
> || ext.equals("JPG"))){
> Window.alert("Extensão de arquivo inválida. Por favor adicione
> apenas arquivos com extensões .jpg ou .gif.");
> event.cancel();
> }
> }
> });
>
> form.addSubmitCompleteHandler(new FormPanel.SubmitCompleteHandler()
> {
> @Override
> public void onSubmitComplete(SubmitCompleteEvent event) {
> ///Quando o envio do formulário é concluída com êxito,
> //este evento é acionado. Assumindo que o serviço retornou
> //uma resposta do tipo text / html, podemos obter o texto
> resultado aqui
> //(consulte a documentação FormPanel para mais explicações).
> Window.alert(event.getResults());
> System.out.println(event.getResults());
> }
> });
> RootPanel rootPanel = RootPanel.get();
> rootPanel.add(form);
> }
>
> }
>
> public class FileUploadServlet extends HttpServlet {
>
> private static final String UPLOAD_DIRECTORIY = "C:\\uploaded\\";
>
> @Override
> protected void doGet(HttpServletRequest req, HttpServletResponse
> resp)
> throws ServletException, IOException {
> super.doGet(req, resp);
> }
>
> @SuppressWarnings("unchecked")
> @Override
> protected void doPost(HttpServletRequest req, HttpServletResponse
> resp)
> throws ServletException, IOException {
>
> // processar apenas as solicitações de várias
> if (ServletFileUpload.isMultipartContent(req)) {
>
> // Criar uma fábrica de artigos baseados em disco de arquivos
> FileItemFactory factory = new DiskFileItemFactory();
>
> // Crie um manipulador de novo upload de arquivos
> ServletFileUpload upload = new ServletFileUpload(factory);
>
> // Analisar o pedido
> try {
>
> List<FileItem> items = upload.parseRequest(req);
>
> for (FileItem item : items) {
>
> // processo só upload de arquivo - descartar outros tipos de
> // item do form
> if (item.isFormField()) continue;
>
> // pega o nome do arquivo
> String fileName = item.getName();
>
> // pega extensão do arquivo
> int index = fileName.lastIndexOf(".");
> String ext = fileName.substring(index + 1);
> ext = "." + ext;
> System.out.println(ext);
>
> // obter apenas o nome do arquivo não o caminho todo
> if (fileName != null) {
> fileName = FilenameUtils.getName(fileName);
> }
>
> File uploadedFile = new File(UPLOAD_DIRECTORIY, fileName);
> if (uploadedFile.createNewFile()) {
> item.write(uploadedFile);
> resp.setStatus(HttpServletResponse.SC_CREATED);
> resp.getWriter().println("O arquivo foi criado com sucesso.");
> resp.flushBuffer();
> } else
> throw new IOException(
> "O arquivo já existe no repositório.");
> }
>
> } catch (Exception e) {
> resp.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR,
> "Ocorreu um erro ao criar o arquivo: " + e.getMessage());
> }
>
> } else {
> resp.sendError(HttpServletResponse.SC_UNSUPPORTED_MEDIA_TYPE,
> "Tipo de conteúdo pedido não é suportado pelo servlet.");
> }
> }
>
> }
>
> Thank you!
--
You received this message because you are subscribed to the Google Groups "Google Web Toolkit" group.
To post to this group, send email to google-web-toolkit@googlegroups.com.
To unsubscribe from this group, send email to google-web-toolkit+unsubscribe@googlegroups.com.
For more options, visit this group at http://groups.google.com/group/google-web-toolkit?hl=en.
No comments:
Post a Comment