Servlet+IO实现
1.上传
(1)原理:
(2)实现:
注:省去了Servlet配置及前端JSP等
/*
* 获取上传文件的流信息,保存至一个临时文件中
* 这样临时文件中就包含了上传文件的信息
* 需要做的就是从临时文件中取出上传文件的内容与名称
* 然后按取出的名称保存文件内容
*/
//获取请求的输入流
InputStream is = req.getInputStream();
//定义一个临时文件,用于保存上传文件的流信息
File tempFile = new File("C:/Users/Sophon/Desktop/tempFile");
//读写文件
FileOutputStream fos = new FileOutputStream(tempFile);
byte b[] = new byte[1024];
int n;
while((n=is.read(b))!=-1){
fos.write(b,0,n);
}
//关闭输入输出流
fos.close();
is.close();
System.out.println("已保存至临时文件!");
/*
* 从临时文件中获取上传的文件名称
* 文件名在tempFile的第二行末尾
* 最后一个双引号之中的就是
*/
RandomAccessFile raf = new RandomAccessFile(tempFile,"r");
raf.readLine();
String str = raf.readLine();
//取到最后一个引号的索引
int endIndex=str.lastIndexOf("\"");
//取到倒数第二个引号的索引并+1
String subStr = str.substring(0,endIndex-1);
int beginIndex=subStr.lastIndexOf("\"")+1;
//取到文件名
String fileName = str.substring(beginIndex,endIndex);
System.out.println("上传文件的名称是:"+fileName);
/*
* 获取上传文件内容的起始位置
* 在第四行换行结束之后
*/
//定位到tempFile文件的开始
raf.seek(0);
long startPosition=0;
int i=1;
//连续读取4行,将起始位置指向第四行的换行处
while((n = raf.readByte())!=-1 && i<=4){
if(n=='\n'){
startPosition = raf.getFilePointer();
i++;
}
}
/*
* 获取上传文件内容的结束位置
* 在临时文件倒数第二行的换行处
*/
//定位tempFile文件的结尾处,从后往前找,找倒数第二个换行符
raf.seek(raf.length());
long endPosition = raf.getFilePointer();
int j=1;
while(endPosition>=0 && j<=2){
//从倒数第一个字节往回读,指针往回指即可
endPosition--;
raf.seek(endPosition);
if(raf.readByte()=='\n'){
j++;
}
}
/*
* 保存上传文件内容为最终文件
*/
//创建保存文件
String filePath = req.getServletContext().getRealPath("/")+"images";
File file = new File(filePath);
if(!file.exists()){
file.mkdir();
}
File saveFile = new File(filePath,fileName);
RandomAccessFile randomAccessFile = new RandomAccessFile(saveFile,"rw");
//将上传文件内容写入保存文件中
randomAccessFile.seek(0);
raf.seek(startPosition);
long startTime = System.currentTimeMillis();
while(startPosition<endPosition){
randomAccessFile.write(raf.readByte());
startPosition=raf.getFilePointer();
}
long endTime = System.currentTimeMillis();
System.out.println("上传完成,耗时:"+(endTime-startTime)+"ms!");
//关闭输入输出流,删除临时文件
randomAccessFile.close();
raf.close();
tempFile.delete();
//反馈通知
req.setAttribute("result","上传成功!");
req.getRequestDispatcher("/jsps/upload01.jsp").forward(req,resp);
2.下载
(1)原理:
(2)实现:
注:省去了Servlet配置及前端JSP等
//设置文件下载路径
String filePath = getServletContext().getRealPath("/")+"images/";
String fileName = req.getParameter("filename");
File file = new File(filePath+fileName);
if(file.exists()){
//设置头信息
//设置Content-Type头字段为application/octet-stream或者application/x-msdownload
//设置Content-Disposition头为attachment;filename=FILENAME
resp.setContentType("application/x-msdownload");
String attachmentSetting = "attachment;filename="+fileName;
resp.setHeader("Content-Disposition", attachmentSetting);
InputStream is = new FileInputStream(file);
ServletOutputStream os = resp.getOutputStream();
//写入文件
byte b[] = new byte[1024];
int n;
while((n=is.read(b))!=-1){
os.write(b,0,n);
}
//关闭流
os.close();
is.close();
}else{
req.setAttribute("downloadError","文件不存在,下载失败!");
RequestDispatcher dispatcher = req.getRequestDispatcher("/jsps/upload01.jsp");
dispatcher.forward(req, resp);
}