JSP的文件上传下载
- input的type设置为file
- form表单的method设置为post,get请求会将文件名传给服务端,而不是文件本身。
- form表单的enctype设置multipart/form-data,以二进制的形式传输数据
upload.jsp
<form enctype="multipart/form-data" action="/upload" method="post">
<input type="text" name="text1" />
<input type="file" name="text2" />
<input type="file" name="text3" />
<input type="submit" value="上传文件">
</form>
servlet中最初接收文件上传下载的流程:
@WebServlet("/upload")
public class Upload_Servlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("UTF-8");
//输入流用于接收文件
InputStream inputStream = req.getInputStream();
Reader reader = new InputStreamReader(inputStream);
BufferedReader bufferedReader = new BufferedReader(reader);
//输出流用于书写文件
//通过req获取发布项目的具体位置
String path = req.getServletContext().getRealPath("file/my_Try.txt");
OutputStream outputStream = new FileOutputStream(path);
Writer writer = new OutputStreamWriter(outputStream);
BufferedWriter bufferedWriter = new BufferedWriter(writer);
//此处通过字符进行接收,若采用字节可通过 int temp=0;等进行
String temp = null;
while((temp=bufferedReader.readLine())!=null)
{
bufferedWriter.write(temp);
System.out.println(temp);
}
//关闭输入输出流
bufferedWriter.close();
writer.close();
outputStream.close();
bufferedReader.close();
reader.close();
inputStream.close();
}
后来可以通过用fileupload组件将所有的请求信息解析为FileItem 对象,通过对该对象的操作完成上传,面向对象的思想。
额外需要配置
采用FileItem 对象上传
package com.Chase.My_Servlet;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.util.List;
@WebServlet("/upload")
public class Upload_Servlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
try {
req.setCharacterEncoding("UTF-8");
DiskFileItemFactory fileItemFactory = new DiskFileItemFactory();
ServletFileUpload servletFileUpload = new ServletFileUpload(fileItemFactory);
List<FileItem> list = servletFileUpload.parseRequest(req);//通过serlvetFileUpload不使用 req.getInputStream()进行操作
for(FileItem fileItem : list) {
if(fileItem.isFormField()){
String name = fileItem.getFieldName();//对应的框名
String value = fileItem.getString("UTF-8");//设置对应的获取文本格式
System.out.println(name+":"+value);
}else{
String filename = fileItem.getName();//对应的 属性名
InputStream inputStream = fileItem.getInputStream();//创建上传对象的输入流
String path = req.getServletContext().getRealPath("file/"+filename);//服务器对应地址
OutputStream outputStream = new FileOutputStream(path);//服务器对应地址的输出流
int temp =0 ;//该处通过字节的方式传输可接收空格
while((temp = inputStream.read())!=-1)
{
outputStream.write(temp);
}
outputStream.close();
inputStream.close();
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
文件下载
download.jsp
<body>
<a href="/download?name=1.png">1.png </a>
</body>
download_Servlet
@WebServlet("/download")
public class download_file extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setContentType("application/x-msdownload");//设置响应方式
String name = req.getParameter("name");
resp.setHeader("Content-Disposition","attachment;filename="+name);//设置下载之后的文件名(resp)
String path = req.getServletContext().getRealPath("file/"+name);
InputStream inputStream = new FileInputStream(path);//服务器下载输入流
OutputStream outputStream = resp.getOutputStream();//客户端输出(下载)
int temp =0 ;
while((temp= inputStream.read())!=-1)
{
outputStream.write(temp);
}
outputStream.close();
inputStream.close();
}
}