0

スプリング コントローラーからのファイルのダウンロード

上記は元の記事ですが、サポートを再開したいと考えています。つまり、最初に 51% をダウンロードし、別の機会に別の 49% をダウンロードできます。

環境トムキャット7.0.39

私はいくつか試しましたが、それでも失敗しました。

ここに私のコードがあります、またはあなたのコードを共有することができます

            InputStream fis =new FileInputStream(filepath+file_name);

            response.setHeader("Accept-Ranges", "bytes");
            long length = (int) new File(filepath+file_name).length();
            long start = 0;

            if (request.getHeader("Range") != null) 
            {
                response.setStatus(javax.servlet.http.HttpServletResponse.SC_PARTIAL_CONTENT);// 206
                start = Long.parseLong(request.getHeader("Range")
                        .replaceAll("bytes=", "").replaceAll("-", ""));
            }

            response.setHeader("Content-Length", new Long(length - start).toString());
            if (start != 0) 
            {
                response.setHeader("Content-Range", "bytes "
                        + new Long(start).toString() + "-"
                        + new Long(length - 1).toString() + "/"
                        + new Long(length).toString());
            }

            response.setContentType("application/octet-stream");

            fis.skip(start);
            byte[] b = new byte[1024];
            int i;
            while ((i = fis.read(b)) != -1) {
                response.getOutputStream().write(b, 0, i);
                response.flushBuffer();
            }
            fis.close();

修正済み、これは私の編集済みバージョンです

long length = (int) new File(filepath+file_name).length();
                long start = 0;
                response.setHeader("Accept-Ranges", "bytes");
                response.setStatus(javax.servlet.http.HttpServletResponse.SC_PARTIAL_CONTENT);// 206
                if (request.getHeader("Range") != null) 
                {
                    int x = request.getHeader("Range").indexOf("-");
                    start = Long.parseLong(request.getHeader("Range").substring(0, x)
                            .replaceAll("bytes=", ""));
                }
                response.setHeader("Content-Length", new Long(length - start).toString());

                if(start == 0)
                    response.setHeader("Content-Range", "bytes 0-"        +new Long(length - 1).toString()+"/"+length);
                else
                    response.setHeader("Content-Range", "bytes "+start+"-"+new Long(length - 1).toString()+"/"+length);
                fis.skip(start);
                byte[] b = new byte[1024];
                int i;
                while ((i = fis.read(b)) != -1) {
                    response.getOutputStream().write(b, 0, i);
                    response.flushBuffer();
                }
                fis.close();
4

1 に答える 1

2

Spring の有無にかかわらず HTTP Byte Range を使用するソリューションを構築しました。興味がある場合は、https://gist.github.com/davinkevin/b97e39d7ce89198774b4で確認してください。

これは、主に @RestController を使用して Spring アプリケーション内で使用するのに役立ちます

于 2015-02-10T16:40:43.823 に答える