Servlet-文件上传

Servlet文件上传

流程:

前台:
1. 提交方式:method:post
2. 文件编码:enctype="multipart/form-data" 【上传的为二进制文件
3. input内: 添加accept="image/*" 【可以确保上传的类型只能是图片

后台:
1. 导入2个jar包
1. commons-fileupload-1.4.jar
2. commons-io-2.6.jar
2. 前部分代码是固定写法,用来做一些准备工作。 直到遍历出Item,一个Item就是对应一个浏览器提交的数据,通过item.getInputStream可以打开浏览器上传的文件的输入流。
3. 客户提交的文件名有可能是一样的,所以在服务端保存文件的时候,不能使用客户提交的文件名。这里使用的是一种粗糙的解决文件名重复的办法,即使用时间戳。
4. 对于非文件字段如何处理:在遍历Item时(Item即对应浏览器提交的字段),可以通过item.isFormField

html:

<!DOCTYPE html>
<html lang="zh-CN">

<head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>文件上传示例</title>
    <!-- Bootstrap -->
    <link href="css/bootstrap.min.css" rel="stylesheet">
    <script src="//cdn.bootcss.com/jquery/1.11.3/jquery.min.js"></script>
    <!--jquery-->
    <script src="js/bootstrap.min.js"></script>

    <style>
        div.upload_div{
            width:400px;
            margin:80px auto;
        }
        div.upload_type{
            height: 50px;
        }
    </style>
</head>

<body>

    <div class="workArea">
        <div class="upload_div">
            <form method="post" enctype="multipart/form-data" action="uploadServlet">
                <div class="panel panel-primary">
                    <div class="panel-heading">上传文件</div>
                    <div class="panel-body">
                        <div class="upload_type">
                            <span>选择文件类型</span>
                            <label>
                                <select name="imgType">
                                    <option value="big">大图</option>
                                    <option value="small">小图</option>
                                </select>
                            </label>
                        </div>
                        <input type="file" accept="image/*" name="imgPath">

                        <!--隐藏域-->
                        <input type="hidden" name="gid" value="12">
                        <input type="submit" value="提交">
                    </div>
                </div>
            </form>
        </div>
    </div>

</body>

</html>

Servlet类

/**
 item.isFormField
 * @author a_apple
 * @create 2019-12-08 14:59
 */
@WebServlet("/uploadServlet")
public class UploadServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //存储提交参数
        HashMap<String,String> params = new HashMap<>();
        String filename = null;
        try{
            DiskFileItemFactory factory = new DiskFileItemFactory();
            ServletFileUpload upload = new ServletFileUpload(factory);
            //设置上传文件大小的限制为1M
            factory.setSizeThreshold(1024 * 1024);

            List items = null;
            try {
                //获取浏览器提交的数据
                items = upload.parseRequest(request);
            }catch (FileUploadException e){
                e.printStackTrace();
            }

            Iterator iter = items.iterator();
            while(iter.hasNext()){
                FileItem item = (FileItem) iter.next();
                //文件部分
                if (!item.isFormField()) {

                    // 根据时间戳创建图片文件
                    filename = System.currentTimeMillis() + ".jpg";
                    //获取发布目录下img/big的真实路径
                    String imgFolder = request.getServletContext().getRealPath("img/big");
                    
                    System.out.println(imgFolder);
                    
                    File imgFile = new File(imgFolder, filename);
                    imgFile.getParentFile().mkdirs();

                    // 通过item.getInputStream()获取浏览器上传的文件的输入流
                    InputStream is = item.getInputStream();

                    // 复制文件
                    FileOutputStream fos = new FileOutputStream(imgFile);
                    byte arr[] = new byte[1024 * 1024];
                    int len = 0;
                    while ((len = is.read(arr)) != -1 ) {
                        fos.write(arr, 0, len);
                    }
                    fos.close();

                } else {
                    //非文件字段
                    String name = item.getFieldName();
                    String value = item.getString();
                    value = new String(value.getBytes("ISO-8859-1"), "UTF-8");

                    params.put(name,value);
                }
            }

            System.out.println("上传参数:"+params.toString());

            String html = "<img width='400px' src='img/big/"+filename+"' />";
            response.setContentType("text/html");
            response.getWriter().write(html);
        }catch (FileNotFoundException e){
            e.printStackTrace();
        }
    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }
}

图片:在这里插入图片描述

在这里插入图片描述控制台:
在这里插入图片描述
上传图片的位置:
在这里插入图片描述

笔记

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是在 Eclipse 中创建名为 "UploadServlet" 的 Servlet 的步骤: 1. 打开 Eclipse IDE,并创建一个新的动态 Web 项目。选择 "File" -> "New" -> "Dynamic Web Project"。 2. 在 "Dynamic Web Project" 对话框中,输入项目名称,例如 "FileUploadDemo"。然后点击 "Next"。 3. 在 "New Dynamic Web Project" 对话框中,选择 "Generate web.xml deployment descriptor" 选项,然后点击 "Next"。 4. 在 "Project Facets" 对话框中,选择 "Java" 和 "Dynamic Web Module",并设置相应的版本。然后点击 "Next"。 5. 在 "Configuration for Dynamic Web Project" 对话框中,设置 "Content Directory" 为 "WebContent"。然后点击 "Finish"。 6. 在 "Project Explorer" 视图中,右键单击 "src" 目录,选择 "New" -> "Servlet"。 7. 在 "New Servlet" 对话框中,输入 "UploadServlet" 作为 Servlet 名称,然后点击 "Next"。 8. 在 "New Servlet" 对话框中,选择 "Use an existing servlet class" 选项,然后点击 "Browse" 按钮。 9. 在 "Select a Servlet Class" 对话框中,选择 "javax.servlet.http.HttpServlet" 类并点击 "OK"。 10. 点击 "Finish" 完成创建 Servlet。 11. 在 UploadServlet 类中,覆盖 doPost() 方法来处理文件上传请求。以下是示例代码: ```java import java.io.*; import javax.servlet.*; import javax.servlet.http.*; public class UploadServlet extends HttpServlet { public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 处理文件上传请求 } } ``` 12. 在 doPost() 方法中,使用 Apache Commons FileUpload 库来解析上传文件。以下是示例代码: ```java import org.apache.commons.fileupload.*; import org.apache.commons.fileupload.disk.*; import org.apache.commons.fileupload.servlet.*; public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 从 request 中获取文件上传对象 DiskFileItemFactory factory = new DiskFileItemFactory(); ServletFileUpload upload = new ServletFileUpload(factory); List<FileItem> items = upload.parseRequest(request); // 处理文件上传请求 } ``` 13. 在 doPost() 方法中,遍历文件上传对象列表并保存每个文件。以下是示例代码: ```java for (FileItem item : items) { if (!item.isFormField()) { // 保存上传文件到服务器 File uploadedFile = new File("C:/uploads/" + item.getName()); item.write(uploadedFile); } } ``` 14. 在 doPost() 方法中,返回响应给客户端。以下是示例代码: ```java response.setContentType("text/html"); PrintWriter out = response.getWriter(); out.println("<html><body>"); out.println("<h1>File uploaded successfully!</h1>"); out.println("</body></html>"); ``` 15. 最后,在 "web.xml" 文件中添加 Servlet 映射。以下是示例代码: ```xml <servlet> <servlet-name>UploadServlet</servlet-name> <servlet-class>UploadServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>UploadServlet</servlet-name> <url-pattern>/upload</url-pattern> </servlet-mapping> ``` 16. 运行 Web 应用程序,并在浏览器中输入 "http://localhost:8080/FileUploadDemo/upload" 地址进行文件上传

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值