1.文件上传步骤
2.上传的前台的注意点
3.上传的后台的注意点
4.上传存放位置的问题
5.文件上传监视
6.文件下载
1.文件上传步骤
(1).提供表单允许用户通过表单选择文件上传
(2).在servlet中将上传的文件保存在服务器的硬盘中
2.上传的前台的注意点
<form action="${pageContext.request.contextPath}/uploadServlet" method="post" ectype="multipart/form-data">
javascript如何实现多表单上传:
<div id="fdiv"></div>
<script type="text/javascript">
function addone(){
var fidv = document.getElementById("fdiv");
fdiv.innerHTML+='<div><input type="file1"/><input type="button" value="删除" οnclick="delOne(this)"/><br></div>';
}
function delOne(obj){
obj.parentNode.parentNode.removeChild(obj.parentNode);
}
</script>
3.上传的后台的注意点
(1).DiskFileItemFactory
public DiskFileItemFactory(int sizeThreshold,File repository)
public void setSizeThreshole(int sizeThreshole)//设定内存缓冲区大小
public void setRepository(File repository)//设置临时文件夹大小
(2).ServletFileUpload
boolean isMultipartContent(HttpServletRequest req)//判断表单是不是multipart/form-data类型
setFileMaxSize(long fileMaxSize)//设置单个文件最大大小
setMaxSize(long maxSize)//设置上传文件总量的最大值
setHeaderEncoding(String encoding)//设置文件的编码格式
List parseRequest(HttpServletRequest req)//解析request对象,将表单的每一个输入项包装成filelist对象
setProgressListener(ProgressListener listener)//实时监听文件上传状态
(3).FileItem
boolean isFormField()//判断FileItem是一个文件上传对象还是普通表单对象
如果是普通字段:
String getFieldName()//获取普通对象名称
String getString(String encoding)//获取表单对象的value
如果是文件上传对象:
String getName()//获取上传文件的文件名
InputStream getInputStream()//获取上传文件的输入流
delete()//在关闭FileItem输入流之后,删除临时文件
4.上传存放位置的问题
(1).upload文件夹和temp文件夹要放在WEB-INF下面防止上传入侵
(2).文件名要保持唯一,可以使用UUID
(3).为了保证一个目录下面不要文件过多,可以分目录。分目录的算法很多,此处介绍根据hash值分目录
String filename = item.getName();
String uuidName = UUID.randomUUID()+"_"+filename;
String hashStr = Integer.toHexString(hash);
char[] chs = hashStr.toCharArray();
String path = this.getServletContext.getRealPath("upload");
for(char c:chas){
path+="/"+c;
}
new File(path).mkdirs();
5.文件上传监视
fileUpload.setProgressListener(
Long beginTime = System.currentTimeMillis();
new ProgressListener(){
public void update(long bytesRead,long contentLength,int items){
BigDecimal br = new BigDecimal(bytesRead).divide(new BigDecimal(1024),2,BigDecimal.Round_HALF_UP);//已读取多少kb
BigDecimal cl = new BigDecimal(contentLength).divide(new BigDecimal(1024),2,BigDecimal.Round_HALF_UP);//总共有多少kb
Long nowTime = System.currentTimeMillis();
Long useTime = (nowTime-beginTime)/1000;//已经过了useTime 秒
}
}
);
//根据已知信息可以知道很多信息,如上传速度,上传大致剩余时间,剩余多少kb,已完成百分之多少等
jsp:
<form action="${pageContext.request.contextPath}/uploadServlet" method="post" ectype="multipart/form-data">
<input type="file" name="file1"/>
<input type="submit" value="上传"/>
</form>
servlet:
public class UploadServlet extends HttpServlet{
protected void doGet(HttpServletRequest req,HttpServletResponse resp) throws Exception{
try{
DiskFileItemFactory factory = new DiskFileItemFactory();
ServletFileUpload fileUpload = new ServletFileUpload(factory);
Map<String,List<FileItem>> map = fileUpload.parseParameterMap
}catch(Exception e){
}
}
}
6.文件下载
法一:超链接指向下载资源
法二:
response.setHeader("Content-Disposition","attachment,filename="+URLEncoder.encode(filename,"utf-8"));
response.setContentType(this.getServletContext.getMimeType(filename));