浏览按钮选择目录

3
我想在我的网页中创建一个浏览按钮来选择目录而不是文件。我知道输入类型文件在这里行不通,但是否有任何方式可以使用Javascript实现它。我想获取客户机器的文件路径,在IE中是可能的,但其他浏览器不支持,但对我来说也没关系。
我卡住的地方是如何在按钮中获取文件目录。
以下是我正在使用的代码,用于从浏览器调用applet,但我在浏览器中遇到了Detect from bootclasspath: C:\PROGRA~1\Java\jre7\lib\deploy.jar错误。我已经使用Java 1.5编译了类文件。
<applet code="com.life.draw.BrowsePage.class"></applet>

代码

public class BrowsePage extends JApplet {
@Override
public void paint(Graphics g) {
    // TODO Auto-generated method stub
    JFileChooser chooser = new JFileChooser();
    chooser.setCurrentDirectory(new java.io.File("."));
    chooser.setDialogTitle("Browse the folder to process");
    chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
    chooser.setAcceptAllFileFilterUsed(false);

    if (chooser.showOpenDialog(null) == JFileChooser.APPROVE_OPTION) {
        System.out.println("getCurrentDirectory(): "+ chooser.getCurrentDirectory());
        System.out.println("getSelectedFile() : "+ chooser.getSelectedFile());
    } else {
        System.out.println("No Selection ");
    }
}
}

这是不可能的 - 唯一可以访问客户端机器的控件是“文件”输入,它只能选择文件,而不能选择文件夹。你为什么需要这个? - Rory McCrossan
2
HTML页面中的目录选择器: https://dev59.com/V3E85IYBdhLWcg3wXCW1 - Colin Basnett
webkitdirectory 属性及其他现代浏览器的等效属性 <input type="file" webkitdirectory> - A. Wolff
Closers:这不是“HTML页面中的目录选择器”问题的重复。那个问题的答案已经过时了,已经有3年了。@Spikeh在这个帖子中提供的答案最准确。 - Ray Nicholus
2个回答

3

为什么你要在paint方法中调用这个东西?很可能每次应用程序被重新绘制的时候都会尝试创建新的窗口。

public void paint(Graphics g) {
    // TODO Auto-generated method stub
    JFileChooser chooser = new JFileChooser();
    /*...*/

相反,你应该在init方法中创建一个JButton,并且将一个ActionListener附加到它上面...

public void init() {
    setLayout(new GridBagLayout());
    JButton browse = new JButton("...");
    browse.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent evt) {
            JFileChooser chooser = new JFileChooser();
            chooser.setCurrentDirectory(new java.io.File("."));
            chooser.setDialogTitle("Browse the folder to process");
            chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
            chooser.setAcceptAllFileFilterUsed(false);

            if (chooser.showOpenDialog(null) == JFileChooser.APPROVE_OPTION) {
                System.out.println("getCurrentDirectory(): "+ chooser.getCurrentDirectory());
                System.out.println("getSelectedFile() : "+ chooser.getSelectedFile());
            } else {
                System.out.println("No Selection ");
            }
        }
    });
    add(browse);
}

您可能也想看看Applet 的功能和限制


问题尚未解决,即使在init方法中放置代码,窗口仍无法关闭。还有一个小变化在我的jsp代码中:<jsp:plugin type="applet" archive="SMyApplet.jar" code="com.life.draw.BrowseDirectory.class" codebase="http://189.28.156.110:8080/imageflow/" jreversion="1.6" width="600" height="320"> <jsp:fallback> 浏览器不支持插件标签OBJECT或EMBED。 </jsp:fallback> </jsp:plugin> 请建议。 - pise
现在它已经可以工作了,因为我把代码放在了init中。实际上,我改变了代码并创建了一个jar文件以及签名的jar文件,但是忘记在改变代码后替换签名的jar文件。非常感谢,我的问题已经解决了。 - pise

2
在Web浏览器中,获取本地浏览对话框的唯一方法是使用<input type="file"/>,或使用Java Applet或Adobe Flash插件。在Web浏览器中,没有内置的方法可以从JS获取目录引用。
此外,您无法读取客户端硬盘的内容,甚至无法通过JavaScript启动浏览对话框。如果您能够这样做,将会带来相当大的安全问题。
关于读取目录,请参阅以下帖子: 使用JavaScript进行本地文件访问 获取本地文件内容而不上传 Javascript:获取本地服务器端文件的内容 听起来,您需要编写一个Flash插件,让您在本地选择目录。但是,在下载插件时,您的用户将收到安全警告。
编辑:
还有基于Webkit的方法,但这只适用于基于Webkit的浏览器(Chrome、Safari等)。

{{link1:如何在自己的代码中使用Google Chrome 11的上传文件夹功能?}}


@RayNicholus 我在运行小程序时,在浏览器中遇到了“从bootclasspath检测到:C:\PROGRA~1\Java\jre7\lib\deploy.jar”错误。我已经使用Java 1.5编译了我的小程序类。我将我的JSP和类代码添加在上面。 - pise
有人能告诉我出了什么问题吗?当我从服务器访问jsp时,我得到了ClassNotFound异常。但是如果我在客户端机器上运行,我会得到带有红色标记的错误详细信息(C:\ PROGRA〜1 \ Java \ jre7 \ lib \ deploy.jar)。 - pise
好的,我找到了如何在应用程序中显示JFileChooser的解决方案。 创建您自己的 appletpermission.policy 文件,使 yourApplet.jar 成为签名文件,并在代码中将您的代码指向 appletpermission.policy(System.setProperty("java.security.policy", "file:/C:/Program Files/Java/jre6/lib/security/appletpermission.policy");)。欲了解更多信息,请参阅[链接] http://www.pawlan.com/monica/articles/signedapps/。 - pise
但是在这之后,当我点击打开或关闭按钮时,虽然我的代码中得到了值,但JfileChooser窗口并没有关闭,我面临着新的问题。 - pise

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接