转载自:http://blog.csdn.net/a352193394/article/details/7477041
文件上传是网站非常常用的功能,直接使用Servlet获取上传文件还得解析请求参数,比较麻烦,所以一般选择采用
apache的开源工具,common-fileupload.这个jar包可以再apache官网上面找到,也可以在struts的lib文件夹下面找到,
struts上传的功能就是基于这个实现的。
common-fileupload是依赖于common-io这个包的,所以还需要下载这个包。然后导入到你的项目路径下面。
使用代码如下
- package oop.hg.ytu.servlet;
- import java.io.File;
- import java.io.IOException;
- import java.io.InputStream;
- import java.util.List;
- import javax.servlet.ServletException;
- import javax.servlet.http.HttpServlet;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletResponse;
- import oop.hu.ytu.dao.UploadDomain;
- import org.apache.commons.fileupload.FileItem;
- import org.apache.commons.fileupload.disk.DiskFileItemFactory;
- import org.apache.commons.fileupload.servlet.ServletFileUpload;
- public class Upload extends HttpServlet {
- /**
- * 处理用户上传请求
- */
- private static final long serialVersionUID = 1L;
- public void doGet(HttpServletRequest request, HttpServletResponse response)
- throws ServletException, IOException {
- // String describe = request.getParameter("describe");
- DiskFileItemFactory factory = new DiskFileItemFactory();
- @SuppressWarnings("deprecation")
- String path = request.getRealPath("/upload");//设置磁盘缓冲路径
- factory.setRepository(new File(path));
- factory.setSizeThreshold(1024*1024);//设置创建缓冲大小
- ServletFileUpload upload = new ServletFileUpload(factory);
- upload.setSizeMax(-1);//设置上传文件限制大小,-1无上限
- try {
- @SuppressWarnings("unchecked")
- List<FileItem> list = upload.parseRequest(request);
- String va = null;
- for(FileItem item : list){
- // String name = item.getFieldName();
- if(item.isFormField()){//判断是否是文件流
- va = item.getString("UTF-8");
- // System.out.println(name+"="+va);
- /// request.setAttribute(name, value);
- }else{
- String value = item.getName();//会将完整路径名传过来
- int start = value.lastIndexOf("\\");
- String fileName = value.substring(start+1);
- // request.setAttribute(name, fileName);
- InputStream in = item.getInputStream();
- UploadDomain dao = new UploadDomain();
- //item.write(new File(realPath,fileName));
- int index = fileName.lastIndexOf(".");
- String realFileName = fileName.substring(0,index);
- String type = fileName.substring(index+1);
- dao.insert(in, realFileName,type,va);//放入到数据库中
- }
- }
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- public void doPost(HttpServletRequest request, HttpServletResponse response)
- throws ServletException, IOException {
- doGet(request, response);
- }
- }
代码如下
- package oop.hu.ytu.dao;
- import java.io.InputStream;
- import java.sql.Connection;
- import java.sql.PreparedStatement;
- import java.sql.ResultSet;
- import oop.hg.ytu.utils.JdbcUtils;
- /**
- * 提供文件上传支持
- * @author Administrator
- *
- */
- public class UploadDomain {
- /**
- * 将上传的文件流放入到数据库中
- */
- public void insert(InputStream in, String fileName, String type,String describe) throws Exception{//向数据库中写入图片
- Connection conn = null;
- PreparedStatement ps = null;
- ResultSet rs = null;
- System.out.println(describe);
- try {
- // 2.建立连接
- conn = JdbcUtils.getConnection();
- // 3.创建语句
- String sql = "insert into fileupload(file,filename,type,des) values (?,?,?,?)";
- ps = conn.prepareStatement(sql);
- ps.setBlob(1, in);
- ps.setString(2, fileName);
- ps.setString(3, type);
- ps.setString(4, describe);
- // 4.执行语句
- ps.executeUpdate();
- in.close();
- } finally {
- JdbcUtils.free(rs, ps, conn);
- }
- }
- }
可能会遇到数据库默认问价大小限制,需要在mysql安装目录下面的my.ini下面更改如下配置,
- [mysqld]
- max_allowed_packet=64M
这样就可以了。当然,注意编码格式。上传文件搞定。还有就是我的一个列名设置为describe,结果和Mysql保留字冲
突,出现无法插入信息现象,以后一定要注意.
因为将上传的内容放入到数据库中,所以也就不方便给定一个确切的地址让浏览器来下载,希望直接通过数据流的读
取实现文件的下载,这样更加方便一些。下面我们来演示一下文件的下载代码
- package oop.hg.ytu.servlet;
- import java.io.IOException;
- import java.io.InputStream;
- import java.net.URLEncoder;
- import javax.servlet.ServletException;
- import javax.servlet.ServletOutputStream;
- import javax.servlet.http.HttpServlet;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletResponse;
- import oop.hu.ytu.dao.DownLoadDomain;
- public class DownLoad extends HttpServlet {
- /**
- * 实现文件的下载
- */
- private static final long serialVersionUID = 1L;
- public void doGet(HttpServletRequest request, HttpServletResponse response)
- throws ServletException, IOException {
- DownLoadDomain dao = new DownLoadDomain();
- response.setContentType("text/html;charset=UTF-8");
- // 设置为下载application/x-download
- response.setContentType("application/x-download");
- String fileName = request.getParameter("fileName");
- fileName = new String(fileName.getBytes("ISO-8859-1"),"UTF-8");
- String type = dao.getType(fileName);
- type = "."+type;
- type = fileName + type;
- type = URLEncoder.encode(type, "UTF-8");
- response.addHeader("Content-Disposition", "attachment;filename="
- + type);
- InputStream in = dao.readBlob(fileName);
- ServletOutputStream out = response.getOutputStream();
- byte[] buff = new byte[1024];
- int i = 0;
- while((i = in.read(buff))>0){
- out.write(buff, 0, i);
- }
- out.flush();
- out.close();
- in.close();
- }
- public void doPost(HttpServletRequest request, HttpServletResponse response)
- throws ServletException, IOException {
- doGet(request, response);
- }
- }
这里主要就是下载的设置的那些头文件,请求头,还有就是下载的文件名如果含有中文,需要进行一下字符集的编码
才能够实现不乱码!
版权声明:本文为博主原创文章,未经博主允许不得转载。