• 🔥 Бесплатный курс от Академии Кодебай: «Анализ защищенности веб-приложений»

    🛡 Научитесь находить и использовать уязвимости веб-приложений.
    🧠 Изучите SQLi, XSS, CSRF, IDOR и другие типовые атаки на практике.
    🧪 Погрузитесь в реальные лаборатории и взломайте свой первый сайт!
    🚀 Подходит новичкам — никаких сложных предварительных знаний не требуется.

    Доступ открыт прямо сейчас Записаться бесплатно

Отдать вложение через REST сервис

duchan

Green Team
20.09.2006
130
12
есть REST сервис, туда приходит запрос с параметрами, по этим параметрам ищется документ и вложение в нём. Необходимо в ответ вернуть файл. Как сделать?
Проблема ещё в том, что документ с вложением может находится на другом сервере, не доступном по http.

Можно конечно сделать копию во временный документ на текущем сервере и отдать "прямой" урл к нему, но не хотелось бы такого (это место на диске + удалять по шедулингу эти копии документов-файлов)
 
Мы делали osgi-plugin, который так делает.
Там использовали apach http либу.
 
ещё варик - написать хэпагу (я так делал)
отдавал налету zip из нескольких файлов ищ БД, правда БД была на том же сервере, но это не принципиально
я ещё подключал ODA, для упрощения разработки....
но это опять не меняет сути
на хэпаге делал вызов класса
Java:
package com.setralubs;
import java.io.InputStream;
import java.io.PrintWriter;
import java.util.logging.Level;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.openntf.domino.xsp.XspOpenLogUtil;

import com.ibm.domino.services.ServiceException;
import com.ibm.domino.services.rest.RestServiceEngine;
import com.ibm.xsp.extlib.component.rest.CustomService;
import com.ibm.xsp.extlib.component.rest.CustomServiceBean;
public class BatchCheckService extends CustomServiceBean {
    private final String classID="::"
            + new Throwable().getStackTrace()[0].getClassName() + "::";

    @Override
    public void renderService(CustomService service, RestServiceEngine engine) throws ServiceException {
        try {
            Throwable throwable = new Throwable();
            super.renderService(service, engine);
            HttpServletRequest request = engine.getHttpRequest();
            HttpServletResponse response = engine.getHttpResponse();
            PrintWriter writer = response.getWriter();
            //JsonJavaObject jo = new JsonJavaObject();
            boolean exists=request.getParameter("exists")!=null;
            //System.out.println("id length: "+id.length());
            BatchChecker obj=new BatchChecker();
            response.setHeader("Content-Type", "application/json; charset=UTF-8");
            writer.write("{\"body\": \"");
            if(request.getContentType()!=null && request.getContentType().contains(
                    "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
                    )
                  ){
                //String ext=MIMEType.getKey(request.getContentType());
                InputStream bodyIs=request.getInputStream();

                XspOpenLogUtil.logEvent(throwable, this.classID
                        + throwable.getStackTrace()[1].getMethodName()+"(): "
                        +"Content-Type: "+request.getContentType(), Level.INFO,
                        null);
                
                response.setHeader("Content-Type", "application/json; charset=UTF-8");
                if (exists){
                    XspOpenLogUtil.logEvent(throwable, this.classID
                            + throwable.getStackTrace()[1].getMethodName()+"(): "
                            +"list for batches are existing", Level.INFO,
                            null);
                }else{
                    XspOpenLogUtil.logEvent(throwable, this.classID
                            + throwable.getStackTrace()[1].getMethodName()+"(): "
                            +"list for batches are absent", Level.INFO,
                            null);
                    //obj.testCheckingOut(writer);
                }
                obj.checking(bodyIs, writer, exists);
            }else //if(request.getContentType().contains("application/json"))
            {
                obj.testCheckingOut(writer);
            }
            writer.write("\"}");
            writer.close();
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            XspOpenLogUtil.logError(e);
        }
    }
    
}
кусок класса выводящего бинарь в поток сервлета
Java:
    /**
     * process input and write result as zip to output
     */
    public int checking2ZIP(){
        Throwable throwable = new Throwable();
        int status=HttpURLConnection.HTTP_INTERNAL_ERROR;
        InputStream is=null;
        FacesContext fc = FacesContext.getCurrentInstance();
        ExternalContext ex = fc.getExternalContext();
        HttpServletRequest request = (HttpServletRequest) ex.getRequest();
        try {
            is=request.getInputStream();
            status=HttpURLConnection.HTTP_NOT_FOUND;
            if( is!=null
                    && request.getContentType()!=null
                    && request.getContentType().contains(
                    "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet")
                    )
            {
                XspHttpServletResponse xspResponse = (XspHttpServletResponse) ex.getResponse();
                javax.servlet.http.HttpServletResponse response=xspResponse.getDelegate();
                String type=MIMEType.get("zip");
                response.setHeader("Content-Type",type);
                response.setHeader("Content-Disposition","attachment; filename=allFiles.zip");

                this.os =response.getOutputStream();
                append = new ZipOutputStream(os);
                //PoijiOptions options = PoijiOptionsBuilder.settings().sheetIndex(0).build();
                Poiji.fromExcel(is, PoijiExcelType.XLSX, BatchChecker.class, this::add2Zip);//, options, this::dbCheck);
                append.finish();
                status=HttpURLConnection.HTTP_OK;
            }
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            XspOpenLogUtil.logError(e);
        }
        return status;
    }

    private void add2Zip(BatchChecker instance){
        try{
            ViewEntry entry=view.getFirstEntryByKey(instance.batch,true);
            InputStream is=null;String fName=null;
            if (entry!=null){
                EmbeddedObject eo=entry.getDocument().getAttachments().get(0);
                if (eo!=null){
                    is=eo.getInputStream();
                    fName=eo.getName();
                }
            }
            if (is!=null) {
                ZipEntry e=new ZipEntry(fName);
                append.putNextEntry(e);
                long bc=IOUtils.copy(is, append);
                //e.setMethod(ZipEntry.STORED);
                //e.setCompressedSize(bc);
                //e.setSize(bc);
                //append.closeEntry();
                //is.close();
            }
        } catch (IOException e1) {
            e1.printStackTrace();
            //LOG.error("IO error",e1);
        }
    }
 
я проверял по переданному файлу (эхель) строки на нужные ключи, по ним собирал ентрисы, из них дергал фпайлы и складывал в зип, всё налету...
отдавал этот контент вызывающему клиенту (в моём случае вин-реквестер из эхеля)
схематично Эхель VB->запрос к серверу -> сервер парсит переданный эхель -> в ответ пихает zip -> эхель сохраняет zip в темпы (VB) и открывает в проводнике
там ещё заморочка с токенами (самописный варик проверки юзера, по токену)
 
Мы в соцсетях:

Взломай свой первый сервер и прокачай скилл — Начни игру на HackerLab

Похожие темы