Java文件上传细讲(2)

简介: Java文件上传细讲(2)

那么我们要怎么办呢????request对象提供了ServletInputStream流给我们读取数据

我们试着读取下文件


ServletInputStream inputStream = request.getInputStream();
        byte[] bytes = new byte[1024];
        int len = 0;
        while ((len = inputStream.read(bytes)) > 0) {
            System.out.println(new String(bytes, 0, len));
        }


我上传的文本文件内容就是111111,读取效果如下:



image.png


现在我们能够读取上传文件的数据了,但是现在问题又来了:怎么把文件上传个数据和普通传送给服务器的数据分割开来呢???上面在图上我们已经看到了,他们是混合在一起的。


按我们平常的做法是很难分割开来的,所以我们需要上传组件


上传组件有两种

FileUpload【操作比较复杂】

SamrtUpload【操作比较简单】


FileUpload

要使用FileUpload组件,就需要导入两个jar包


commons-io

Commons-fileupload


开发步骤

创建解析器工厂对象【DiskFileItemFactory】

通过解析器工厂创建解析器【ServletFileUpload】

调用解析器方法解析request对象,得到所有上传的内容【list】


遍历list,判断每个对象是否是上传文件


如果是普通表单字段,得到字段名和字段值

如果是上传文件,调用InputSteam方法得到输入流,读取上传的数据


快速入门


 try{
            //1.得到解析器工厂
            DiskFileItemFactory factory = new DiskFileItemFactory();
            //2.得到解析器
            ServletFileUpload upload = new ServletFileUpload(factory);
            //3.判断上传表单的类型
            if(!upload.isMultipartContent(request)){
                //上传表单为普通表单,则按照传统方式获取数据即可
                return;
            }
            //为上传表单,则调用解析器解析上传数据
            List<FileItem> list = upload.parseRequest(request);  //FileItem
            //遍历list,得到用于封装第一个上传输入项数据fileItem对象
            for(FileItem item : list){
                if(item.isFormField()){
                    //得到的是普通输入项
                    String name = item.getFieldName();  //得到输入项的名称
                    String value = item.getString();
                    System.out.println(name + "=" + value);
                }else{
                    //得到上传输入项
                    String filename = item.getName();  //得到上传文件名  C:\Documents and Settings\ThinkPad\桌面\1.txt
                    filename = filename.substring(filename.lastIndexOf("\\")+1);
                    InputStream in = item.getInputStream();   //得到上传数据
                    int len = 0;
                    byte buffer[]= new byte[1024];
                    String savepath = this.getServletContext().getRealPath("/upload");
                    FileOutputStream out = new FileOutputStream(savepath + "\\" + filename);  //向upload目录中写入文件
                    while((len=in.read(buffer))>0){
                        out.write(buffer, 0, len);
                    }
                    in.close();
                    out.close();
                }
            }
        }catch (Exception e) {
            e.printStackTrace();
        }


测试

普通的字段和上传的文件都能读取得到了!


image.png



目录
相关文章
|
12天前
|
Java
java引入本地 MultipartFile 实现多部分文件上传
在Java中,`MultipartFile`通常用于处理通过HTML表单上传的文件。但在某些情况下,需要直接从本地文件系统获取文件并上传。本文介绍如何创建一个实现了`MultipartFile`接口的本地类`LocalMultipartFile`,将本地文件转换为`MultipartFile`对象,简化文件上传流程。此方法适用于批量上传等场景,避免了表单上传的复杂性。代码示例展示了如何实现和使用该类进行文件上传操作。作者:华科云商小彭。链接:[稀土掘金](https://juejin.cn/post/7377559533785530431)。
71 18
|
4月前
|
Java
java 文件上传和下载
java 文件上传和下载
31 0
|
4月前
|
存储 前端开发 Java
Java后端如何进行文件上传和下载 —— 本地版(文末配绝对能用的源码,超详细,超好用,一看就懂,博主在线解答) 文件如何预览和下载?(超简单教程)
本文详细介绍了在Java后端进行文件上传和下载的实现方法,包括文件上传保存到本地的完整流程、文件下载的代码实现,以及如何处理文件预览、下载大小限制和运行失败的问题,并提供了完整的代码示例。
1475 2
|
7月前
|
Java
java 文件上传 :MultipartFile 类型转换为file类型
java 文件上传 :MultipartFile 类型转换为file类型
221 9
|
7月前
|
缓存 前端开发 Java
在Java项目中实现高性能的文件上传下载
在Java项目中实现高性能的文件上传下载
|
7月前
|
缓存 安全 Java
使用Java实现高性能的文件上传下载服务
使用Java实现高性能的文件上传下载服务
|
7月前
|
前端开发 安全 Java
如何在Java中实现高效率的文件上传和下载
如何在Java中实现高效率的文件上传和下载
|
7月前
|
Java Apache UED
如何在Java中实现文件上传?
如何在Java中实现文件上传?
|
8月前
|
前端开发 Java 数据安全/隐私保护
如何在Java中实现文件上传和下载?
如何在Java中实现文件上传和下载?
|
8月前
|
Java
java使用多线程编写服务端与客户端文件上传程序
java使用多线程编写服务端与客户端文件上传程序

热门文章

最新文章