1.首先前端利用表单收集用户的个人信息,由于在网页中显示数据时以字符串显示,在后台的Servlet中获取时,有内置的HttpServletRequest类,进行实例化后的request对象调用
getParameter()方法可获取前端输入的信息,可是当前台中携带二进制文件时,此时的request对象将不能对二进制数据进行获取,所以需要进行重新获取。
具体操作为:
(1)前端收集信息的表单的<from>标签应添加entype属性,其中取值为multipart/form-data,(即给后台显示前台传输的数据为二进制数据)改属性默认值是:application/x-www-form-urlencoded。(即给后台显示前台传输的数据是普通的字符串数据)
(2)在前台的<from>表单中添加<input type="file" name="filename">标签,其中input标签的type类型是file,代表文件。
(3)导入第三方的文件上传下载的驱动包。
(4)进行后台获取值实现上传和下载的功能;
2.具体如下:
(1)前端表单:
<body>
<form action="uploadServlet" method="post" enctype="multipart/form-data">
name:<input type="text" name="name"><br>
age:<input type="text" name="age"><br>
file:<input type="file" name="filename"><br>
<input type="submit" value="submit">
</form>
</body>
(2)实现文件的上传原理:
将文件保存到服务器的一个路径;
在数据库中记录文件的路径;
package com.file;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
public class UploadServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
this.doPost(request, response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html");
DiskFileItemFactory factory=new DiskFileItemFactory();//文件上传的缓冲模式(硬盘模式)
ServletFileUpload upload=new ServletFileUpload(factory);//创建文件上传的对象
try {
List<FileItem> l=upload.parseRequest(request);//将原来request中收集的普通域(可以作为String文本数据)数据转为一个List泛型是FileItem(文件域:超文本数据)是中,其中调用parseRequest()方法
String name="";
String age="";
String filename="";
for(FileItem fi:l){//遍历List集合
if(fi.isFormField()){//获取普通数据域的name属性值
filename=fi.getFieldName();
if("name".equals(filename)){
name=fi.getString();//获取普通数据域的name属性值对应的value值
}else{
age=fi.getString();
}
}else{//说明是文件域
InputStream in=fi.getInputStream();//得到文件的输入流
String path=this.getServletContext().getRealPath("/files/"+fi.getName());//得到该应用程序的绝对路径
filename=fi.getName();
System.out.println(path);
OutputStream ou=new FileOutputStream(path);//对应得到路径的输出流
byte [] b=new byte[100];//进行文件的复制操作
int num=in.read(b);
while(num!=-1){
ou.write(b,0,num);
num=in.read(b);
}
in.close();
ou.close();
filename="files/"+filename;
}
}
request.setAttribute("name", name);
request.setAttribute("age", age);
request.setAttribute("filename", filename);
request.getRequestDispatcher("show.jsp").forward(request, response);//进行请求转发,跳转至show.jsp界面显示
//response.sendRedirect("show.jsp");
} catch (FileUploadException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
(3)文件下载原理:
在浏览器中下载文件时:如果文件能够被浏览器识别(图片,文本等),浏览器会直接在线打开。而这里实现的是浏览器不在线打开,点击鼠标左键弹出保存的选项进行下载保存。
1.修改ContentType的属性为application/x-msdownload(告诉浏览器不要解析)默认是text\html(浏览器加载);
2.修改Content-Disposition属性,该属性设置浏览器对数据内容的展示方式,设置为attachment(告诉浏览器不要在线打开),默认是inline(在线打开);
package com.file;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class DownSrevlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
this.doPost(request, response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//response.setContentType("text/html");
response.setContentType("application/x-msdownload");//浏览器不要解析
String file=request.getParameter("filename");
response.setHeader("Content-Disposition", "attachment;filename="+file);//设置不在线打开
String path=this.getServletContext().getRealPath("/");
InputStream in=new FileInputStream(path+file);//得到服务器上文件的输入流
System.out.println(path+file);
OutputStream os=response.getOutputStream();//由响应得到对应此时客户端的输出流
byte[] b=new byte[100];
int num=in.read(b);//进行文件的复制
while(num!=-1){
os.write(b, 0, num);
num=in.read(b);
}
in.close();
os.close();
}
运行的结果为: