Java文件上传方式

Java实现文件上传的方式有以下几种:
1. 通过Java Servlet实现文件上传:在Servlet中,可以通过HttpServletRequest对象的getPart()方法获取文件的Part对象,然后通过Part对象的write()方法将文件写入服务器

从Servlet 3.0开始,Java提供了一种更简单的方式来处理文件上传,即使用Part接口。下面是使用Part接口实现文件上传的步骤和代码示例。

在用户端的HTML表单中添加文件上传字段,使用enctype="multipart/form-data"来指定表单类型。

<form action="/upload" method="post" enctype="multipart/form-data">
<input type="file" name="file">
<input type="submit" value="上传">
</form>

在服务器端的Servlet中处理文件上传请求。

@WebServlet("/upload")
@MultipartConfig
public class FileUploadServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
Part filePart = request.getPart("file");
String fileName = filePart.getSubmittedFileName();
InputStream fileContent = filePart.getInputStream();

// 处理文件内容
// 存储文件到指定位置

fileContent.close();
response.getWriter().println("上传成功");
}
}

2. 使用Apache Commons FileUpload库:这个库提供了一个简单的API,可以轻松地将文件上传到服务器。可以使用MultipartRequest解析并处理文件上传请求。

Apache Commons FileUpload是一个常用的Java文件上传库,它提供了一种简单而强大的方式来处理文件上传。

导入Apache Commons FileUpload库的相关依赖。

<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.4</version>
</dependency>

在用户端的HTML表单中添加文件上传字段

<form action="/upload" method="post" enctype="multipart/form-data">
<input type="file" name="file">
<input type="submit" value="上传">
</form>

在服务器端的Controller中处理文件上传请求。

@RequestMapping(value = "/upload", method = RequestMethod.POST)
public String uploadFile(HttpServletRequest request) {
DiskFileItemFactory factory = new DiskFileItemFactory();
ServletFileUpload upload = new ServletFileUpload(factory);

try {
List<FileItem> items = upload.parseRequest(request);
for (FileItem item : items) {
if (!item.isFormField()) {
// 获取文件名和文件内容
String fileName = item.getName();
InputStream fileContent = item.getInputStream();

// 处理文件内容
// 存储文件到指定位置

// 关闭文件流
fileContent.close();
}
}
} catch (FileUploadException | IOException e) {
e.printStackTrace();
return "上传失败";
}

return "上传成功";
}

或者采用如下的步骤:

第一步:判断是否可以进行文件上传

 第二步:创建一个FileItem工厂,通过工厂创建文件上传核心组件ServletFileUpload对象

 第三步:通过核心上传组件解析request请求,获取表单的所有表单项,表单的每一个表单项对应一个FileItem

 第四步:遍历所有的表单项,判断是否是普通的表单项,如果不是就是文件上传,就可以针对遍历的这个fileItem进行一系列的操作

 在上面我们已经介绍过了使用commons-fileupload上传文件的整个流程,所以我们就直接将这个流程封装成一个工具类,在使用到文件上传的Servlet中直接使用,十分便利

第一步:创建一个DTO(用于存储commons-fileupload解析请求的结果) 

import org.apache.commons.fileupload.FileItem;
 
import java.util.HashMap;
import java.util.Map;
public class ParamDto {
    private Map<String,String> paramMap;
    private Map<String,FileItem> fileMap;
 
    public ParamDto() {
        paramMap = new HashMap<>();
        fileMap = new HashMap<>();
    }
 
    public Map<String, String> getParamMap() {
        return paramMap;
    }
 
    public void setParamMap(Map<String, String> paramMap) {
        this.paramMap = paramMap;
    }
 
    public Map<String, FileItem> getFileMap() {
        return fileMap;
    }
 
    public void setFileMap(Map<String, FileItem> fileMap) {
        this.fileMap = fileMap;
    }
}
第二步:将commons-fileupload解析文件的整个请求,封装成一个工具类
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;
import org.imooc.dto.ParamDto;
 
import javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.util.List;
public class RequestUtil {
 
    /**
     * 从request流中解析参数与上传的文件
     * @param request
     */
    public static ParamDto parseParam(HttpServletRequest request) {
           ParamDto result = new ParamDto();
           //创建一个FileItem工厂 通过DiskFileItemFactory对象创建文件上传核心组件
           ServletFileUpload upload = new ServletFileUpload(new DiskFileItemFactory());
           upload.setHeaderEncoding("UTF-8");
           try {
                 //通过文件上传核心组件解析request请求,获取到所有的FileItem对象
                 List<FileItem> fileItemList = upload.parseRequest(request);
 
                //遍历表单的所有表单项(FileItem) 并对其进行相关操作
                for(FileItem fileItem : fileItemList) {
                    //判断这个表单项如果是一个普通的表单项
                    if(fileItem.isFormField()) {
                    result.getParamMap().put(fileItem.getFieldName(),fileItem.getString("UTF-8"));
                   //如果不是表单的普通文本域,就是
                } else {
                    result.getFileMap().put(fileItem.getFieldName(),fileItem);
                       }
                }
             } catch (FileUploadException e) {
                      e.printStackTrace();
             } catch (Exception e) {
                     e.printStackTrace();
             }
        return result;
         }
    }

第三步:让我们直接在Servlet中使用这个工具类吧

 

3. 使用Spring框架的MultipartFile接口:Spring框架提供了MultipartFile接口,可以方便地处理文件上传。在控制器方法中,可以使用MultipartFile参数接收文件,并使用transferTo()方法将文件保存到服务器。

如果你正在使用Spring Boot框架,你可以使用Spring Framework提供的MultipartFile类来处理文件上传。下面是使用MultipartFile类实现文件上传的步骤和代码示例。

在用户端的HTML表单中添加文件上传字段。

<form action="/upload" method="post" enctype="multipart/form-data">
<input type="file" name="file">
<input type="submit" value="上传">
</form>

在服务器端的Controller中处理文件上传请求。

@RestController
public class FileUploadController {
@PostMapping("/upload")
public String uploadFile(@RequestParam("file") MultipartFile file) {
if (!file.isEmpty()) {
String fileName = file.getOriginalFilename();
try {
byte[] bytes = file.getBytes();

// 处理文件内容
// 存储文件到指定位置

return "上传成功";
} catch (IOException e) {
e.printStackTrace();
}
}

return "上传失败";
}
}

4. 使用Apache HttpClient库:HttpClient是一个强大的HTTP客户端库,可以用于发送HTTP请求。可以使用MultipartEntityBuilder构建一个包含文件的Multipart请求,并将其发送到服务器。
5. 使用JAX-RS实现文件上传:JAX-RS是Java的一个RESTful Web服务规范,可以使用它来实现文件上传。可以通过@FormDataParam注解将文件上传到服务器。
这些都是常用的Java实现文件上传的方式,选择适合自己项目需求的方式进行文件上传。

posted @   爱喝茶的安迪  阅读(443)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)
点击右上角即可分享
微信分享提示