上传文件细节处理问题
一 中文乱码问题
1.上传文件的中文乱码问题
用解析器的对象去调用setHeaderEncoding方法设置就行
// (1)创建一个解析器工厂
DiskFileItemFactory factory =
new DiskFileItemFactory();
// (2)得到解析器
ServletFileUpload upload =
new ServletFileUpload(factory);
upload.setHeaderEncoding("utf-8");
注:
request.setCharacterEncoding(“utf-8”);解决的是用post方法提交的参数,并且设置到的是 request.getParament(“user”)的字符编码。
2. 普通输入项的中文乱码问题
第一种:inputValue = new String(inputValue.getBytes("iso8859-1"),
"utf-8");
第二种:String inputValue = item.getString("utf-8");
注:inputVaule是:
String inputName = item.getFieldName(); // 输入项的名称
String inputValue = item.getString(); // 输入项的value值
二 防止用户不在文件上传的输入项中输入上传文件
用法是:判断获取到的是否为空,最好截取左右两边的空串
代码:
if (!fileName.trim().equals("")) {
//读取上传文件的内容并存入本地磁盘
// 得到上传的文件名
fileName = fileName.substring(fileName.lastIndexOf("\\") + 1);
InputStream is = item.getInputStream();// 得到上传的输入流
// 输出到本地磁盘上
FileOutputStream fos =
new FileOutputStream("c:\\"
+ fileName);
byte[] buff =new byte[1024];
int len = 0;
while ((len = is.read(buff)) > 0) {
fos.write(buff, 0, len);
}
is.close();
fos.close();
}
三 删除临时文件
临时文件出现的原因是上传的文件过大,超出了DiskFileItemFactory.setSizeThreshold方法设置的内存缓冲区的大小,Commons-fileupload组件将使用临时文件保存上传数据,因此在程序结束时,务必调用FileItem.delete方法删除临时文件。
1. 指定保存临时文件的目录
factory.setRepository(new File(this.getServletContext().getRealPath("/temp")));
2.删除临时文件
is.close();
fos.close();
item.delete();
四 文件的存放位置:服务的安全性
为保证服务器安全,上传文件应保存在应用程序的WEB-INF目录下,或者不受WEB服务器管理的目录。
首先确定上传的文件要保存在哪个目录下 保证文件的安全性,在WEB-INF下
String savePath = this.getServletContext().getRealPath(
"WEB-INF/upload");
构建输出流对象
FileOutputStream fos = new FileOutputStream(savePath
+ "\\" + fileName);
注:在webRoot下是不受保护的
五 多个用户上传了同名的文件,这时后面的人上传的文件就会覆盖原来的文件,可以给定唯一的文件名来保证
UUID类是用来随机的生成唯一的标识符
String fileName = item.getName();
fileName = UUID.randomUUID().toString() + "_"+ fileName;
六 防止在同一个文件夹下存放的目录过多
解决:在同一个文件夹下放置的文件过多,可以根据可能的文件上传总量,选择合适的目录结构生成算法,将上传文件分散存储
1. 打散存储的方法
//产生目录结构的算法---hash目录
public String generateFilePath(String path,String fileName){
//得到一级目录名 得到的是内存的地址()哈希码
int dir1 = fileName.hashCode() & 0x0f;
//二级目录
int dir2 = fileName.hashCode()>>4 & 0x0f;
String savePath = path+"\\"+dir1+"\\"+dir2+"\\";
//如果目录不存在,创建
File f = new File(savePath);
if(!f.exists()){
f.mkdirs();//多级目录的创建
}
return savePath;
}
2.调用:
String savePath =this.getServletContext().getRealPath(
"WEB-INF/upload");
savePath = generateFilePath(savePath, fileName);
七 限制上传文件的大小
// 限制上传文件的大小 为1兆
1. 设置
upload.setFileSizeMax(1024 * 1024);
2.用异常去捕获
catch (FileUploadBase.FileSizeLimitExceededException e) {
request.setAttribute("message", "上传的文件不能超过1M");
}
八 限制上传文件的类型
1. 定义能上传哪些类型的文件
第一种:
String[] arr ={".jpg",".bmp",".avi"};
Private List fileType = Arrays.asList(arr);
第二种:
private List fileType=Arrays.asList(".jpg",".bmp",".avi");
九 显示上传进度
使用ProgressListener接口中的 Update抽象方法,系统会自动的传参数,并且在显示的时候用内部类,或者是匿名类。
1.内部类
class ProgressHandlerimplements ProgressListener{
public void update(long arg0,long arg1,
int arg2) {
System.out.println("现在已经处理了"+arg0+"数据,总数据量是"+arg1+",正在处理第"+arg2+"个数据");
}
}
2.调用:upload.setProgressListener(new ProgressHandler());
分享到:
相关推荐
自己制作的假的随机生成器/点名器的打包文件,可以不安装QT直接使用。在自己的win10电脑下未发现bug,如果乱码,可能是文件夹名称问题,文件夹改成英文。
主要为用户提供便捷的电脑磁盘加密功能,能创建加密的“虚拟磁盘文件”(类似虚拟光驱,大小可以自定义),所有加密数据都是经过AES等加密算法的运算后的结果,无法破解。CnCrypt提供多种加密算法,包括:AES-256, ...
本书是第II卷,以开发人员在项目开发中经常遇到的问题和必须掌握的技术为中心,介绍了应用Java进行桌面程序开发各个方面的知识和技巧,主要包括Java语法与面向对象技术、Java高级应用、窗体与控件应用、文件操作...
【综合计算显示】 综合计算并显示选中区域存储格的最大值、最小值、平均值、求和、存储格个数、筛选状态下的的加总求和,以及显示选区包含的数字、字符、汉字的个数等信息。 【GB2转BIG5】 将选中区域存储格的简体...
【综合计算显示】 综合计算并显示选中区域存储格的最大值、最小值、平均值、求和、存储格个数、筛选状态下的的加总求和,以及显示选区包含的数字、字符、汉字的个数等信息。 【GB2转BIG5】 将选中区域存储格的简体...
100 <br>0159 如何实现0~9之间随机整数 101 <br>0160 如何实现0~1之间随机数 101 <br>0161 如何返回数字的绝对值 101 <br>5.2 控件数据处理技巧 102 <br>0162 如何实现C#中用键完成TAB的...
常见问题 读取Properties文件出现中文乱码 182 第9章 Java异常处理与反射机制 183 实例73 运用throws、throw、try与catch 183 实例74 throws声明异常的实例 185 实例75 自定义异常类 187 实例76 使用finally...
SC程序自带反馈功能,可以通过文字和图片的形式反馈给我们,在部署过程中如果发生意外,SC部署程序会自动在WINDOWS文件夹下生成一个Scbug.html文件,为了不遗留文件在客户机上,该文件会在第二次重启自动删除,所以...
2:上传文件夹中的upload文件中至网站根目录,或子目录 3:登陆后台http://域名/admin/ 并修改配置站点信息 初始账号:admin 密码:admin 4:logo默认路径img/风格/logo.gif 用您自己的LOGO覆盖即可! 【更新内容】...
都可以通过列表下面的选择操作进行审核、生成等操作,根据各个管理列表,操作是一样的。下面如果不是特殊功能,就不在重复介绍。 重点说明:分类管理中[功能帮助]类别,初始建站都会遇到帮助中心的分类页无法更新...
帮助解决网页和JS文件中的中文编码问题的小工具 慎用const关键字 装箱,拆箱以及反射 动态调用对象的属性和方法——性能和灵活性兼备的方法 消除由try/catch语句带来的warning 微软的应试题完整版(附答案) 一个...