Я знаю, что это старый вопрос, но я бы хотел улучшить ответ @Charles Kendrick с помощью примера кода.
Документация SmartGWT объясняет различные способы достижения этого, мызаинтересован в этой части
Фоновая загрузка без сервера Smart GWT
Достичь фоновой загрузки файлов без использования сервера Smart GWT также возможно, хотя и значительно более продвинуто.В дополнение к описанным выше шагам, создает скрытый элемент на странице и использует DynamicForm.target , чтобы нацелить отправку формы в этом IFRAME.Чтобы получил уведомление об обратном вызове, когда загрузка завершится , после обработки загрузки файла ваш сервер должен вывести HTML-контент для IFRAME, включающий блок , который будетвыйдите из IFRAME (как правило, через глобальную «вершину» JavaScript) и вызовите глобальный метод , который вы объявили в качестве обратного вызова.
На стороне клиента
final DynamicForm frmUpload = new DynamicForm();
NamedFrame iframeUpload = new NamedFrame("iframeUpload");
iframeUpload.setVisible(false);
frmUpload.setTarget(iframeUpload.getName());
frmUpload.setEncoding(Encoding.MULTIPART);
frmUpload.setMethod(FormMethod.POST);
UploadItem itmUpload = new UploadItem("itmProveedores", "Archivo Proveedores");
frmUpload.setItems(itmUpload);
frmUpload.setAction(GWT.getHostPageBaseURL() + "api/catalogos/upload");
IButton btnUpload = new IButton("Subir archivo proveedorees");
btnUpload.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent clickEvent) {
frmUpload.submitForm();
}
});
, чтобы это работало, нам нужно зарегистрировать метод обратного вызова, используя JSNI, давайте сделаем это
private static void onFileUploadFinished(){
SC.say("upload finished");
}
private native void registerOnFileUploadFinished()/*-{
$wnd.onFileUploadFinished = @com.sample.CatalogosForm::onFileUploadFinished();
}-*/;
...
/*on the constructor, load event or main entry point -it depends on your app-*/
public CatalogosForm(){
/*initial setup*/
registerOnFileUploadFinished();
}
, наконец, на стороне сервера мы должны вернуть блок скрипта ввызвать функцию обратного вызова.В этой реализации используется Apache CXF, но важной частью является возврат тега script для вызова функции обратного вызова
import org.apache.cxf.jaxrs.ext.multipart.Attachment;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.activation.DataHandler;
import javax.servlet.http.HttpServletRequest;
import javax.ws.rs.Consumes;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.QueryParam;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.MultivaluedMap;
import javax.ws.rs.core.Response;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URI;
import java.util.List;
@Path("catalogos")
public class CatalogosREST {
private final Logger log = LoggerFactory.getLogger(CatalogosREST.class);
private String getFileName(MultivaluedMap<String, String> header) {
String[] contentDisposition = header.getFirst("Content-Disposition").split(";");
for (String filename : contentDisposition) {
if ((filename.trim().startsWith("filename"))) {
String[] name = filename.split("=");
String exactFileName = name[1].trim().replaceAll("\"", "");
return exactFileName;
}
}
return "unknown";
}
@POST
@Path("/upload")
@Consumes("multipart/form-data")
public Response uploadFile(List<Attachment> attachments, @Context HttpServletRequest request) {
log.debug("se ha recibido una peticion para subir un archivo de proveedores [attachments: {}, request: {}]", attachments, request);
Response response = null;
for (Attachment attachment : attachments) {
DataHandler handler = attachment.getDataHandler();
try {
InputStream stream = handler.getInputStream();
MultivaluedMap<String, String> map = attachment.getHeaders();
log.debug("headers: {}", map);
log.debug("fileName: {}", getFileName(map));
OutputStream out = new FileOutputStream(new File("/tmp/" + getFileName(map)));
int read = 0;
byte[] bytes = new byte[1024];
while ((read = stream.read(bytes)) != -1) {
out.write(bytes, 0, read);
}
stream.close();
out.flush();
out.close();
StringBuilder scriptOnFileUploadFinished = new StringBuilder(
"<script type=\"application/javascript\">\n" +
" window.top.onFileUploadFinished();\n" +
" </script>"
);
response = Response.ok(scriptOnFileUploadFinished.toString()).build();
} catch (Exception e) {
String error = "Ocurrio un error al subir el archivo de proveedores";
log.error(error, e);
response = Response.serverError().entity(error).build();
}
}
return response;
}
}