Как получить zip-файл в ответ на весеннюю загрузку Java? - PullRequest
0 голосов
/ 02 апреля 2019

Я пишу код, который захватывает хранилище файлов в базе данных и отправляет его в ответ клиенту.Но когда я нажимаю кнопку загрузки, он отправляет пустой текстовый файл в качестве ответа, но мне нужен zip-файл.Где я делаю не так?Может ли кто-нибудь помочь с этим?

У меня есть поиск по сети и даже по stackoverflow, но я не нашел удачи.

Метод, который захватывает все загруженные файлы

public List<Filestore> documentCollectionBvg(Application app){
        List<Filestore> candidateDocuments = new ArrayList<>();
        Filestore profilePic = app.getCandidate().getProfilePic();
        if(profilePic!=null){
        candidateDocuments.add(profilePic);}
        Filestore panDoc = app.getCandidate().getPanDocument();
        if(panDoc!=null){
        candidateDocuments.add(panDoc);}
        Filestore aadharDoc = app.getCandidate().getAadhaarDocument();
        if(aadharDoc!=null){
            candidateDocuments.add(aadharDoc);
        }
        Filestore salarySlip = app.getCandidate().getSalarySlipDocument();
        if(salarySlip!=null){
        candidateDocuments.add(salarySlip);}
        Filestore passportDoc = app.getCandidate().getPassportDocument();
        if(passportDoc!=null){
        candidateDocuments.add(passportDoc);}
        return candidateDocuments;
}

controller

@GetMapping(value = "application/get-file", produces = MediaType.APPLICATION_OCTET_STREAM_VALUE)
    public @ResponseBody byte[] getFile(@RequestParam("appId")String appId) throws IOException {
        NDataUtils nDataUtils=new NDataUtils();
        Application app=applicationService.findByEncryptedId(appId);
        BgvDocumentsDownload bgv=new BgvDocumentsDownload();
        List<Filestore> srcFiles=bgv.documentCollectionBvg(app);
        FileOutputStream fos = new FileOutputStream("multiCompressed.zip");
        ZipOutputStream zipOut = new ZipOutputStream(fos);
        FileInputStream fis=null;
        for (Filestore srcFile : srcFiles) {
            File fileToZip = new File(nDataUtils.getnDataPath()+srcFile.getFullFilePath());
            fis = new FileInputStream(fileToZip);
            ZipEntry zipEntry = new ZipEntry(fileToZip.getName());
            zipOut.putNextEntry(zipEntry);

            byte[] bytes = new byte[1024];
            int length;
            while((length = fis.read(bytes)) >= 0) {
                zipOut.write(bytes, 0, length);
            }
        }
        zipOut.close();
        fos.close();
        return IOUtils.toByteArray(fis);
    }

Здесь NDataUtils - это класс, который возвращает путь для where.Так что не запутайтесь с ним.

После того, как я нажму на ссылку для скачивания, файл с именем "download" будет загружен, который будет просто текстовым файлом и будет пустым.

Если кто-то может помочь, это будет мило с вашей стороны.

Ответы [ 2 ]

1 голос
/ 02 апреля 2019

Надеюсь, это поможет, здесь fileLocation - это мой абсолютный путь к файлу, вы можете настроить свой путь отдельным методом.

public byte[] exportDocument(final String fileLocation, final String aEngineName, final String aJobId,
      HttpServletResponse response)
      throws IOException
  {
    String tempFileName = aEngineName + "_" + aJobId + ".zip";
    response.addHeader("Content-Disposition", "attachment; filename=\"" + tempFileName + "\"");
    LOG.info("Zipping of File Started");
    //creating byteArray stream, make it bufferable and passing this buffer to ZipOutputStream
    ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
    BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(byteArrayOutputStream);
    ZipOutputStream zipOutputStream = new ZipOutputStream(bufferedOutputStream);

    ArrayList<File> files = new ArrayList<>();

    File folder = new File(fileLocation + "/out");
    File[] listOfFiles = folder.listFiles();
    if (listOfFiles != null)
    {
      for (int i = 0; i < listOfFiles.length; i++)
      {
        if (listOfFiles[i].isFile())
        {
          files.add(new File(listOfFiles[i].getAbsolutePath()));
        }
      }
    }

    //packing files
    for (File file : files) {
      //new zip entry and copying inputstream with file to zipOutputStream, then closing streams
        zipOutputStream.putNextEntry(new ZipEntry(file.getName()));
        FileInputStream fileInputStream = new FileInputStream(file);

        IOUtils.copy(fileInputStream, zipOutputStream);

        fileInputStream.close();
        zipOutputStream.closeEntry();
    }

    if (zipOutputStream != null)
    {
      zipOutputStream.finish();
      zipOutputStream.flush();
      IOUtils.closeSilently(zipOutputStream);
    }
    IOUtils.closeSilently(bufferedOutputStream);
    IOUtils.closeSilently(byteArrayOutputStream);

    return byteArrayOutputStream.toByteArray();
  }

И RestController

@RequestMapping(value = "/export/{engineName}/{jobId}", produces = MediaType.APPLICATION_OCTET_STREAM_VALUE, method = RequestMethod.GET)
  public byte[] exportDocument(@PathVariable("jobId") final @Nonnull String aJobId,
      @PathVariable("engineName") final @Nonnull String aEngineName, HttpServletResponse aResponse)
      throws Exception
  {
....
 byte[] output = mDataExportComponent.exportDocument(fileLocation, aEngineName, aJobId, aResponse);
return output;
 .... }
0 голосов
/ 02 апреля 2019

Может быть, вы можете написать это прямо в ответе.Это может быть что-то вроде этого (не проверено):

@GetMapping(value = "application/get-file", produces = MediaType.APPLICATION_OCTET_STREAM_VALUE)
public void getFile(@RequestParam("appId") String appId, final HttpServletResponse response) throws IOException
{
    String fileName = "multiCompressed.zip";
    NDataUtils nDataUtils = new NDataUtils();
    Application app = applicationService.findByEncryptedId(appId);
    BgvDocumentsDownload bgv = new BgvDocumentsDownload();
    List<Filestore> srcFiles = bgv.documentCollectionBvg(app);
    FileOutputStream fos = new FileOutputStream(fileName);
    ZipOutputStream zipOut = new ZipOutputStream(fos);
    FileInputStream fis = null;
    for (Filestore srcFile : srcFiles)
    {
        File fileToZip = new File(nDataUtils.getnDataPath() + srcFile.getFullFilePath());
        fis = new FileInputStream(fileToZip);
        ZipEntry zipEntry = new ZipEntry(fileToZip.getName());
        zipOut.putNextEntry(zipEntry);

        byte[] bytes = new byte[1024];
        int length;
        while ((length = fis.read(bytes)) >= 0)
        {
            zipOut.write(bytes, 0, length);
        }
    }
    zipOut.close();
    fos.close();

    try{
        response.setHeader("Content-Disposition", "attachment; filename=" + fileName);
        byte[] content = IOUtils.toByteArray(fis);
        out = response.getOutputStream();
        out.write(content, 0, content.length);
        out.flush();
    }
    catch (final Exception e)
    {
        if (!response.isCommitted())
        {
            response.setStatus(HttpURLConnection.HTTP_BAD_REQUEST);
        }
    }
    finally
    {
        if (out != null)
        {
            out.close();
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...