Upload de arquivo básico no GWT

Eu estou tentando descobrir como fazer upload de um arquivo usando o widget FileUpload GWTs. Estou usando o GWT e o Google AppEngine com o Java, mas gostaria de carregar o arquivo em meu próprio servidor Linux. Já tenho o seguinte código, mas agora não consigo descobrir como enviar meu arquivo para o servidor do Google AppServer e salvá-lo em outro servidor:

public class FileUploader{ private ControlPanel cp; private FormPanel form = new FormPanel(); private FileUpload fu = new FileUpload(); public FileUploader(ControlPanel cp) { this.cp = cp; this.cp.setPrimaryArea(getFileUploaderWidget()); } @SuppressWarnings("deprecation") public Widget getFileUploaderWidget() { form.setEncoding(FormPanel.ENCODING_MULTIPART); form.setMethod(FormPanel.METHOD_POST); // form.setAction(/* WHAT SHOULD I PUT HERE */); VerticalPanel holder = new VerticalPanel(); fu.setName("upload"); holder.add(fu); holder.add(new Button("Submit", new ClickHandler() { public void onClick(ClickEvent event) { GWT.log("You selected: " + fu.getFilename(), null); form.submit(); } })); form.addSubmitHandler(new FormPanel.SubmitHandler() { public void onSubmit(SubmitEvent event) { if (!"".equalsIgnoreCase(fu.getFilename())) { GWT.log("UPLOADING FILE????", null); // NOW WHAT???? } else{ event.cancel(); // cancel the event } } }); form.addSubmitCompleteHandler(new FormPanel.SubmitCompleteHandler() { public void onSubmitComplete(SubmitCompleteEvent event) { Window.alert(event.getResults()); } }); form.add(holder); return form; } } 

Agora, o que preciso fazer a seguir? O que eu preciso colocar em web.xml e como eu escrevo meu servlet para que eu possa armazenar o arquivo e retornar url desse object (se possível)

Aqui está o código do meu aplicativo:

1) Eu criei uma class para aceitar o pedido http:

 import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.commons.fileupload.FileItemIterator; import org.apache.commons.fileupload.FileItemStream; import org.apache.commons.fileupload.servlet.ServletFileUpload; public class FileUpload extends HttpServlet{ public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { ServletFileUpload upload = new ServletFileUpload(); try{ FileItemIterator iter = upload.getItemIterator(request); while (iter.hasNext()) { FileItemStream item = iter.next(); String name = item.getFieldName(); InputStream stream = item.openStream(); // Process the input stream ByteArrayOutputStream out = new ByteArrayOutputStream(); int len; byte[] buffer = new byte[8192]; while ((len = stream.read(buffer, 0, buffer.length)) != -1) { out.write(buffer, 0, len); } int maxFileSize = 10*(1024*1024); //10 megs max if (out.size() > maxFileSize) { throw new RuntimeException("File is > than " + maxFileSize); } } } catch(Exception e){ throw new RuntimeException(e); } } } 

2) Em seguida, no meu web.xml, adicionei estas linhas:

  fileUploaderServlet com.testapp.server.FileUpload   fileUploaderServlet /testapp/fileupload  

3) E para form.action fez isso:

 form.setAction(GWT.getModuleBaseURL()+"fileupload"); 

Eu sugeriria usar o GWTUpload porque é simples de usar e estender. Você pode adicioná-lo ao seu projeto em menos de 10 minutos e ele suporta o GAE imediatamente (usando o GWTUpload-GAE). Veja os exemplos de alguns cenários comuns de uso.

No GWT, você pode postar o arquivo no servidor usando os methods de formulário http, e você deve usar o HttpServlet fornecido para aceitar e salvar os dados como blogs binários no BigTable da Appengine.

Em seguida, você precisa de um segundo HttpServlet para ler o arquivo do bigtable, SET THE MIME TYPE IN HTTP HEADER {e opções de armazenamento em cache} e, em seguida, transmitir o arquivo para o usuário.

Embora o RPC não seja NECESSARIAMENTE necessário, você deve permitir que o cliente saiba o que é gerado pelo fileId para poder acessá-lo {a menos que você deseje permitir que o usuário forneça o ID e forçá-lo a se preocupar com substituições de nome … … ick} . Ou você pode usar o rpc para solicitar uma lista de / id único {como “o ID do arquivo mais novo pelo usuário”}, ou pode retornar esse id no corpo da resposta do UploadServlet … mas você deve garantir que o seu destino seja publicado é um iframe in-page, poll para garantir que o iframe tenha um corpo entre o evento submit e a resposta real do servidor e, em seguida, analise e use esse id em gwt para criar uma tag img ou object que use o arquivo.

A parte principal é ter um servlet para upload e outro para download. Lembre-se, BigTable apenas armazena blobs binários, então você também precisa que sua entidade de dados tenha um tipo mime / content que possa ser lido a partir do arquivo de input {nunca confie em extensões de arquivo!}. Além disso, há um 1 MB por entidade no BigTable e um limite de solicitações de 10 MB para contas gratuitas. Você pode querer que sua entidade de dados contenha uma lista de 1-10 blobs, cada um com um máximo de 1024 bytes.

Basicamente, sua melhor aposta é encontrar uma cópia gratuita e funcionando, como o Serviço de Arquivos do Google, e estendê-la para aprender como o sistema funciona.

Se você quiser, eu estarei postando minha própria versão open-source do tratamento de arquivos, uma vez que eu termine os widgets de controle gwt e considere tudo estável o suficiente para ser útil para qualquer um. E-mail x AT aiyx PONTO informação se você quiser que eu lhe envie um jarro de código betalicious.

A menos que você já esteja usando outras estruturas, sugiro fortemente usar o GWT simples e seus componentes nativos. Se você usa outras estruturas, pode explodir o tamanho da sua aplicação muito.

Usando os componentes nativos pode ser feito em 3 etapas:

  1. Crie um servlet de upload de arquivo
  2. Modifique o web.xml
  3. Fazer um formulário de upload do GWT

Curiosamente, a parte do GWT é a mais fácil. Você pode copiar meu código no GWT Upload em 3 etapas fáceis, se desejar. Upload feliz!

Aqui você vai com um upload de arquivo completo do GWT com a barra de progresso

insira a descrição da imagem aqui

Aqui você pode baixar a fonte