基本配置
-
jar
commons-fileupload组件
commons-io -
文件编写
jsp
<!--
若有 input type="file",则 method 必须是 post,
且必须设置 enctype="multipart/form-data"
-->
<form action="upload" class="myStyle" method="post" enctype="multipart/form-data">
学号:<input name="sno" type="text" class="myStyle"><br/>
姓名:<input name="sname" type="text" class="myStyle"><br/>
上传照片:<input type="file" name="spicture"><br/>
<input class="myStyle" type="submit" value="注册">
</form>
servlet:
boolean isMultipart = ServletFileUpload.isMultipartContent(request);
//判断前台的form是否有multipart属性
if(isMultipart){
DiskFileItemFactory fileItemFactory = new DiskFileItemFactory();
ServletFileUpload upload = new ServletFileUpload(fileItemFactory);
try {
//设置上传文件时用到的临时文件的大小DiskFileItemFactory
fileItemFactory.setSizeThreshold(10240);
fileItemFactory.setRepository(new File(request.getSession().getServletContext().getRealPath("Upload")));
Thread.sleep(3000);
//控制上传单个文件的大小
upload.setSizeMax(20480);
/*
1. 通过parseRequest解析form中的所有请求字段,并保存到items集合中
即前台传递的sno sname spicture此时就保存在items中
2. 用迭代器Iterator<FileItem>遍历
3. 上述各种设置限制设置需要在此方法前
*/
List<FileItem> items = upload.parseRequest(request);
Iterator<FileItem> iterator = items.iterator();
while (iterator.hasNext()){
FileItem item = iterator.next();
String itemName = item.getFieldName();
int sno = -1;
String sname = null;
/*
判断前台字段是普通form表单字段(sno sname),还是文件字段
由于enctype="multipart/form-data"字段,不可用request.getParameter()
*/
if(item.isFormField()){
if(itemName.equals("sno")){
sno = Integer.parseInt(item.getString("UTF-8"));
}else{
sname = item.getString("UTF-8");
}
}
else {
/*
文件上传
getFieldName()是获取普通表单字段的Name值
getName()是获取文件名
*/
String fileName = item.getName();
//控制格式
String ext = fileName.substring(fileName.indexOf(".")+1);
if(!(ext.equals("png")||ext.equals("jpg")||ext.equals("gif"))){
System.out.println("图片类型有误!格式只能是png gif jpg");
return;
}
//设置上传文件时用到的临时文件的大小DiskFileItemFactory
fileItemFactory.setSizeThreshold(10240);
fileItemFactory.setRepository(new File(request.getSession().getServletContext().getRealPath("Upload")));
Thread.sleep(3000);
//控制上传单个文件的大小
upload.setSizeMax(20480);
/*
获取文件内容并上传
定义文件路径:制定上传的位置(服务器路径)
获取服务器路径
最好还是保存于别的虚拟路径,否则项目重启之前的文件会不见
*/
String path = request.getSession().getServletContext().getRealPath("Upload");
File file = new File(path,fileName);
try {
//将该文件写入到上传位置,文件名为fileName
item.write(file);
} catch (Exception e) {
e.printStackTrace();
}
System.out.println(fileName+"上传成功!");
return;
}
}
} catch (FileUploadException | InterruptedException e) {
e.printStackTrace();
}
}
下载
- jar 不需要
- 步骤
a. 请求(地址a form),请求Servlet
b. Servlet通过文件的地址 将文件转为输入流 读到Servlet中
c. 通过输出流 将刚才已经转为输入流的文件 输出给用户
String fileName = request.getParameter("fileName");
//下载文件:需要设置消息头
response.addHeader("content-Type","application/octet-stream");//MIME类型:二进制文件(任意文件)
//fileName包含文件后缀,下载的编码格式
String agent = request.getHeader("User-Agent");
response.addHeader("content-Disposition","attachment;filename="+ URLEncoder.encode(fileName,"UTF-8"));
/*
其中火狐浏览器比较特殊:
if(agent.toLowerCase().contains("firefox"))
response.addHeader("content-Disposition","attachment;filename=?UTF-8?B?"+new String(Base64.encodeBase64(fileName.getBytes(StandardCharsets.UTF_8)))+"?=" );
*/
//Servlet通过文件的地址 将文件转为输入流 读到Servlet中
InputStream in = getServletContext().getResourceAsStream("/Upload/"+fileName);
//通过输出流 将 刚才已经转为输入流的文件 输出给用户
ServletOutputStream out = response.getOutputStream();
byte[] bs = new byte[10];
int len = -1;
while ((len=in.read(bs))!= -1){
out.write(bs,0,len);
}
out.close();
in.close();