在java Web中实现文件的上传下载

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();
		
	}

运行的结果为: 



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值