参与了一个基于Spring MVC框架的网站开发,其他带过,其中有个模块涉及到文件的上传功能,使用了js 的uploadfiy插件,上传时还会有百分比的进度条,后台使用FileOutputStream的write方法,在此碰到了个问题,上传文件大小总有限制,最开始仅能上传100M以下的文件。
网上搜索出很多建议:改spring的配置文件
<property name="maxUploadSize">
<value>999999999999</value>
</property>
改uploadfiy的参数sizeLimit (上传文件的大小限制)。
这两个都更改了后,效果还是不大,有时候是上传的进度条到百分之几时就会中断,然后报IO error错误,有时候是进度条跑完后,后台程序报异常。
还有建议是改网站服务器的配置,改tomcat配置。(不知道有用没)
感觉上传的controller应该要换一种方式试试,于是看到了FTPCLient,貌似这个上传文件比HTTP协议稳定,而且还支持断点续传(不会用),都不知怎么开始用,感觉莫名其妙,于是各种找demo,终于找到一个能用的:
<span style="white-space:pre"> </span>FTPClient ftpClient = new FTPClient();
FileInputStream fis = null;
try {
ftpClient.connect("192.168.14.117");
ftpClient.login("admin", "123");
File srcFile = new File("C:\\new.gif");
fis = new FileInputStream(srcFile);
//设置上传目录
ftpClient.changeWorkingDirectory("/admin/pic");
ftpClient.setBufferSize(1024);
ftpClient.setControlEncoding("GBK");
//设置文件类型(二进制)
ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);
ftpClient.storeFile("3.gif", fis);
} catch (IOException e) {
e.printStackTrace();
throw new RuntimeException("FTP客户端出错!", e);
} finally {
IOUtils.closeQuietly(fis);
try {
ftpClient.disconnect();
} catch (IOException e) {
e.printStackTrace();
throw new RuntimeException("关闭FTP连接发生异常!", e);
}
}
(代码来源于网络)
当ftpClient.storeFile 方法返回ture时,就说明上传成功了,此时注意要添加jar包,我用的是commons-net-3.3.jar,项目导入此包后,还要将这个包复制一份到tomcat的lib目录下,否则会找不到这个类,做完这个后,却还是返回了false,又在网上看到
调用FTPClient.enterLocalPassiveMode();这个方法的意思就是每次数据连接之前,ftp client告诉ftp server开通一个端口来传输数据。为什么要这样做呢,因为ftp server可能每次开启不同的端口来传输数据,但是在linux上,由于安全限制,可能某些端口没有开启,所以就出现阻塞。
于是我加入了这个方法,果然就ok了,改动之后,上传的文件大小能到四五百兆。
总结:方法是找到了,但是还是知其然不知其所以然,惭愧啊,都不知道原因到底在哪,唉,再一个就是,如果上传再大些的文件,uploadfiy的进度条到不了5%就断掉了,然后还是报IO error,觉得还是这个js插件没弄好。第一次写哈,请多包涵嘿嘿,记录下这个过程以便复习,这其中还有好多没弄明白的缘由,希望大神们多多赐教。