上传文件

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:\Users\Administrator\Desktop\1.png"
String header = part.getHeader("content-disposition"); //获取文件名 String fileName = getFileName(header); //把文件写到指定路径 // System.out.println("这个是啥:"+File.separator); System.out.println("这个是啥:"+header+"\t"+fileName); //D:\workspace37\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\imageUp\image\110.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:\Users\Administrator\Desktop\1.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>

 

posted @ 2019-07-25 22:43  勤奋的园  阅读(191)  评论(0编辑  收藏  举报