路径知识点:
/为正斜杠:
表示url地址,访问web地址时用正,例如:http://localhost:8080,response.sendRedirector("/user/a.html");
\为反斜杠:
表示真实本地路径,例如:c:\windows;
在java流中要用“\\”,第一个为转义符,第二个为真正的反斜杠,例如:new FileOutputStream("c:\\");
小知识点:
Runtime.getRuntime().exec("windows命令"); //获得java虚拟机所在环境,运行windows命令
windows命令:
关机:
shundown -s 执行
shundown -a 取消
format c:/q //快速格式化
小知识点:
不用第三方变量互换两个数字(利用异或实现):
x = x^y;
y = x^y; //一个数x异或另一数y,得到的是数y
x = x^y; //一个数x异或另一数y两次,得到的是数x本身
文件上传
一.html页面中的代码:
<!-- 文件上传时,type属性要设为file,而且必须设置name属性,表单的属性必须设置enctype属性为multipart/form-data -->
<form action="servlet文件路径" enctype="multipart/form-data" method="post">
<input type="file" name="传递名"> //上传选项
<input type="submit" value="上传"> //提交按钮
</form>
二.servlet文件代码:
//如果表单类型为multipart/form-data时,表单在提交时采用Mime协议对数据封装后提交,在服务器这边要采用流技术取得文件,
(1)采用apache开发的文件上传组件实现上传,存入硬盘目录中:
1.导入两个jar包:commons-fileupload-1.2.1.jar,commons-io-1.4.jar
2.写上传代码:
{
//创建 FileItem 对象的工厂
DiskFileItemFactory factory = new DiskFileItemFactory();
//设置内存缓冲区的大小,默认值为10K,可不设置
factory.setSizeThreshold(1024*100);
//得到上传时要用的临时目录,可不设置
String temppath = this.getServletContext().getRealPath("/WEB-INF/temp");
//设置临时文件的目录,可不设置
factory.setRepository(new File(temppath));
//将表单中每个输入项封装到一个 FileItem 对象中
ServletFileUpload upload = new ServletFileUpload(factory);
//设置上传文件名称编码格式,可解决乱码问题,提交表单要与这里的编码一样,可不设置
upload.setHeaderEncoding("UTF-8");
//判断提交表单的类型是否为multipart/form-data
if(!upload.isMultipartContent(request)){
return;
}
try {
List list = upload.parseRequest(request); //得到上传过来的一组文件或数据,返回List集合
//对List集合中的数据进行遍历,取出每一个进行判断
Iterator it = list.iterator();
while(it.hasNext()){
FileItem item = (FileItem) it.next(); //取出表单的每个input项,FileItem类代表一个input项,
if(item.isFormField()){ //判断input是否为普通表单输入项,如果是就按取普通形式获取数据
String name = item.getFieldName(); //取出input的名称
String value = item.getString(); //取出input的值
}else{ //如果是文件上传输入项
InputStream in = null;
OutputStream writer = null;
try{
//得到上传文件名,对文件名进行截取,丢掉前面路径部分
String filename = item.getName();
int pos = filename.lastIndexOf("\\");
if(pos!=-1){
filename = filename.substring(pos+1);
}
//得到上传文件要写入的目录,将目录放在WEB-INF中,可保护服务器安全,外界无法访问
String path = this.getServletContext().getRealPath("/WEB-INF/upload");
//生成唯一的文件名和文件保存的路径
filename = generatePath(path,filename);
//根据目录和文件名创建输出流
writer = new FileOutputStream(filename);
//得到提交上来文件的输入流,并写入到服务器目录中
in = item.getInputStream();
byte buffer[] = new byte[1024];
int len = 0;
while((len=in.read(buffer))>0){
writer.write(buffer,0,len);
}
}finally{
//结尾操作要放在这里执行,以确保必须执行
in.close();
out.close();
item.delete(); //删除临时缓存文件
}
}
}
} catch (FileUploadException e) {
e.printStackTrace();
}
}
3.利用算法生成多个目录,解决一个目录下文件过多的问题
public static String generatePath(String path,String filename){
//生成一个uuid值
String uuid = UUID.randomUUID().toString();
//根据uuid值生成子目录,生成算法用hash目录生成算法
//dir1 32位
int dir1 = uuid.hashCode() & 0xf; //
int dir2 = (uuid.hashCode()>>4) & 0xf; //
String dir = path + "\\" + dir1 + "\\" + dir2 + "\\";
//在硬盘中创建目录
File f = new File(dir);
//判断目录是否已经存在
if(!f.exists()){
//f.mkdir(); //千万小心,这里要生多级目录,调mkdir()是不行的
f.mkdirs(); //生成多级目录
}
//对文件名加入uuid,避免上传文件名相同时原文件被覆盖的情况
filename = uuid + "_" + filename;
return dir + filename; //返回目录名+文件名组合后的名称
}
4.利用javascript实现多文件上传:
<script type="text/javascript">
function add(){
var file = document.getElementById("file");
var div = document.getElementById("div");
document.createElement()
}
</script>
5.显示上传进度条
upload.setProgressListener(new ProgressListener()){
public void update(long pBytesRead, long pContentLength, int pItems) { //pBytesRead为已上传,pContentLength为总大小
System.out.println("到现在为止, " + pBytesRead + " 字节已上传,总大小为 "+ pContentLength);
}
}
(2)将上传文件的信息,存入数据库中:
1.建一个类UpFile用于存放文件信息
2.建立工具类JdbcUtil,连接数据库
3.建一个用操作将数据库与实体类的Dao接口
4.建立一个实现Dao接口的类,操作数据库与实体类