Зачем возобновлять загрузку поврежденных файлов в приложении Java? - PullRequest
0 голосов
/ 31 декабря 2018

В базовом Java-приложении My Struts реализована функция загрузки с паузой / возобновлением.позвольте мне объяснить, как работает моя загрузка, на самом деле файл (например, файл изображения, документ) будет преобразован в pdf на сервере, затем он начнет загрузку, затем без паузы он успешно загрузил файл и не был поврежден, но когда я делаю паузу и возобновляюон успешно загружает файл, но он будет поврежден pdf.Я не могу понять, чего мне не хватает.Мой код как показано ниже

{           in = new FileInputStream(f);
            int DOWNLOAD_BUFFER_SIZE = Integer.parseInt(CacheManagement.getInstance().getSystemPropertyByAlias().get("DOWNLOAD_BUFFER_SIZE").getPropertyValue());

            response.setHeader("Accept-Ranges", "bytes");
            response.setContentType("application/x-download");
            response.setHeader("Content-Disposition", "attachment; filename=\"" + fileName + "\"");
            response.setBufferSize(DOWNLOAD_BUFFER_SIZE);

            // SimpleDateFormat formatter = new SimpleDateFormat("EEE, d MMM yyyy HH:mm:ss Z");
            // Date lastModifiedDate = formatter.parse(String.valueOf(f.lastModified()));
            Date lastModifiedDate = new Date(f.lastModified());
            response.setHeader("ETag", f.length() + "_" + lastModifiedDate.getTime());
            response.setDateHeader("Last-Modified", lastModifiedDate.getTime());

            String range = request.getHeader("Range");
            if (range != null && !range.isEmpty())
            {
                ArrayList<Range> ranges = getRangeList(range, f.length());
                Range r = ranges.get(0);
                response.setHeader("Content-Range", "bytes " + r.getStart() + "-" + r.getEnd() + "/" + r.getTotal());
                response.setHeader("Content-Length", String.valueOf(r.getLength()));
                response.setStatus(HttpServletResponse.SC_PARTIAL_CONTENT);
            }
            else
            {
                response.setHeader("Content-Length", String.valueOf(f.length()));
                response.setHeader("Content-Range", "bytes 0-" + (f.length() - 1) + "/" + f.length());
            }

            o = response.getOutputStream();
            buf = new BufferedInputStream(in);
            byte[] dataBytes = new byte[DOWNLOAD_BUFFER_SIZE];
            int readed = 0;
            while ((readed = buf.read(dataBytes)) != -1)
            {
                try
                {
                    o.write(dataBytes, 0, readed);
                }
                catch (Exception e)
                {
                    // System.out.println("-- Client Aborted Download --");
                    logger.error("-- Client Aborted Download --");
                    break;
                }
            } 

1 Ответ

0 голосов
/ 31 декабря 2018

Не используйте buf = new BufferedInputStream (in); для чтения оставшихся байтов, вам нужно использовать RandomAccessFile class и seek () метод дляначать загрузку с оставшимися байтами.

    RandomAccessFile raFile = new RandomAccessFile(f, "r");
    o = response.getOutputStream();
    // buf = new BufferedInputStream(in);
    byte[] dataBytes = new byte[DOWNLOAD_BUFFER_SIZE];
    int readed;
    raFile.seek(r.getStart());
    while ((readed = raFile.read(dataBytes)) != -1)
    {
        try
        {
            o.write(dataBytes, 0, readed);
        }
        catch (Exception e)
        {
            logger.error("-- Client Aborted Download --");
            break;
        }
    }
...