• 上传文件


    package com.zy.ImageServlet;
    
    import java.io.File;
    import java.io.IOException;
    import java.io.PrintWriter;
    import java.util.Collection;
    
    import javax.servlet.ServletException;
    import javax.servlet.annotation.MultipartConfig;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import javax.servlet.http.Part;
    
    /**
     * Servlet implementation class ImageServlet
     */
    @WebServlet("/ImageServlet")
    @MultipartConfig  //可接多功能表单请求
    public class ImageServlet extends HttpServlet {  
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            response.setContentType("text/html;charset=utf-8");
            
            //获取真实路径---存储路径  项目逻辑路径是[/image]
            String savePath = request.getServletContext().getRealPath("/image");
            System.out.println("真实路径是"+savePath);
          //获取上传的文件集合
            Collection<Part> parts = request.getParts();
            //上传单个文件
            if (parts.size()==1) {
                 //Servlet3.0将multipart/form-data的POST请求封装成Part,通过Part对上传的文件进行操作。
                //Part part = parts[0];//从上传的文件集合中获取Part对象
                Part part = request.getPart("file");//通过表单file控件(<input type="file" name="file">)的名字直接获取Part对象
                //Servlet3没有提供直接获取文件名的方法,需要从请求头中解析出来
                //获取请求头,请求头的格式:form-data; name="file"; filename="snmp4j--api.zip"
    //header为 form-data; name="file"; filename="C:UsersAdministratorDesktop1.png"
    String header = part.getHeader("content-disposition"); //获取文件名 String fileName = getFileName(header); //把文件写到指定路径 // System.out.println("这个是啥:"+File.separator); System.out.println("这个是啥:"+header+" "+fileName); //D:workspace37.metadata.pluginsorg.eclipse.wst.server.core mp0wtpwebappsimageUpimage110.jpg part.write(savePath+File.separator+fileName); }else { //一次性上传多个文件 for (Part part : parts) {//循环处理上传的文件 //获取请求头,请求头的格式:form-data; name="file"; filename="snmp4j--api.zip" String header = part.getHeader("content-disposition"); //获取文件名 String fileName = getFileName(header); //把文件写到指定路径 System.out.println("这个是啥:"+File.separator); part.write(savePath+File.separator+fileName); } } PrintWriter out = response.getWriter(); out.println("上传成功"); out.flush(); out.close(); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub doGet(request, response); } /** * 根据请求头解析出文件名 * 请求头的格式:火狐和google浏览器下:form-data; name="file"; filename="snmp4j--api.zip" * IE浏览器下:form-data; name="file"; filename="E:snmp4j--api.zip" * @param header 请求头 * @return 文件名 */ //请求头的格式【一堆字符串,包含文件名,我们干啥,在这堆字符串中截取出文件名】: //form-data; name="file"; filename="snmp4j--api.zip" public String getFileName(String header) { /** * String[] tempArr1 = header.split(";");代码执行完之后,在不同的浏览器下,tempArr1数组里面的内容稍有区别 * 火狐或者google浏览器下:tempArr1={form-data,name="file",filename="snmp4j--api.zip"} * IE浏览器下:tempArr1={form-data,name="file",filename="E:snmp4j--api.zip"} */ String[] tempArr1 = header.split(";"); /** *火狐或者google浏览器下:tempArr2={filename,"snmp4j--api.zip"} *IE浏览器下:tempArr2={filename,"E:snmp4j--api.zip"} */ //filename="snmp4j--api.zip" String[] tempArr2 = tempArr1[2].split("="); //获取文件名,兼容各种浏览器的写法 String fileName = tempArr2[1].substring(tempArr2[1].lastIndexOf("\")+1).replaceAll(""", ""); return fileName; } }

     注:

    String fileName = tempArr2[1].substring(tempArr2[1].lastIndexOf("\")+1).replaceAll(""", "");

    tempArr2[1]                                                                                                      "C:UsersAdministratorDesktop1.png"

    tempArr2[1].lastIndexOf("\")                                                                               31  即计算到  1.png" 数字1前面 的索引

    tempArr2[1].substring(tempArr2[1].lastIndexOf("\")+1)                                          加一后为32即截取到数字1的位置,截取后的值为 1.png"   (substring单个参数截取字符串保留 当 前位置的字符,两个参数包前不包后)

     tempArr2[1].substring(tempArr2[1].lastIndexOf("\")+1).replaceAll(""", "")                替换 " 为空格,最后截取的值为1.png      "\"第一个为转义字符

     jsp页面

    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>Insert title here</title>
    </head>
    <body>
     上传单个文件
     <form action="${pageContext.request.contextPath}/ImageServlet"
                    method="post" enctype="multipart/form-data">
                                   上传文件:
                    <input type="file" name="file">
                    <br>
                    <input type="submit" value="上传">
                </form>
    <hr/>
    上传2个文件
     <!-- 文件上传时必须要设置表单的enctype="multipart/form-data"-->
                <form action="${pageContext.request.contextPath}/ImageServlet"
                    method="post" enctype="multipart/form-data">
                    上传文件:
                    <input type="file" name="file1">
                    <br>
                    上传文件:
                    <input type="file" name="file2">
                    <br>
                    <input type="submit" value="上传">
                </form>
    </body>
    </html>
  • 相关阅读:
    centos7 忘记mysql5.7密码
    阿里云Linux(Centos7)下搭建SVN服务器
    JAVA金额格式字符串转数值
    win10下RabbitMQ的安装和配置
    Oracle update 两表及以上关联更新,出现多值情况,不是一对一更新
    java.lang.OutOfMemoryError: java heap space
    bootstrap.min.css.map
    css 边距等常用设置
    html 标签
    数据库总结
  • 原文地址:https://www.cnblogs.com/qfdy123/p/11247490.html
Copyright © 2020-2023  润新知