zoukankan      html  css  js  c++  java
  • 文件的上传与下载

    文件的上传和下载

    文件的上传和下载,是非常常见的功能。很多的系统中,或者软件中都经常使用文件的上传和下载。
    比如:QQ 头像,就使用了上传。
    邮箱中也有附件的上传和下载功能。
    OA 系统中审批有附件材料的上传。

    文件的上传介绍

    1、要有一个 form 标签,method=post 请求
    2、form 标签的 encType 属性值必须为 multipart/form-data 值
    3、在 form 标签中使用 input type=file 添加上传的文件
    4、编写服务器代码(Servlet 程序)接收,处理上传的数据。
    encType=multipart/form-data 表示提交的数据,以多段(每一个表单项一个数据段)的形式进行拼
    接,然后以二进制流的形式发送给服务器

    文件上传,HTTP 协议的说明

    commons-fileupload.jar 常用 API 介绍说明

    想使用文件的上传和下载的时候必须要导入两个jar包:

    commons-fileupload-1.2.1.jar
    commons-io-1.4.jar

    commons-fileupload.jar 和 commons-io.jar 包中,我们常用的类有哪些?

    ServletFileUpload 类,用于解析上传的数据。
    FileItem 类,表示每一个表单项。
    boolean ServletFileUpload.isMultipartContent(HttpServletRequest request); 判断当前上传的数据格式是否是多段的格式。
    public List<FileItem> parseRequest(HttpServletRequest request) 解析上传的数据
    boolean FileItem.isFormField() 判断当前这个表单项,是否是普通的表单项。还是上传的文件类型。
    true 表示普通类型的表单项 false 表示上传的文件类型
    String FileItem.getFieldName() 获取表单项的 name 属性值
    String FileItem.getString() 获取当前表单项的值。
    String FileItem.getName(); 获取上传的文件名
    void FileItem.write( file ); 将上传的文件写到 参数 file 所指向抽硬盘位置 。

    fileupload 类库的使用

    上传文件的表单:

    <form action="http://192.168.31.74:8080/09_EL_JSTL/uploadServlet" method="post"
    enctype="multipart/form-data">
    用户名:<input type="text" name="username" /> <br>
    头像:<input type="file" name="photo" > <br>
    <input type="submit" value="上传">
    </form>

    解析上传的数据的代码:

    /**
    * 用来处理上传的数据
    * @param req
    * @param resp
    * @throws ServletException
    * @throws IOException
    */
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException,
    IOException {
    //1 先判断上传的数据是否多段数据(只有是多段的数据,才是文件上传的)
    if (ServletFileUpload.isMultipartContent(req)) {
    // 创建 FileItemFactory 工厂实现类
    FileItemFactory fileItemFactory = new DiskFileItemFactory();
    // 创建用于解析上传数据的工具类 ServletFileUpload 类
    ServletFileUpload servletFileUpload = new ServletFileUpload(fileItemFactory);
    try {
    // 解析上传的数据,得到每一个表单项 FileItem
    List<FileItem> list = servletFileUpload.parseRequest(req);
    // 循环判断,每一个表单项,是普通类型,还是上传的文件
    for (FileItem fileItem : list) {
    if (fileItem.isFormField()) {
    // 普通表单项
    System.out.println("表单项的 name 属性值:" + fileItem.getFieldName());
    // 参数 UTF-8.解决乱码问题
    System.out.println("表单项的 value 属性值:" + fileItem.getString("UTF-8"));
    } else {
    // 上传的文件
    System.out.println("表单项的 name 属性值:" + fileItem.getFieldName());
    System.out.println("上传的文件名:" + fileItem.getName());
    fileItem.write(new File("e:\" + fileItem.getName()));
    }
    }
    } catch (Exception e) {
    e.printStackTrace();
    }
    }
    }

    .

  • 相关阅读:
    ASP.NET MVC案例——————拦截器
    Windows Azure Virtual Network (10) 使用Azure Access Control List(ACL)设置客户端访问权限
    Windows Azure Storage (20) 使用Azure File实现共享文件夹
    Windows Azure HandBook (5) Azure混合云解决方案
    Windows Azure Service Bus (6) 中继(Relay On) 使用VS2013开发Service Bus Relay On
    Azure PowerShell (9) 使用PowerShell导出订阅下所有的Azure VM的Public IP和Private IP
    Windows Azure Service Bus (5) 主题(Topic) 使用VS2013开发Service Bus Topic
    Azure China (9) 在Azure China配置CDN服务
    Windows Azure Storage (19) 再谈Azure Block Blob和Page Blob
    Windows Azure HandBook (4) 分析Windows Azure如何处理Session
  • 原文地址:https://www.cnblogs.com/zhaoyunlong/p/13723014.html
Copyright © 2011-2022 走看看