我使用在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时收到的警告消息:
注意警告:" 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中却没有...
答案 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注入。所以它就像附加优势