在Servlet中的网络磁盘中定位文件

时间:2011-03-08 14:49:53

标签: java servlets file-io

我创建ImageServlet以引用我的Web应用程序范围内的视频。

我所有视频的位置都位于Intranet位置,可以从Intranet中的任何计算机访问:

String path = "\\myip\storage\ogg\VX-276.ogg"

在我的应用程序中,当我将其写为URL时 - 它无法显示它!

如果我尝试使用Chrome打开它,它会自动将其更改为file://myip/storage/ogg/VX-276.ogg并显示该文件。

我尝试这样做:file:////odelyay_test64/storage/ogg/ 同样,但Java将字符串转换为:file:\myip\storage\ogg\VX-276.ogg,但不存在!

引用它的正确方法是什么?

EDITED

我创建了一个小测试:

String path = "file://myip/storage/ogg/VX-276.ogg";
        File file = new File(path);
        if (file.exists())
            System.out.println("exists");
        else {
            System.out.println("missing" + file.getPath());
        }

我得到了:

missing file:\myip\storage\ogg\VX-276.ogg

正如您所看到的那样,正在切换斜杠

2 个答案:

答案 0 :(得分:3)

根据您的previous question,您引用了HTML <video>标记中的资源。 HTML源代码中的所有网址必须http://个网址(或至少相对于http://网址)。大多数浏览器在file://请求HTML页面时拒绝从http:// URL加载资源。您只需要让URL指向servlet即可。如果servlet的doGet()方法被命中,那么URL就可以了,你不应该改变它。

您的具体问题在于如何在servlet中打开和读取所需文件。您必须确保path中的File file = new File(path)指向有效位置,然后才能在其上打开FileInputStream

String path = "file://myip/storage/ogg/VX-276.ogg";
File file = new File(path);
// ...

如果servlet代码写得很好,它没有抑制/吞下异常并且你已经阅读了服务器日志,那么你应该看到一个IOException,例如FileNotFoundException以及一个自我每当读取文件失败时,在服务器日志中解释消息。去阅读服务器日志。


更新根据评论,事实证明您正在使用Windows,因此如果没有将其映射到驱动器上,网络磁盘上的file://将无法用于Java信件。您需要先在驱动器号上映射//myip,例如X:

String path = "X:/storage/ogg/VX-276.ogg";
File file = new File(path);
// ...

答案 1 :(得分:1)

最后我使用了apache的VFS库,我的代码如下:

public static void main(String[] args) {
        FileSystemManager fsManager = null;
        String path = "\\\\myip\\storage\\ogg\\VX-276.ogg";
        try {
             fsManager = VFS.getManager();

        FileObject basePath;


            basePath = fsManager.resolveFile("file:" + path);




            if (basePath.exists())
                System.out.println("exists");
            else {
                System.out.println("missing" + basePath.getURL());
            }
        } catch (FileSystemException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

通过这种方式,我不需要为系统的每个用户创建一个驱动程序,它允许我不依赖于操作系统!