Java:File.Separator在Windows中无法识别?
我使用WTP工具和ApacheTomcat7在Eclipse IDE中编写了一个小型J2EE web应用程序,运行在Ubuntu 14.04上,然后将其导出为.war文件。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开始… 我想
该应用程序有一个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。。。是的,这很有道理,可能是我的问题。当我使用预先准备好的语句时,它不起作用,但我想这是因为我没有正确使用它。。谢谢