文件上传下载—servlet API实现

来源:互联网 发布:java中高并发解决方案 编辑:程序博客网 时间:2024/06/13 04:05

servlet API实现文件上传下载需要的jar包:

这里写图片描述

UploadServlet.Java

package com.ymw.web.servlet;import java.io.File;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream;import java.util.List;import java.util.UUID;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.FileUploadBase;import org.apache.commons.fileupload.ProgressListener;import org.apache.commons.fileupload.disk.DiskFileItemFactory;import org.apache.commons.fileupload.servlet.ServletFileUpload;/** * @ClassName: UploadHandleServlet * @Description: TODO * @author: lmb *  */public class UploadHandleServlet extends HttpServlet {    private static final long serialVersionUID = 1L;    public void doGet(HttpServletRequest request, HttpServletResponse response)            throws ServletException, IOException {        // 得到上传文件的保存目录,将上传的文件存放于WEB-INF目录下,不允许外界直接访问,保证上传文件的安全        String savePath = this.getServletContext().getRealPath("/images");        // 上传时生成的临时文件保存目录        String tempPath = this.getServletContext().getRealPath("/WEB-INF/temp");        File tmpFile = new File(tempPath);        if (!tmpFile.exists()) {            // 创建临时目录            tmpFile.mkdir();        }        // 消息提示        String message = "";        try {            // 使用Apache文件上传组件处理文件上传步骤:            // 1、创建一个DiskFileItemFactory工厂            DiskFileItemFactory factory = new DiskFileItemFactory();            // 设置工厂的缓冲区的大小,当上传的文件大小超过缓冲区的大小时,就会生成一个临时文件存放到指定的临时目录当中。            factory.setSizeThreshold(1024 * 100);// 设置缓冲区的大小为100KB,如果不指定,那么缓冲区的大小默认是10KB            // 设置上传时生成的临时文件的保存目录            factory.setRepository(tmpFile);            // 2、创建一个文件上传解析器            ServletFileUpload upload = new ServletFileUpload(factory);            // 监听文件上传进度            upload.setProgressListener(new ProgressListener() {                public void update(long pBytesRead, long pContentLength,                        int arg2) {                    System.out.println("文件大小为:" + pContentLength + ",当前已处理:"                            + pBytesRead);                    /**                     * 文件大小为:14608,当前已处理:4096 文件大小为:14608,当前已处理:7367                     * 文件大小为:14608,当前已处理:11419 文件大小为:14608,当前已处理:14608                     */                }            });            // 解决上传文件名的中文乱码            upload.setHeaderEncoding("UTF-8");            // 3、判断提交上来的数据是否是上传表单的数据            if (!ServletFileUpload.isMultipartContent(request)) {                // 按照传统方式获取数据                return;            }            // 设置上传单个文件的大小的最大值,目前是设置为1024*1024字节,也就是1MB            upload.setFileSizeMax(1024 * 1024);            // 设置上传文件总量的最大值,最大值=同时上传的多个文件的大小的最大值的和,目前设置为10MB            upload.setSizeMax(1024 * 1024 * 10);            // 4、使用ServletFileUpload解析器解析上传数据,解析结果返回的是一个List<FileItem>集合,每一个FileItem对应一个Form表单的输入项            List<FileItem> list = upload.parseRequest(request);            for (FileItem item : list) {                // 如果fileitem中封装的是普通输入项的数据                if (item.isFormField()) {                    String name = item.getFieldName();                    // 解决普通输入项的数据的中文乱码问题                    String value = item.getString("UTF-8");                    // value = new String(value.getBytes("iso8859-1"),"UTF-8");                    System.out.println(name + "=" + value);                } else {// 如果fileitem中封装的是上传文件                        // 得到上传的文件名称,                    String filename = item.getName();                    System.out.println(filename);                    request.setAttribute("filename", filename);                    if (filename == null || filename.trim().equals("")) {                        continue;                    }                    // 注意:不同的浏览器提交的文件名是不一样的,有些浏览器提交上来的文件名是带有路径的,如:                    // c:\a\b\1.txt,而有些只是单纯的文件名,如:1.txt                    // 处理获取到的上传文件的文件名的路径部分,只保留文件名部分                    filename = filename                            .substring(filename.lastIndexOf("\\") + 1);                    // 得到上传文件的扩展名                    String fileExtName = filename.substring(filename                            .lastIndexOf(".") + 1);                    // 如果需要限制上传的文件类型,那么可以通过文件的扩展名来判断上传的文件类型是否合法                    System.out.println("上传的文件的扩展名是:" + fileExtName);                    // 获取item中的上传文件的输入流                    InputStream in = item.getInputStream();                    // 得到文件保存的名称                    String saveFilename = makeFileName(filename);                    // 得到文件的保存目录                    String realSavePath = makePath(saveFilename, savePath);                    // 创建一个文件输出流                    FileOutputStream out = new FileOutputStream(realSavePath                            + "\\" + saveFilename);                    // 创建一个缓冲区                    byte buffer[] = new byte[1024];                    // 判断输入流中的数据是否已经读完的标识                    int len = 0;                    // 循环将输入流读入到缓冲区当中,(len=in.read(buffer))>0就表示in里面还有数据                    while ((len = in.read(buffer)) > 0) {                        // 使用FileOutputStream输出流将缓冲区的数据写入到指定的目录(savePath + "\\"                        // + filename)当中                        out.write(buffer, 0, len);                    }                    // 关闭输入流                    in.close();                    // 关闭输出流                    out.close();                    // 删除处理文件上传时生成的临时文件                    // item.delete();                    message = "文件上传成功!";                }            }        } catch (FileUploadBase.FileSizeLimitExceededException e) {            e.printStackTrace();            request.setAttribute("message", "单个文件超出最大值!!!");            request.getRequestDispatcher("/addproduct.jsp").forward(request,                    response);            return;        } catch (FileUploadBase.SizeLimitExceededException e) {            e.printStackTrace();            request.setAttribute("message", "上传文件的总的大小超出限制的最大值!!!");            request.getRequestDispatcher("/addproduct.jsp").forward(request,                    response);            return;        } catch (Exception e) {            message = "文件上传失败!";            e.printStackTrace();        }        request.setAttribute("message", message);        request.getRequestDispatcher("/addproduct.jsp").forward(request,                response);    }    /**     * @Method: makeFileName     * @Description: 生成上传文件的文件名,文件名以:uuid+"_"+文件的原始名称     * @Anthor:lmb     * @param filename     *            文件的原始名称     * @return uuid+"_"+文件的原始名称     */    private String makeFileName(String filename) { // 2.jpg        // 为防止文件覆盖的现象发生,要为上传文件产生一个唯一的文件名        return UUID.randomUUID().toString() + "_" + filename;    }    /**     * 为防止一个目录下面出现太多文件,要使用hash算法打散存储     *      * @Method: makePath     * @Description:     * @Anthor:lmb     *      * @param filename     *            文件名,要根据文件名生成存储目录     * @param savePath     *            文件存储路径     * @return 新的存储目录     */    private String makePath(String filename, String savePath) {        // 得到文件名的hashCode的值,得到的就是filename这个字符串对象在内存中的地址        int hashcode = filename.hashCode();        int dir1 = hashcode & 0xf; // 0--15        int dir2 = (hashcode & 0xf0) >> 4; // 0-15        // 构造新的保存目录        String dir = savePath + "\\" + dir1 + "\\" + dir2; // upload\2\3                                                            // upload\3\5        // File既可以代表文件也可以代表目录        File file = new File(dir);        // 如果目录不存在        if (!file.exists()) {            // 创建目录            file.mkdirs();        }        return dir;    }    public void doPost(HttpServletRequest request, HttpServletResponse response)            throws ServletException, IOException {        doGet(request, response);    }}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125
  • 126
  • 127
  • 128
  • 129
  • 130
  • 131
  • 132
  • 133
  • 134
  • 135
  • 136
  • 137
  • 138
  • 139
  • 140
  • 141
  • 142
  • 143
  • 144
  • 145
  • 146
  • 147
  • 148
  • 149
  • 150
  • 151
  • 152
  • 153
  • 154
  • 155
  • 156
  • 157
  • 158
  • 159
  • 160
  • 161
  • 162
  • 163
  • 164
  • 165
  • 166
  • 167
  • 168
  • 169
  • 170
  • 171
  • 172
  • 173
  • 174
  • 175
  • 176
  • 177
  • 178
  • 179
  • 180
  • 181
  • 182
  • 183
  • 184
  • 185
  • 186
  • 187
  • 188
  • 189
  • 190
  • 191
  • 192
  • 193
  • 194
  • 195
  • 196
  • 197
  • 198
  • 199
  • 200
  • 201
  • 202
  • 203
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125
  • 126
  • 127
  • 128
  • 129
  • 130
  • 131
  • 132
  • 133
  • 134
  • 135
  • 136
  • 137
  • 138
  • 139
  • 140
  • 141
  • 142
  • 143
  • 144
  • 145
  • 146
  • 147
  • 148
  • 149
  • 150
  • 151
  • 152
  • 153
  • 154
  • 155
  • 156
  • 157
  • 158
  • 159
  • 160
  • 161
  • 162
  • 163
  • 164
  • 165
  • 166
  • 167
  • 168
  • 169
  • 170
  • 171
  • 172
  • 173
  • 174
  • 175
  • 176
  • 177
  • 178
  • 179
  • 180
  • 181
  • 182
  • 183
  • 184
  • 185
  • 186
  • 187
  • 188
  • 189
  • 190
  • 191
  • 192
  • 193
  • 194
  • 195
  • 196
  • 197
  • 198
  • 199
  • 200
  • 201
  • 202
  • 203

upload.jsp(在该页面进行文件上传)

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%><!DOCTYPE HTML><html>  <head>    <title>文件上传</title>  </head>  <body>    <form action="upload.do" enctype="multipart/form-data" method="post">        <h2>请选择您需要上传的图片:</h2>          <input type="file" name="file1"><br><br>          <input type="submit" value="提交">    </form>  </body></html>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

web.xml中的配置:

<servlet>    <description>This is the description of my J2EE component</description>    <display-name>This is the display name of my J2EE component</display-name>    <servlet-name>UploadServlet</servlet-name>    <servlet-class>com.ymw.web.servlet.UploadServlet</servlet-class>  </servlet><servlet-mapping>    <servlet-name>UploadServlet</servlet-name>    <url-pattern>/upload.do</url-pattern>  </servlet-mapping>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

uploadResult.jsp(在该页面显示上传结果)

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html>  <head>    <title>uploadResult page</title>  </head>  <body>        ${ message }    <br/><br/>   文件路径:/images/${filename }  </body></html>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

注意:

要想在前台页面获得filename和message,后台的上传处理中一定要有

request.setAttribute("filename", filename);request.setAttribute("message", message);
0 0
原创粉丝点击