Java:Windows中无法识别File.separator?

时间:2014-08-19 16:06:06

标签: java mysql

我使用在Ubuntu 14.04上运行的WTP工具和Apache Tomcat7在Eclipse IDE中编写了一个小型J2EE Web应用程序,然后将其导出为.war文件。
该应用程序有一个servlet,其唯一目的是将图片从客户端计算机上传到服务器,将其显示给客户端,然后将图片的URL保存在mysql数据表中,供以后使用。
当我启动tomcat7并在我的浏览器中转到http://localhost:8080/MyProject来测试应用程序时,一切都运行得很好 问题始于Windows ...
我想在Windows上测试我的应用程序,所以我切换到Windows,安装了所有必要的程序(Apache Tomcat7,MySql ......)并启动了应用程序。
它也适用于Windows,但是(!),当用户将图片上传到服务器时,它将无法正确显示(而您所看到的只是从破碎的网址获得的图像)。
然后我连接到MySql,找出MySql服务器中保存的url,发现缺少文件分隔符。
而不是:userImages/userName/name_of_pic.jpg,mysql表保存userImagesuserNamename_of_pic.jpg ...
为什么会这样?我应该硬编码这样的路径吗?

File f=new File(userImages+"/"+userName+"/"+pictureFileName);

因为现在它写得像这样:

File f=new File(userImages+File.separator+userName+File.separator+pictureFileName);

但它似乎在Windows上运行时被忽略了......

更新

好的,我对路径进行了硬编码,并使用了斜杠,而且显然,我错了...... 它仍然不起作用,并忽略了分隔符,因此File.separator不是问题的原因!
所以我的下一个最佳猜测是通过cmd(命令行)登录mysql时收到的警告消息: enter image description here

注意警告:" mysql:未知操作系统字符集' cp862'" ... 这可能是原因吗?

更新2:

这是保存路径的代码:

public boolean setUserPicture(String firstName, String path, FileItemStream item) {

    File userPicturesFolder=new File(path+File.separator+firstName);
    if (!userPicturesFolder.exists()) {
        userPicturesFolder.mkdir();
    }

    File savedPicture=new File(userPicturesFolder.getAbsolutePath()+File.separator+item.getName());

    try {

        FileOutputStream fos=new FileOutputStream(savedPicture);
        InputStream is=item.openStream();

        int bytesRead=0;
        byte[] b=new byte[1024*10];
        while ((bytesRead=is.read(b))!=-1) {
            fos.write(b, 0, bytesRead);
        }
        fos.flush();
        fos.close();

    } catch (IOException e) {
        e.printStackTrace();
        return false;
    }

    dataBase.editPicture(firstName,IUsers.imagesFolder+File.separator+firstName+File.separator+item.getName());
    return true;
}

这是editPicture()函数的代码:

public void editPicture(String firstName, String filePath) {

    String command="UPDATE users "
            + "SET user_picture='"+filePath+"' "
            + "WHERE first_name='"+firstName+"';";

    try {
        Statement statement=connection.createStatement();
        statement.executeUpdate(command);
    } catch (SQLException e) {
        System.out.println("Error executing update: "+e.getMessage());
        e.printStackTrace();
    }

}

正如我上面提到的,此代码在将其导出到.war文件后在Ubuntu中有效,但在Windows中却没有...

1 个答案:

答案 0 :(得分:2)

问题在于你喜欢这个

String name = "abc"+ File.separator+"ABC";

它会给你abc\ABC。如果在mysql中插入此行,它将使用Statement

存储为abcABC

所以你不能在mysql db中插入反斜杠。你需要使用双反斜杠\\或前哨/来逃避反斜杠。

但我认为你的File f=new File(userImages+"/"+userName+"/"+pictureFileName);应该可以正常工作

或者只是使用PreparedStatement来解决问题而且PreparedStatement也可以避免sql注入。所以它就像附加优势