복붙노트

[REDIS] 클라이언트가 즉석에서 생성되는 매우 큰 파일을 다운로드하게하는 방법

REDIS

클라이언트가 즉석에서 생성되는 매우 큰 파일을 다운로드하게하는 방법

나는 전체 데이터베이스를 읽고 모든 레코드와 .xls 파일을 만들 수출 기능을 가지고있다. 그런 다음 파일을 클라이언트로 전송됩니다.

물론, 수출의 시간은 전체 데이터베이스는 시간이 곧 시간 초과 오류로 종료됩니다 요청을 많이 필요로한다.

이 사건을 처리하는 가장 좋은 방법은 무엇입니까?

파일과 생성 된 파일을 다운로드 할 수있는 두 번째를 생성 작업을 시작하기위한 하나 나는 예를 들어 레디 스에 큐를 만드는하지만,이 두 가지 요청을 필요에 대해 뭔가를 들었습니다.

이 클라이언트에서 단일 요청을 할 수 있습니까?

해결법

  1. ==============================

    1.엑셀 내보내기 :

    엑셀 내보내기 :

    사용 스트림. 다음은 할 수 무엇을 거친 아이디어 :

    CSV 내보내기 :

    하나의 테이블 / 수집 모듈 빠른 CSV의 CSV 내보내기에 사용할 수 있습니다 :

    // response headers as usual
    res.status(200);
    res.setHeader('Content-disposition', 'attachment; filename=mytable_dump.csv');
    res.setHeader('Content-type', 'text/csv');
    
    // create csv stream
    var csv = require('fast-csv');
    var csvStr = csv.createWriteStream({headers: true});
    
    // open database stream
    var dbStr = dbDriver.query('SELECT * from mytable').stream();
    
    // connect the streams
    dbStr.pipe(csvStr).pipe(res);
    

    당신은 지금 즉시 XLS / CSV 형식으로 변환, HTTP 응답 DB에서 데이터를 스트리밍하고 있습니다. 필요가 버퍼링하거나 메모리 나 파일의 전체 데이터를 저장합니다.

  2. ==============================

    2.당신은 완료로 당신이 그것을 표시 마무리에서 바로 사용 res.write (덩어리) 및 res.end () (예를 들어 선으로 선)이 덩어리로 파일을 보낼 수 있으며, 한 번에 전체 파일을 보낼 필요가 없습니다.

    당신은 완료로 당신이 그것을 표시 마무리에서 바로 사용 res.write (덩어리) 및 res.end () (예를 들어 선으로 선)이 덩어리로 파일을 보낼 수 있으며, 한 번에 전체 파일을 보낼 필요가 없습니다.

  3. ==============================

    3.당신이 중 하나가 res.write (덩어리)를 통해 작성되는 각 개별 덩어리를 전송, 스트림으로 파일 정보를 보내거나, 덩어리하여 파일 청크를 보내는 옵션이없는 경우, 당신은 전체 파일을 기다릴 필요가 정보를 전송하기 전에, 당신은 항상 무한대 또는 파일이 생성 될 수 있도록 충분히 높은 것입니다 당신이 생각하는 값으로 시간 제한 기간을 설정하여 연결 개방을 유지할 수 있습니다. 다음 중 하나를 .xls 파일 등을 생성하는 기능을 설정합니다 :

    당신이 중 하나가 res.write (덩어리)를 통해 작성되는 각 개별 덩어리를 전송, 스트림으로 파일 정보를 보내거나, 덩어리하여 파일 청크를 보내는 옵션이없는 경우, 당신은 전체 파일을 기다릴 필요가 정보를 전송하기 전에, 당신은 항상 무한대 또는 파일이 생성 될 수 있도록 충분히 높은 것입니다 당신이 생각하는 값으로 시간 제한 기간을 설정하여 연결 개방을 유지할 수 있습니다. 다음 중 하나를 .xls 파일 등을 생성하는 기능을 설정합니다 :

    1) 준비 번 인수로 출력되는 데이터를 수신하는 콜백을 받아들이는 데이터를 전송하고 연결을 종료하거나;

    2) 그 준비를 한 번 데이터 출력과 결의 당신이 해결 된 값과 바로 콜백 버전과 같은 가까운 연결을 보낼 수 있도록한다는 약속을 돌려줍니다.

    그것은 다음과 같이 보일 것입니다 :

    function xlsRouteHandler(req, res){
      res.setTimeout(Infinity) || res.socket.setTimeout(Infinity)
    
      //callback version
      createXLSFile(...fileCreationArguments, function(finishedFile){
        res.end(finishedFile)
      })
    
      //promise version
      createXLSFile(...fileCreationArguments)
        .then(finishedFile => res.end(finishedFile))
    }
    

    당신은 아직도 자신이 시간 초과에 대해 우려 찾아내는 경우에, 당신은 항상 최종 파일 내용이 전송 될 준비가되면 서버 연결에 타임 아웃을 방지하고 그 간격을 취소 가끔 res.write () 메시지를 발송하는 간격 타이머를 설정할 수 있습니다 .

  4. ==============================

    4.이 링크를 사용 jedis (레디 스 자바 클라이언트)를 참조하십시오 이 열쇠는 LPOPRPUSH 명령입니다

    이 링크를 사용 jedis (레디 스 자바 클라이언트)를 참조하십시오 이 열쇠는 LPOPRPUSH 명령입니다

    https://blog.logentries.com/2016/05/queuing-tasks-with-redis/

  5. from https://stackoverflow.com/questions/43607411/how-to-make-the-client-download-a-very-large-file-that-is-genereted-on-the-fly by cc-by-sa and MIT license