java - Carga básica de archivos en GWT
google-app-engine file-upload (5)
A menos que ya esté usando otros frameworks, le sugiero que use el GWT simple de vainilla y sus componentes nativos. Si usa otros marcos, puede explotar enormemente el tamaño de su aplicación.
El uso de los componentes nativos se puede hacer en 3 pasos:
- Crear un servlet de carga de archivos
- Modificar web.xml
- Haga un formulario de carga de GWT
Curiosamente, la parte de GWT es la más fácil. Puede copiar mi código en GWT Upload en 3 sencillos pasos si lo desea. Feliz carga!
Estoy intentando descubrir cómo cargar un archivo usando el widget GWTs FileUpload. Estoy usando GWT y Google AppEngine con Java, pero me gustaría cargar el archivo a mi propio servidor Linux. Ya tengo el siguiente código, pero ahora no puedo encontrar la manera de enviar mi archivo al servidor de Google AppServer y guardarlo en otro 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;
}
}
Ahora, ¿qué debo hacer después? ¿Qué debo poner en web.xml y cómo escribo mi servlet para poder almacenar el archivo y devolver la URL de ese objeto (si es posible)?
Aquí está el código de mi aplicación:
1) Creé una clase para aceptar la solicitud 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) Luego en mi web.xml agregué estas líneas:
<servlet>
<servlet-name>fileUploaderServlet</servlet-name>
<servlet-class>com.testapp.server.FileUpload</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>fileUploaderServlet</servlet-name>
<url-pattern>/testapp/fileupload</url-pattern>
</servlet-mapping>
3) Y para form.action hizo esto:
form.setAction(GWT.getModuleBaseURL()+"fileupload");
Aquí tienes una carga completa de archivos GWT con la barra de progreso
Aquí puedes DOWNLOAD la fuente
En GWT, puede publicar el archivo en el servidor utilizando métodos de formulario http, y debe usar el HttpServlet suministrado para aceptar y guardar los datos como blogs binarios en el Appengine BigTable.
Luego, necesita un segundo HttpServlet para leer el archivo de bigtable, FIJE EL TIPO MIME EN EL ENCABEZADO HTTP {y las opciones de almacenamiento en caché}, y luego transmita el archivo al usuario.
Aunque RPC no se necesita NECESARIAMENTE, debe informar al cliente qué es el ID de archivo generado para que pueda acceder a él {a menos que desee permitir que el usuario proporcione el ID y obligarlo a preocuparse por el reemplazo de nombre ... ... ick} . O puede usar rpc para solicitar una lista de / id única (como "la nueva ID de archivo por usuario"}, o puede devolver esa identificación en el cuerpo de la respuesta de UploadServlet ... pero luego debe asegurarse de que su destino de publicación es un iframe in-page, encuesta para asegurarse de que el iframe tenga un cuerpo entre el evento de envío y la respuesta real del servidor, y luego analizar y usar ese id en gwt para crear una img o etiqueta de objeto que use el archivo.
La parte clave es tener un servlet para cargar y otro para descargar. Recuerde, BigTable simplemente almacena blobs binarios, por lo que también necesita que su entidad de datos tenga un tipo de mimo / contenido que pueda leerse desde el archivo de entrada {¡nunca confíe en las extensiones de archivo!}. Además, hay 1MB por entidad en BigTable, y un límite de solicitud de 10MB para cuentas gratuitas. Es posible que desee que su entidad de datos contenga una lista de 1-10 blobs, cada uno de los cuales tiene un máximo de 1024 bytes.
Básicamente, su mejor opción es encontrar una copia gratuita y funcional, como el Servicio de archivos de Google, y ampliarla para aprender cómo funciona el sistema.
Si lo desea, publicaré mi propia versión de código abierto de manejo de archivos, una vez que termine los widgets de control de gwt y pueda considerar todo lo suficientemente estable como para ser útil para cualquier persona. Envíe un mensaje de correo electrónico a ATiy aiyx DOT info si desea que le envíe un tarro de código de betalicious.