Java原生代码实现文件的上传与下载:
这是代码中需要使用到的包:
抽取成工具类的代码如下:
package cn._02upload;
import java.io.File;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.apache.commons.io.FilenameUtils;
public class UploadUtil {
//设置指定的文件格式
private static String[] arr = {"jpg","png","bmp","jif"};
public static void upload(HttpServletRequest req,Map<String,String> map) {
//检查是否有文件上传请求
boolean ismultipart = ServletFileUpload.isMultipartContent(req);
if(ismultipart) {
try {
//为基于磁盘的文件创建工厂
DiskFileItemFactory factory = new DiskFileItemFactory();
//设置缓存大小
factory.setSizeThreshold(1024*100*5);
//设置临时目录 文件上传完成以后就会删除
factory.setRepository(new File("C:/temp"));
//创建一个新的文件上传处理程序
ServletFileUpload upload = new ServletFileUpload(factory);
//设置上传文件的单个大小
upload.setFileSizeMax(1024*1024*4);
//解析请求
List<FileItem> items = upload.parseRequest(req);
for (FileItem fileItem : items) {
//处理普通字段
if(fileItem.isFormField()) {
//把字段装进map中
map.put(fileItem.getFieldName(), fileItem.getString("UTF-8"));
}else {
//定义上传文件的路径
String realPath = req.getServletContext().getRealPath("/upload");
//文件重命名
//获取文件的后缀名
String extension = FilenameUtils.getExtension(fileItem.getName());
List<String> asList = Arrays.asList(arr);
if(!asList.contains(extension)) {
//抛异常
throw new Exception("请上传指定文件格式");
}
String filename = String.valueOf(System.currentTimeMillis());
map.put(fileItem.getFieldName(), filename+"."+extension);
//处理文件
File file = new File(realPath,filename+"."+extension);
//判断文件夹是否存在
if(!file.getParentFile().exists()) {
file.getParentFile().mkdirs();
}
//把上传的数据写到指定文件夹中
fileItem.write(file);
}
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
这上面的代码注解写的很详细的了,注意配置好前台页面
如下:这是前台的页面
<form action="/a/reg" method="post" enctype="multipart/form-data">
用户名:<input type="text" name="username" ><br>
年龄:<input type="text" name="age" ><br>
头像:<input type="file" name="img" ><br>
<input type="submit" value="提交">
</form>
form表单中的需要配置enctype,其中的默认值为application/x-www-form-urlencoded,这种格式不支持文件的传输所以需要改为
multipart/form-data,这种格式不会对字符进行编码,所以我们再获取字段的时候需要手动设置编码集,不然会出现乱码情况
//把字段装进map中
map.put(fileItem.getFieldName(), fileItem.getString("UTF-8"));
文件的下载
代码如下:
package cn._03download;
import java.io.File;
import java.io.IOException;
import java.net.URLEncoder;
import java.nio.file.Files;
import java.nio.file.Paths;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/download")
public class DowenLoadServlet extends HttpServlet{
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//得到文件名
String filename = req.getParameter("name");
System.out.println(filename);
//得到文件的真实路径
String realPath = super.getServletContext().getRealPath("/download");
//拿到要下载的文件
File file = new File(realPath,filename);
//告诉浏览器文件下载,而不是直接打开(IE6直接打开)
resp.setContentType("application/x-msdownload");// text/html;charset=utf-8
//获取请求头中浏览器版本
String header = req.getHeader("User-Agent");
//MSIE----IE的浏览器标识
if(header.contains("MSIE")) {
filename = URLEncoder.encode(filename,"UTF-8");
}else {
new String(filename.getBytes("UTF-8"),"ISO-8859-1");
}
//下载的内容的名字问题
resp.setHeader("Content-Disposition","attachment; filename="+filename);
//将文件下载到本地
//两个参数:第一个参数相当于拿到程序中的真实文件 第二个参数拿到我们的响应输出流 然后通过流将文件从程序拷备到客户端
Files.copy(Paths.get(file.getAbsolutePath()), resp.getOutputStream());
}
}
值得注意的时IE浏览器的配置了,需要对IE浏览器进行单独的判断