Pourquoi reprendre le téléchargement de téléchargements fichier corrompu dans l'application Java?


Dans Mon application Web Java Struts base , j'ai implémenté la fonctionnalité de téléchargement avec pause/cv. permettez-moi d'expliquer comment fonctionne mon téléchargement , en fait le fichier (par exemple fichier image, doc) sera converti en pdf sur le serveur , puis il commencera à télécharger, puis sans pause, il a téléchargé avec succès le fichier et n'est pas corrompu mais quand je pause et reprends, il télécharge le fichier avec succès mais il sera corrompu pdf. Je ne peux pas comprendre ce que je suis absent . Mon code est comme ci-dessous

{           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;
                }
            } 
Author: Hooman.AS, 2018-12-31

1 answers

Ne pas utiliser buf = new BufferedInputStream(en); pour lire les octets restants, vous devez utiliser RandomAccessFile classe et seek() méthode pour démarrer le téléchargement avec les octets restants.

    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;
        }
    }
 1
Author: Ravi, 2018-12-31 13:09:16