美文网首页
2018-12-14

2018-12-14

作者: 长街_9c90 | 来源:发表于2018-12-14 10:46 被阅读0次

    JSP 可以与 HTML form 标签一起使用,来允许用户上传文件到服务器。上传的文件可以是文本文件或图像文件或任何文档。

    需要引入的 jar 文件:commons-fileupload-1.3.2、commons-io-2.5.jar

    I/O基础知识

    I(Input输入)/O(Output输出):I/O流  输入流/输出流

    对文件的读操作:使用输入流

    对文件的写操作:使用输出流

    流的分类

    输入流(InputStream)/输出流(OutputStream)

    字节流/字符流:例如对图片进行操作(copy)使用字节流      对普通文件的操作可以使用字符流

    节点流/处理流:节点流会直接关联到数据源上而处理流是对节点流功能的增强(不会直接关联数据源)

    节点流

    //使用FileInputStream对数据源读取字节FileInputStream fis =newFileInputStream("b1.jpg");//使用FileOutputStream向目标文件写字节FileOutputStream fos =newFileOutputStream("b1_demo.jpg");

    处理流

    fr =newFileReader("Test.java");//源文件br =newBufferedReader(fr);//处理流对fr节点流功能的增强FileWriter fw =newFileWriter("Test_New.java");//目标文件BufferedWriter bw =newBufferedWriter(fw);//处理流对fw节点流功能的增强 

    在API中凡是以InputStream/OutputStream结尾的都是字节流

    凡是以Reader/Writer结尾的都是字符流

    InputStream、 OutputStream、 Reader、Writer这四个类,是这两大继承体系的父类

    所有字节流的根父类为:InputStream、 OutputStream

    所有字符流的根父类为: Reader、Writer

    创建一个文件上传表单

    需要注意:

    表单 method 属性应该设置为 POST 方法,不能使用 GET 方法。

    表单 enctype 属性应该设置为 multipart/form-data.

    表单 action 属性应该设置为在后端服务器上处理文件上传的 Servlet 文件。下面的实例使用了 UploadServlet Servlet 来上传文件。

    上传单个文件,您应该使用单个带有属性 type="file" 的 标签。为了允许多个文件上传,请包含多个 name 属性值不同的 input 标签。输入标签具有不同的名称属性的值。浏览器会为每个 input 标签关联一个浏览按钮。

    Servlet

    packagecom.foreknow.servlet;importjavax.servlet.ServletException;importjavax.servlet.annotation.MultipartConfig;importjavax.servlet.annotation.WebServlet;importjavax.servlet.http.HttpServlet;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;importjavax.servlet.http.Part;importjava.io.File;importjava.io.IOException;importjava.util.UUID;/**

    * Created by foreknow on 2018/12/13.

    MultipartConfig

    使用注解MultipartConfig 将一个 Servlet 标识为支持文件上传。Servlet3.0 将

    multipart/form-data 的 POST 请求封装成 Part,通过 Part 对文件进行上传。

    Servlet3 没有提供直接获取文件名的方法,需要从请求头中解析出来

    */@WebServlet(name ="UploadServlet",urlPatterns ="/upload")@MultipartConfigpublicclassUploadServletextendsHttpServlet{protectedvoiddoPost(HttpServletRequest request, HttpServletResponse response)throwsServletException, IOException{        Part part = request.getPart("file");        String name = part.getSubmittedFileName();        UUID uuid = UUID.randomUUID();        String path = request.getServletContext().getRealPath("")+"/pic/";        File file =newFile(path);if(!file.exists()){            file.mkdirs();        }        part.write(path+uuid+name);        response.getWriter().print(uuid+name);        request.getSession().setAttribute("pic",uuid+name);    }protectedvoiddoGet(HttpServletRequest request, HttpServletResponse response)throwsServletException, IOException{    }}

    注意可能遇到的问题

    在tomcat8使用servlet3.0上传文件,原来按以下步骤就可以完成

    1.Part part = request.getPart("XX");2.part.getSubmittedFileName()//直接获取文件名3.part.write(realPath)

    在tomcat7 的环境下就没有part.getSubmittedFileName()这一方法,无法直接获取文件名

    解决方案:

    Stringcd = part.getHeader("Content-Disposition");//截取不同类型的文件需要自行判断Stringfilename = cd.substring(cd.lastIndexOf("=")+2, cd.length()-1);

    upload.jsp

    <%--User:foreknowDate:2018/12/13Time:9:08TochangethistemplateuseFile|Settings|FileTemplates.--%><%@pagecontentType="text/html;charset=UTF-8"language="java"%>

    链接:https://www.jianshu.com/p/9ccefc0dbd53

    相关文章

      网友评论

          本文标题:2018-12-14

          本文链接:https://www.haomeiwen.com/subject/qzmwhqtx.html