Загрузка файлов 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());
Другие вопросы по тегам