javaee文件上传和下载操作

xiaoxiao2021-02-27  313

文件上传下载在研发时是经常用到,这里我就来总结下文件上传下载的步骤

1:新建web项目,导入进去两个jia包,没有jar包请自行去网上下载 2:在web界面编写表单 包含file文件域 表单必须以post方式提交 必须将表单上传的单位变为二级制enctype=”multipart/form-data”

<form action="UploadServlet" enctype="multipart/form-data" method="post">

然后再UpLoadServlet中写代码

// 可以判断当前请求是不是二进制,如果不是可以终止代码 if (!ServletFileUpload.isMultipartContent(request)) { return; }

先贴上代码,下面我做下解释:

// 获得FileItemFactory类 // 能够创建文件输入流的工厂对象 FileItemFactory factory = new DiskFileItemFactory(); // 获得ServletFileUpload对象 ServletFileUpload upload = new ServletFileUpload(factory); // 设置最大上传大小 upload.setSizeMax(3 * 1024 * 1024); // 设置上传字符集(好像不好用) // upload.setHeaderEncoding("utf-8"); // 通过upload对象中的parseRequest方法获得FileItem类型的集合 List<FileItem> list = upload.parseRequest(request); // 遍历所有表单元素 for (FileItem fi : list) { // 迭代到当前表单元素如果是普通元素 这里是普通元素 if (fi.isFormField()) { if (fi.getFieldName().equals("username")){ tx.setUsername(fi.getString("utf-8"));} if (fi.getFieldName().equals("gender")){ System.out.println(fi.getString("utf-8")); tx.setGender(fi.getString("utf-8"));} } else { // 如果是文件域 // 获得用户上传的文件名 // String filename = fi.getName(); if(!"".equals(fi.getName())||null!=fi.getName()){ // 使用时间偏移量和随机数来生成文件名,减少重复几率 String sui = (int) (Math.random() * 10000000) + ""; String shi = System.currentTimeMillis() + ""; //时间+随机数+上传文件名的后缀名 String filename; try { filename = shi + sui + fi.getName().substring( fi.getName().lastIndexOf(".")); // System.out.println(filename); // 获得项目在服务器计算机中的真实路径 String path = this.getServletContext() .getRealPath("upload"); fi.write(new File(path + "/" + filename)); //设置tx对象中的imgname属性为filename tx.setImgname(filename); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } } } } catch (FileUploadException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); }

通过jar中的ServletFileUpload类获取到表单中的值,然后给封装好的entity实体类赋值,然后添加到数据中表中,这里特别注意下一个文件名的问题,我来解释一下 我们作为服务端,客户端上传的图片名字可能一样,但是我们存到数据库的时候肯定不能一样,这样的话后面上传的图片就会被覆盖,我们需要对用户传来的图片进行命名,就是下面的代码

// 使用时间偏移量和随机数来生成文件名,减少重复几率 String sui = (int) (Math.random() * 10000000) + ""; String shi = System.currentTimeMillis() + ""; //时间+随机数+上传文件名的后缀名 String filename; try { filename = shi + sui + fi.getName().substring( fi.getName().lastIndexOf(".")); // System.out.println(filename);

然后把用户上传的图片保存下来

// 获得项目在服务器计算机中的真实路径 String path = this.getServletContext() .getRealPath("upload"); fi.write(new File(path + "/" + filename)); //设置tx对象中的imgname属性为filename

这样的话图片就保存在upload文件夹中了 对了,漏了一点,我给大家说下那个upload文件下 就是在webRoot下建的 这样的话就会在tomcat下出现这个文件夹,用户上传的图片就被保存到这里了 这里是就是一张客户端上传到服务器的的一张图片 以上内容都是图片上传操作,下面我来说一下图片下载,就是从服务器把图片下载到客户端,直接上代码。。

<td><a href="DownLoadServlet?imgname=${t.imgname }">下载</a></td>

这里是网页上下载,点击下载跳转到DownLoadServlet 这里代码大部分代码都是死的我就不详细解释了,有疑问的同学欢迎和我交流学习。。。

//获得要下载的文件 String fname = request.getParameter("imgname"); System.out.println(fname); // 获得输入文件流 InputStream is = this.getServletContext().getResourceAsStream( "upload\\" + fname); // 设置响应类型为一个可下载的文件 response.setContentType("application/x-msdownload"); // 设置下载文件的文件名 String file = URLEncoder.encode("小冰库软件" + fname, "utf-8"); // 设置响应头文件配置 response.addHeader("Content-Disposition", "attachment; filename=\"" + file + "\""); // 输出流 ServletOutputStream out = response.getOutputStream(); byte[] bs = new byte[is.available()]; // 获得文件输入流 is.read(bs); // 把文件输出到客户端 out.write(bs); out.close(); is.close();
转载请注明原文地址: https://www.6miu.com/read-3182.html

最新回复(0)