Загрузка файлов GWTP и Spring REST
Я работаю над проектом, в котором я скачал файл, созданный на сервере, я использую Spring на сервере:
@RestController
@RequestMapping(value = ApiPaths.FORM)
public class ExportController {
Log log = LogFactory.getLog(getClass());
@Autowired
DataExportService dataExportService;
@RequestMapping(method = GET, value = PathParameter.ID, produces = MediaType.APPLICATION_OCTET_STREAM_VALUE)
@ResponseBody public HttpEntity<byte[]> getFile(@PathVariable(RestParameter.ID) Long id) {
FileSystemResource file = null;
try {
file = dataExportService.exportData("file", id);
if (file.exists()) {
byte[] bytes = IOUtils.toByteArray(file.getInputStream());
HttpHeaders header = new HttpHeaders();
header.set("Content-Disposition", "attachment; filename=" + file.getFilename());
header.setContentLength(file.getFile().length());
return new HttpEntity<>(bytes, header);
}
} catch (IOException e) {
log.info(e.getMessage());
e.printStackTrace();
}
return new HttpEntity<>(null, new HttpHeaders());
}
}
файл генерируется просто отлично, но на стороне клиента я не могу понять, как продолжить, я попробовал это:
у меня есть этот сервис:
@Path(ApiPaths.FORM)
public interface ExportFormService {
@GET
@Path(PathParameter.ID)
RestAction<byte[]> exportformById(@PathParam(RestParameter.ID) Long id);
}
который я использую в предъявителе виджета (по нажатию кнопки):
public class DynamicFormsPresenter extends Presenter<MyView, MyProxy> implements DynamicFormsUiHandlers,
FormSavedEvent.FormSavedHandler {
@ProxyStandard
@NameToken({NameTokens.FORM, NameTokens.FORM_DETAILS})
public interface MyProxy extends ProxyPlace<DynamicFormsPresenter> {
}
public interface MyView extends View, HasUiHandlers<DynamicFormsUiHandlers> {
...
}
public static final Object FORM_BUILDER = new Object();
private final PlaceManager placeManager;
private final RestDispatch dispatcher;
private final PlaceRequest placeRequest;
private final ExportFormService exportFormService;
private final FormBuilderPresenterFactory formBuilderPresenterFactory;
@Inject
DynamicFormsPresenter(EventBus eventBus,
MyView view,
MyProxy proxy,
PlaceManager placeManager,
RestDispatch dispatcher,
PlaceRequest placeRequest,
DynamicFormService dynamicFormService,
ExportFormService exportFormService,
FormBuilderPresenterFactory formBuilderPresenterFactory) {
super(eventBus, view, proxy, EntryPresenter.SLOT_ENTRY);
this.placeManager = placeManager;
this.dispatcher = dispatcher;
this.placeRequest = placeRequest;
this.exportFormService = exportFormService;
this.formBuilderPresenterFactory = formBuilderPresenterFactory;
}
....
@Override
public void exportForm(DynamicFormVO dynamicFormVO) {
dispatcher.execute(exportFormService.exportformById(dynamicFormVO.getId()),
new AbstractAsyncCallback<byte[]>() {
@Override
public void onReceive(byte[] response) {
}
});
}
....
}
Я не знаю, что делать дальше,
ИНФОРМАЦИЯ: Я также попробовал это решение, но оно не сработало (ничего не произошло).
1 ответ
Решение
Вы не должны использовать GEST-REST Dispatch для загрузки файла. Просто добавьте рамку в вашем представлении
<g:Frame ui:field="downloadFrame" height="0" width="0" visible="false"/>
Затем установите URL-адрес фрейма на путь вашего обработчика Spring:
UrlBuilder builder = new UrlBuilder()
.setProtocol(Window.Location.getProtocol())
.setHost(Window.Location.getHost())
.setPath(ApiPaths.FORM + id);
downloadFrame.setUrl(builder.build());