开发者社区> 欧小明> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

javaweb中运用fileupload上传文件

简介: 本文是介绍javaweb开发运用Apache中的commons fileupload的commons io的工具来进行文件上传,在开发中会遇到很多比较棘手的问题,本人接触后进行了总结。
+关注继续查看

本文是介绍javaweb开发运用Apache中的commons fileupload的commons io的工具来进行文件上传,在开发中会遇到很多比较棘手的问题,本人接触后进行了总结。
开发准备:
去阿帕奇官网https://commons.apache.org/下载commons fileupload的commons io的连接bin.jar包,里面有很多commons工具组件,以后开发都会用到。找到fileupload跟io,点击去选择版本下载,这里要说明一下:这里写图片描述
只要下载红色框中一对压缩包就行,其中src是源文件。

前台开发

<%@ 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>
<!-- enctype默认字符类型是:application/x-www-form-urlencoded
    这种无法读取文本内容,enctype="multipart/form-data这中才可以,以二进制读取文件
    改为这种方式不可以用getParameter方式获取参数
 -->
    <form action="uploadServlet" method="post" enctype="multipart/form-data">
        上传文件<input type="file" name="file">
        <br><br>
        desc:<input type="text" name="desc">
        <input type="submit" value="Submit">
    </form>
</body>
</html>

后台开发
UploadServlet:这里复制index例子后,按Ctrl+shilt+o,导入commons的包,一定是要导入正确的包,因为在本地Tomcat中也有相关的包,以免导入后无法上传

package com.qiming.javaweb;



import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;





@WebServlet("/uploadServlet")
public class UploadServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;


    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        //以下是在commons-fileupload-1.2.1\site的例子
        //注意在新的压缩包中没有这个index.html
        //复制commons.fileupload的例子源码
        // 1.得到FileItem的items
        DiskFileItemFactory factory = new DiskFileItemFactory();
        // Set factory constraints
        factory.setSizeThreshold(1024*500);
        //创建临时文件
        File tempDirectory=new File("D:\\tempDirectory");
        factory.setRepository(tempDirectory);
        // Create a new file upload handler
        ServletFileUpload upload = new ServletFileUpload(factory);


        // Set overall request size constraint
        upload.setSizeMax(1024*1024*5);

        // Parse the request
        try {
            //对于表单的类型multipart/form-data,获取表单内容
            List<FileItem> items = upload.parseRequest(request);

            for(FileItem item:items){
                if(item.isFormField()){
                    //获取请求的文件名getFieldName
                    //如果是一个一般的表单域,打印信息
                    String name=item.getFieldName();
                    String value=item.getString();

                    System.out.println(name+":"+value);
                }
                //若是文件域则把文件保存到d:\\files目录下
                else{
                    //获取jsp请求的file名字
                    String fieldName = item.getFieldName();
                    //获取上传文件的全路径,必须分割找到文件名
                    String fileName = item.getName();
                    String contentType = item.getContentType();
                    long sizeInBytes = item.getSize();

                    System.out.println(fieldName);

                    System.out.println(fileName);
                    System.out.println(contentType);
                    System.out.println(sizeInBytes);

                    InputStream in=item.getInputStream();
                    byte[] buffer=new byte[1024];
                    int len=0;
                    //获取文件名
                    String filename1 = FileUploadUtils.getRealName(fileName);
                    //创建文件路径
                    fileName="d:\\files\\"+filename1;
                    System.out.println(fileName);
                    //输出到电脑
                    OutputStream out=new FileOutputStream(fileName);
                    while((len=in.read(buffer))!=-1){
                        out.write(buffer, 0, len);
                    }
                    out.close();
                    in.close();
                    }
            }



        } catch (FileUploadException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }   






        //1.获取请求信息,获取的请求信息不是二进制的,不能读取文件,必须使用io流
//  String file=request.getParameter("file");
//  String desc=request.getParameter("desc");
//  
//  System.out.println(file);
//  System.out.println(desc);
//  

    //io流读取内容,但是通过流获取很麻烦
//  InputStream in=request.getInputStream();
//  
//  Reader reader=new InputStreamReader(in);
//  BufferedReader bufferedReader=new BufferedReader(reader);
//  
//  String str=null;
//  
//  while((str=bufferedReader.readLine())!=null){
//      System.out.println(str);
//  }
    }

}

这个类很重要,因为commons fileupload中的getName在不同浏览器获取的结果是不同的,有的会获取全路径,有的只会获取文件名,所以为了统一,定义这个类是对获取的要上传的文件的全路径得到要上传的文件名,然后在将文件名与制定要下载的目录拼接起来。
路径拼接运用:String中的lastIndexOf(“\”)+1方法,必须写“\”,其中一个”/”是转义字符,获取文件路径后,从最后一个“/”开始获取文件名,比如:d:\files\2NE1 - Kiss.mp3,获取之后是2NE1 - Kiss.mp3。源代:

import java.util.UUID;

public class FileUploadUtils {
    //获取文件的名称。
    public static String getRealName(String filename){
        //从最后一个“\”返回,开始获取字符串,获取文件名
        int index = filename.lastIndexOf("\\")+1;
        return filename.substring(index);
    }

这样就可解决文件上传,路径问题了。代码仅供参考,有什么错误,请指教。

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
【JavaWeb】案例:读取 WEB 工程下的资源文件、文件下载、点击切换验证码
本期主要介绍读取 WEB 工程下的资源文件、文件下载、点击切换验证码
9 0
javaWeb解决中文乱码的一点小总结
不同形式的请求及携带参数问题导致的乱码及解决
96 0
java之字节型文件流
递归----方法调用 File类的对象<----->本地硬盘文件 查看属性 创建新的文件 新的文件夹 查看父元素目录 文件夹的遍历 删除 file对象不能操作文件中的内容-------->通过流I/O的方式来完成 流按照方向(功能)来区分 in(读取) out(写入) 操作的目标来区分 文件流 数组流 字符串流 数据流 对象流 网络流 学习文件流---> 顾名思义 读取文件中的信息in 将信息写入文件中out 文件流按照读取或写入的单位(字节数)大小来区分 字节型文件
25 0
Java NIO 中的 Pipe 和 FileLock 详解
Java NIO 中的 Pipe 和 FileLock 详解
40 0
【Javaweb】❤️文件上传❤️(从0到1)(上)
1. 文件传输原理及介绍 2. 文件上传 2.1我们用一个新的方式创建项目 2.2 导包 2.3 实用类介绍 FileItem类 ServletFileUpload类 2.4 pom.xml导入需要的依赖
43 0
Java-FileUploadUtil工具类
package com.gootrip.util; import java.io.File; import java.util.*; import org.apache.commons.
1299 0
javaweb文件打包批量下载
// 批量下载未批改作业 @RequestMapping(value = "/downloadAllHomework", method = RequestMethod.GET) public void downloadAllHomework(HttpSession httpSession, HttpServletRequest request, HttpServle
1173 0
+关注
欧小明
java,框架相关
31
文章
1
问答
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载