实现Java函数处理文件上传和下载操作
发布时间:2023-05-28 15:20:22
Java是一种开发语言,可以用来实现文件上传和下载操作。Java中有两种主要的文件上传方式:基于Servlet和基于Spring MVC。使用Servlet的方式可以使用标准Java Servlet API来实现。使用Spring MVC的方式可以使用Spring框架来实现,Spring框架提供了一些支持文件上传的类。
文件上传
使用Servlet的方式
Servlet的方式可以使用标准Java Servlet API来实现。以下是使用Servlet的方式来实现文件上传的示例:
import java.io.IOException;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.Part;
public class FileUploadServlet extends HttpServlet {
protected void doPost(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
//获取请求中所有的文件,使用Part类
List<Part> fileParts = request.getParts().stream().filter(part -> "file".equals(part.getName())).collect(Collectors.toList());
//存储文件
for(Part filePart : fileParts) {
String fileName = getFileName(filePart);
InputStream fileContent = filePart.getInputStream();
File uploadedFile = new File("/path/to/uploads/" + fileName);
try (FileOutputStream out = new FileOutputStream(uploadedFile)) {
int read = 0;
final byte[] bytes = new byte[1024];
while ((read = fileContent.read(bytes)) != -1) {
out.write(bytes, 0, read);
}
}
}
}
private String getFileName(final Part part) {
final String partHeader = part.getHeader("content-disposition");
for (String content : partHeader.split(";")) {
if (content.trim().startsWith("filename")) {
return content.substring(content.indexOf('=') + 1).trim().replace("\"", "");
}
}
return null;
}
}
使用Spring MVC的方式
Spring MVC的方式可以使用Spring框架来实现,Spring框架提供了一些支持文件上传的类。以下是使用Spring MVC的方式来实现文件上传的示例:
import org.springframework.stereotype.Controller;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import java.io.File;
import java.io.IOException;
@Controller
public class FileUploadController {
@PostMapping("/upload/file")
@ResponseBody
public String uploadFile(@RequestParam("file") MultipartFile file) {
if (file.isEmpty()) {
return "上传失败,请选择文件";
}
String fileName = file.getOriginalFilename();
File dest = new File("/path/to/uploads/" + fileName);
try {
file.transferTo(dest);
return "上传成功";
} catch (IOException e) {
e.printStackTrace();
}
return "上传失败!";
}
}
文件下载
使用Servlet的方式
Servlet的方式可以使用标准Java Servlet API来实现。以下是使用Servlet的方式来实现文件下载的示例:
import java.io.IOException;
import java.io.File;
import java.io.FileInputStream;
import java.io.OutputStream;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class FileDownloadServlet extends HttpServlet {
protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
String fileName = request.getParameter("file");
if (fileName == null || "".equals(fileName)) {
//没有指定文件名
response.sendError(HttpServletResponse.SC_BAD_REQUEST);
return;
}
File file = new File("/path/to/files/" + fileName);
if (file.exists() && file.canRead()) {
String mimeType = "application/octet-stream";
response.setContentType(mimeType);
response.setHeader("Content-Disposition", "attachment; filename=\"" + fileName + "\"");
int fileSize = (int) file.length();
response.setContentLength(fileSize);
FileInputStream in = new FileInputStream(file);
OutputStream out = response.getOutputStream();
byte[] buffer = new byte[1024];
int bytesRead = -1;
while ((bytesRead = in.read(buffer)) != -1) {
out.write(buffer, 0, bytesRead);
}
in.close();
out.close();
} else {
//文件不存在或不可读
response.sendError(HttpServletResponse.SC_NOT_FOUND);
return;
}
}
}
使用Spring MVC的方式
Spring MVC的方式可以使用Spring框架来实现,Spring框架提供了一些支持文件下载的类。以下是使用Spring MVC的方式来实现文件下载的示例:
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
@Controller
public class FileDownloadController {
@RequestMapping(value = "/download/file", method = RequestMethod.GET)
@ResponseBody
public String downloadFile(HttpServletRequest request,
HttpServletResponse response,
@RequestParam("fileName") String fileName) {
if (fileName == null || "".equals(fileName)) {
return "下载失败,请选择文件";
}
String filePath = "/path/to/files/" + fileName;
File file = new File(filePath);
if (file.exists()) {
response.setContentType("application/octet-stream");
response.setHeader("Content-Disposition", "attachment;filename=" + fileName);
byte[] buffer = new byte[1024];
FileInputStream fis = null;
BufferedInputStream bis = null;
OutputStream os = null;
try {
os = response.getOutputStream();
fis = new FileInputStream(file);
bis = new BufferedInputStream(fis);
int i = bis.read(buffer);
while (i != -1) {
os.write(buffer, 0, i);
i = bis.read(buffer);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
bis.close();
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return "下载成功";
} else {
return "文件不存在";
}
}
}
以上是使用Java实现文件上传和下载操作的示例,这些示例可以根据实际需求进行调整。这些示例可以帮助开发人员了解如何使用Java来实现文件上传和下载操作。
