java 文件的上传和下载的操作
2018-02-01 22:20
260 查看
文件上传
1.文件上传的技术 *JSPSmartUpload:在jsp页面使用代码进行文件上传,已经不用了。 *FileUpload:在java环境中实现文件上传,apache公司提供开发jar包 *Servlet3.0:在这个版本提供了文件上传功能。 *Struts2.0:在这个版本提供了文件上传功能。 2.文件上传的条件 * form表单必须是post提交方式。 * 使用<input type=”file” name=”xxx”/>;type必须是file类型,必须要有name属性值 * form表单必须使用enctype=”multipart/form-data”属性 3.文件上传的步骤 第一步:创建磁盘文件项工厂 第二步:创建核心上传类 第三步:使用核心上传类解析request对象 返回的List集合,集合里面有多个FileItem,List<FileItem> 第四步:遍历list集合,得到每个FileItem 第五步:判断是普通输入项还是文件上传项 boolean isFormField() 第六步:如果是普通输入项得到值; 如果是文件上传项编写上传的代码 getFieldName():得到普通输入项name的属性的值 getString():得到普通输入项里面输入的值 文件上传项 得到通过表单提交过了的文件的输入流,getInputStream() 创建输出流,把文件的输入流写到服务器的一个文件中 4.基本代码实现 `//创建磁盘文件项工程 DiskFileItemFactory factory=new DiskFileItemFactory(); //创建核心上传类 ServletFileUpload servletFileUpload=new ServletFileUpload(factory); //解析请求 try { List<FileItem > fileItems = servletFileUpload.parseRequest(request); //处理解析结果,遍历fileItems集合,判断是普通项还是文件上传项 for (FileItem fileItem : fileItems) { if (fileItem.isFormField()) { //是普通表单项 String name = fileItem.getFieldName();//获取表单项name值 String value = fileItem.getString("utf-8");//获取value值 System.out.println(name+"="+value); }else{ //是文件上传项 String fileName = fileItem.getName();//获取文件名 //我们只需要a.txt int index = fileName.lastIndexOf("\\"); if (index!=-1) { //C:\Users\zxy\Desktop\a.txt是这种文件名 fileName=fileName.substring(index+1); } System.out.println("fileName="+fileName); //生成唯一的用户名: String newFileName = UploadUtils.getUUIDFileName(fileName); //获取文件内容,文件内容可能是文本,如果是图片那就是流,总之获取输入流就行了。 InputStream iStream = fileItem.getInputStream(); //创建保存文件额路径 String path = getServletContext().getRealPath("/upload"); //获取文件该存放的子目录 String innerDirectory = UploadUtils.getDirectoryByHashCode(newFileName); //String innerDirectory = UploadUtils.getDirectoryByDate(); //创建完整目录File对象 File saveDirectoryFile=new File(path+innerDirectory); if (!saveDirectoryFile.exists()) { saveDirectoryFile.mkdirs(); } System.out.println(saveDirectoryFile); //创建输出流,把文件写到服务器中 OutputStream oStream=new FileOutputStream(new File(saveDirectoryFile,newFileName)); //两个流对接 int len=-1; byte[] buffer=new byte[1024]; while((len=iStream.read(buffer))!=-1){ oStream.write(buffer, 0, len); } iStream.close(); oStream.close(); } } } catch (FileUploadException e) { e.printStackTrace(); }` 5.问题解决 1.文件同名问题(随机字符串唯一文件名解决) 2.同一文件夹文件过多问题(目录分离算法)
文件下载
文件下载的一个流二个头 一个流:资源文件的输入流 InputStream is1 = sc.getResourceAsStream("/download/美女.jpg"); 二个头: 响应数据的类型 response.setHeader("Content-Type",mimeType ); 设置浏览器打开方式 response.setHeader("Content-Disposition", "attachement;filename=美女.jpg"); ----------------------------代码演示------------------------------------------------ package com.itheima.servlet; import java.io.IOException; import java.io.InputStream; import java.io.UnsupportedEncodingException; import java.net.URLEncoder; import javax.servlet.ServletContext; import javax.servlet.ServletException; import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import sun.misc.BASE64Encoder; public class DownloadServlet extends HttpServlet { private static final long serialVersionUID = 1L; protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //获取文件名解决中文乱码 String filename = new String(request.getParameter("filename").getBytes("ISO8859-1"),"UTF-8"); //获取web项目下的资源文件 ServletContext sc = this.getServletContext(); InputStream is = sc.getResourceAsStream("/web/download/"+filename); //设置content-type头 response.setHeader("Content-Type", sc.getMimeType(filename)); //获取客户端信息 String agent = request.getHeader("User-Agent"); //判断是火狐浏览器还是其他浏览器,对附件文件名进行编码 if(agent.contains("Firefox")){ // filename = base64EncodeFileName(filename); filename = new String(filename.getBytes("UTF-8"), "ISO8859-1"); }else{ filename = URLEncoder.encode(filename,"UTF-8"); } //设置附件下载的头 response.setHeader("Content-Disposition", "attachment;filename="+filename); //获取响应中的输出流 ServletOutputStream os = response.getOutputStream(); int len = 0 ; byte[] bts = new byte[1024]; while((len =is.read(bts))!=-1){ os.write(bts, 0, len); } is.close(); } public static String base64EncodeFileName(String fileName) { BASE64Encoder base64Encoder = new BASE64Encoder(); try { return "=?UTF-8?B?" + new String(base64Encoder.encode(fileName .getBytes("UTF-8"))) + "?="; } catch (UnsupportedEncodingException e) { e.printStackTrace(); throw new RuntimeException(e); } } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }
相关文章推荐
- Java实现对文件的上传下载操作
- Java实现远程HDFS的文件操作(新建、上传、下载、删除)
- mongoDB——java操作mongoDB实现文件上传下载
- mongoDB——java操作mongoDB实现文件上传下载
- java操作ftp实现文件的上传下载(适用于图片文档服务器)
- mongoDB——java操作mongoDB实现文件上传下载
- mongoDB——java操作mongoDB实现文件上传下载
- 使用java操作FastDFS上传,下载,删除文件
- 使用java操作FastDFS上传,下载,删除文件
- java 两个通过java代码操作FTP的类,上传下载删除,获取文件
- java使用Jsch实现远程操作linux服务器进行文件上传、下载,删除和显示目录信息
- Java实现远程HDFS的文件操作(新建、上传、下载、删除)
- java实现对hdfs文件系统的上传,下载,删除,创建文件夹的操作演示
- java 两个通过java代码操作FTP的类,上传下载删除,获取文件
- mongoDB——java操作mongoDB实现文件上传下载
- 利用Java操作FTP文件上传,下载,删除
- java操作hadoop hdfs,实现文件上传下载demo
- mongoDB——java操作mongoDB实现文件上传下载
- java操作FTP,实现文件上传下载删除操作
- java操作hdfs,实现文件上传、下载以及查看当前文件夹下所有文件