yao.qingdong
yao.qingdong

Reputation: 51

Netty HttpStaticFileServerHandler problem

I use netty offical example HttpStaticFileServerHandler as file server, but when I download file from server I met a problem, the mp4 file I download from server is not complete and can't display.

https://github.com/netty/netty/blob/4.1/example/src/main/java/io/netty/example/http/file/HttpStaticFileServerHandler.java

And here is my client code:

    FileOutputStream fos = null;
    try {
        URL website = new URL("http://localhost:8090/export/App/***.mp4");
        ReadableByteChannel rbc = Channels.newChannel(website.openStream());
        fos = new FileOutputStream("/Users/mine/***.mp4");
        fos.getChannel().transferFrom(rbc, 0, Long.MAX_VALUE);
    } catch (Exception e) {
        System.out.println("error msg:\n" + e);
    } finally {
        try {
            if (fos != null) {
                fos.close();
            }
        } catch (IOException ioe) {
            System.out.println("fos close fail:\n" + ioe);
        }

    }

Upvotes: 2

Views: 382

Answers (2)

yao.qingdong
yao.qingdong

Reputation: 51

I solved this problem. I find the RandomAccessFile is not closed in correct time. Here is the change:

RandomAccessFile raf;
try {
    raf = new RandomAccessFile(file, "r");
} catch (FileNotFoundException ignore) {
    sendError(ctx, NOT_FOUND);
    return;
}
...
sendFileFuture.addListener(new ChannelProgressiveFutureListener() {
    @Override
    public void operationProgressed(ChannelProgressiveFuture future, long progress, long total) {
        if (total < 0) { // total unknown
            System.err.println(future.channel() + " Transfer progress: " + progress);
        } else {
            System.err.println(future.channel() + " Transfer progress: " + progress + " / " + total);
            }
        }

    @Override
    public void operationComplete(ChannelProgressiveFuture future) {
        System.err.println(future.channel() + " Transfer complete.");
        raf.close();// close raf when transfer completed
    }
});

Upvotes: 1

Ferrybig
Ferrybig

Reputation: 18834

Make sure you close your FileOutputStream using fos.close().

Failing to do so means that only part of the data will be written, and that other programs may experience problems when accessing the file.

Another thing you could check is viewing the filesize of the file, those should match at both sides, if the file is way too small, open it with an text editor, and view the contents to check for clues.

Upvotes: 1

Related Questions