Нетти HttpStaticFileServerHandler проблема - PullRequest
0 голосов
/ 27 ноября 2018

В качестве файлового сервера я использую официальный пример netty HttpStaticFileServerHandler, но при загрузке файла с сервера возникла проблема, файл mp4, загружаемый с сервера, не завершен и не может отображаться.

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

А вот мой код клиента:

    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);
        }

    }

Ответы [ 2 ]

0 голосов
/ 28 ноября 2018

Я решил эту проблему.Я считаю, что файл RandomAccessFile не закрыт в нужное время.Вот изменение:

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
    }
});
0 голосов
/ 27 ноября 2018

Убедитесь, что вы закрыли свой FileOutputStream, используя fos.close().

Невыполнение этого требования означает, что будет записана только часть данных, и что другие программы могут испытывать проблемы при доступе к файлу.

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

...