Java:File.Separator在Windows中无法识别?

Java:File.Separator在Windows中无法识别?,java,mysql,Java,Mysql,我使用WTP工具和ApacheTomcat7在Eclipse IDE中编写了一个小型J2EE web应用程序,运行在Ubuntu 14.04上,然后将其导出为.war文件。 该应用程序有一个servlet,其唯一目的是将图片从客户端计算机上载到服务器,显示给客户端,然后将图片的url保存在mysql数据表上,以备将来使用。 当我启动tomcat7并转到http://localhost:8080/MyProject在我的浏览器中,为了测试应用程序,一切都非常正常。 问题从Windows开始… 我想

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

File f=new File(userImages+"/"+userName+"/"+pictureFileName);
因为现在是这样写的:

File f=new File(userImages+File.separator+userName+File.separator+pictureFileName);
但它在Windows上运行时似乎被忽略了

更新:

好的,我硬编码了路径,用斜线代替,很明显,我错了。。。 它仍然不工作,并且忽略了分隔符,因此
File.separator
不是问题的原因
因此,我的下一个最佳猜测是通过cmd(命令行)登录mysql时收到的警告消息:

注意警告:“mysql:unknown OS charachter set'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中不工作…

问题是当您这样做时

String name = "abc"+ File.separator+"ABC";
它将为您提供
abc\abc
。如果您在mysql中插入这一行,它将使用语句存储为
abcABC

所以不能在mysql数据库中插入反斜杠。您需要退出反斜杠,请尝试使用双反斜杠
\\
或正斜杠
/

但是我认为您的
文件f=新文件(userImages+“/”+userName+“/”+pictureFileName)应该可以正常工作


或者简单地使用
PreparedStatement
来解决这个问题,而且
PreparedStatement
也可以避免sql注入。因此,这就像附加优势一样

首先,windows可以使用
/
,因此此更改是不必要的。第二,这是您正在构建的文件路径(您在哪里写入数据库)?您是否尝试打印“userImages+file.separator+userName+file.separator+pictureFileName”的输出。这样,您就可以知道在保存URL时是否发生了什么事情。在DB中保存时,您看起来像是在打印输出,你能在保存之前打印路径吗?注意警告:“mysql:unknown OS charachter set'cp862'。。。这可能是原因吗?不,不可能。请在保存路径的地方发布代码。谢谢您的评论!编辑了主要帖子…因为Windows使用\(反斜杠),而Linux使用/(正斜杠)作为File.separatorOh。。。是的,这很有道理,可能是我的问题。当我使用预先准备好的语句时,它不起作用,但我想这是因为我没有正确使用它。。谢谢