文件上传
jsp
jsp需要做如下配置:
- <input>标签的
type="file"
,需要带上name属性 - <form>表单的
method="post"
- <form>表单的
enctype="multipart/form-data"
,表示以二进制流传输
servlet
方法一:底层方法读写
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
InputStream inputStream = req.getInputStream(); // 获取字节流
Reader reader = new InputStreamReader(inputStream); //将inputStream 字节流 转化成 字符流
BufferedReader bufferedReader = new BufferedReader(reader); // 建立一个缓冲字符流,
String path = req.getServletContext().getRealPath("file/copy.txt"); //获取文件的绝对路径
OutputStream outputStream = new FileOutputStream(path); // 输出字节流
Writer writer = new OutputStreamWriter(outputStream); // 输出字符流
BufferedWriter bufferedWriter = new BufferedWriter(writer);// 输出字符缓冲流
String str = "";
while((str = bufferedReader.readLine())!=null)
{
bufferedWriter.write(str);
bufferedWriter.flush();
}
bufferedWriter.close();
writer.close();
outputStream.close();
bufferedReader.close();
reader.close();
inputStream.close();
}
这种方法读取会包含一些浏览器的信息,以字节流读取可换行,字符流读取无法换行
方法二:利用apache提供的包:commons-fileupload
、commons-io
利用面向对象的思想去读写,包需要自己下载和配置到项目中。
fileupload包可将所有的请求信息解析为FileItem对象,通过对FileItem对象的操作完成读写功能。
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
DiskFileItemFactory diskFileItemFactory = new DiskFileItemFactory();
ServletFileUpload servletFileUpload = new ServletFileUpload(diskFileItemFactory);
try {
List<FileItem> list = servletFileUpload.parseRequest(req);
for(FileItem item:list)
{
// System.out.println(item.getName()); //文件名
// System.out.println(item.getFieldName()); // input组件里的属性名字
if(item.isFormField()) //输入框
{
String name = item.getFieldName();
String value = item.getString("UTF-8");
System.out.println(name+":"+value);
}
else //文件
{
String name = item.getName();
long size = item.getSize();
System.out.println(name+":"+size+"Byte");
InputStream inputStream = item.getInputStream();
// Reader reader = new InputStreamReader(inputStream);
// BufferedReader bufferedReader = new BufferedReader(reader);
String path = req.getServletContext().getRealPath("file/"+name); //获取文件的绝对路径
OutputStream outputStream = new FileOutputStream(path);
// Writer writer = new OutputStreamWriter(outputStream);
// BufferedWriter bufferedWriter = new BufferedWriter(writer);
int tmp = 0;
while ((tmp=inputStream.read())!= -1)
{
outputStream.write(tmp);
}
// String tmp = "";
// while ((tmp = bufferedReader.readLine())!=null)
// {
// bufferedWriter.write(tmp);
// }
// bufferedWriter.close();
// writer.close();
outputStream.close();
// bufferedReader.close();
// reader.close();
inputStream.close();
System.out.println("上传成功");
}
}
} catch (FileUploadException e) {
e.printStackTrace();
}
}
以字节流读取、保存,可适用任何文件,字符流只是针对文本信息
文件下载
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<a href="/download?type=jpg"> 1.jpg </a>
<a href="/download?type=txt"> 1.txt </a>
</body>
</html>
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setContentType("application/octet-stream"); //设置响应方式
String type = req.getParameter("type");
String fileName = "";
if(type.equals("txt"))
{
fileName = "1.txt";
}
if(type.equals("jpg"))
{
fileName = "1.jpg";
}
resp.setHeader("Content-Disposition","attachment;filename="+fileName);//设置下载后的文件名
OutputStream outputStream = resp.getOutputStream();//获取输出流
String path = req.getServletContext().getRealPath("file/"+fileName);//获取资源路径
InputStream inputStream = new FileInputStream(path);
int tmp =0;
while ((tmp=inputStream.read())!=-1)
{
outputStream.write(tmp);
}
inputStream.close();
outputStream.close();
}