基于Servlet和SSM框架的文件上传下载的多种实现方法

文件上传:

Servlet下实现:

  • 文件上传
package TaskSubmit.Servlet;

import java.io.*;
import java.io.IOException;
import java.sql.Connection;
import java.sql.Statement;
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.*;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

import TaskSubmit.JDBCpool.JDBCutils;
import TaskSubmit.Model.*;

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

	@SuppressWarnings("unchecked")
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setCharacterEncoding("utf-8");
		response.setContentType("text/html;charset=utf-8");
		Task task = (Task) request.getSession().getAttribute("Task");
		Student student = (Student) request.getSession().getAttribute("user");
		String Saccount = student.getSaccount(); // 存放用户账号,用来重命名文件
		String Sname = student.getSname(); // 存放用户姓名,用来重命名文件
		String ClassName = student.getClassName();// 存放用户班级,用来指定文件夹
		String TaskName = task.getTaskName(); // 存放作业名字,用来指定文件夹
		String fileType = null; // 存放文件类型,用来重命名文件
		try {
			// 创建工厂
			DiskFileItemFactory factory = new DiskFileItemFactory();
			File f = new File("E:\\SubmitFile");
			if (!f.exists()) {
				f.mkdirs();
			}
			// 设置文件上传的缓存路径
			factory.setRepository(f);
			// 创建Fileupload组件
			ServletFileUpload fileUpload = new ServletFileUpload(factory);
			fileUpload.setHeaderEncoding("utf-8");
			// 设置允许上传的最大 1024*1024*10M
			// fileUpload.setSizeMax(10485760);
			// 解析request
			List<FileItem> fileitems = fileUpload.parseRequest(request);
			// PrintWriter writer = response.getWriter();
			// 遍历集合
			for (FileItem fileitem : fileitems) {
				// 判断是否为普通字段
				if (fileitem.isFormField()) {
					// 获得字段名和字段值
					// String name = fileitem.getFieldName();
					// String value = fileitem.getString("utf-8");
					// writer.print("提交者:"+value+"<br>");
				} else {
					// 上传的文件路径
					String fileName = fileitem.getName();
					// 截取出文件名
					fileName = fileName.substring(fileName.lastIndexOf("\\") + 1);
					// 截取出文件类型
					fileType = fileName.substring(fileName.lastIndexOf(".") + 1);
					// 对上传文件进行重命名
					fileName = "e:\\SubmitFiles\\" + ClassName + "\\" + TaskName + "\\" + Saccount + "-" + Sname + "." + fileType;
					// 在服务器创建同名文件
					File file = new File(fileName);
					file.getParentFile().mkdirs();
					file.createNewFile();
					// 获得上传文件流
					InputStream in = fileitem.getInputStream();
					// 获得写入文件流
					OutputStream out = new FileOutputStream(file);
					// 流的对拷
					byte[] buffer = new byte[1024];
					int len;
					while ((len = in.read(buffer)) > 0) {
						out.write(buffer, 0, len);
					}
					// 关流
					in.close();
					out.close();
					// 删除临时文件
					fileitem.delete();
				}
			}
			// 更新提交情况表
			Connection conn = JDBCutils.getDataSource().getConnection();
			Statement stmt = conn.createStatement();
			String sql = "UPDATE taskstu SET Flag=1 WHERE TaskName='" + TaskName + "'AND Saccount='" + Saccount + "'";
			stmt.executeUpdate(sql);
			// 提交完成 返回作业列表
			// response.sendRedirect("/TaskSubmit/StudentView/TaskList.jsp?curPage=1");
			request.getSession().setAttribute("message", "提交成功!");
			response.sendRedirect("/TaskSubmit/StudentIndexServlet");
		} catch (Exception e) {
			throw new RuntimeException(e);
		}
	}

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

  • 文件下载
String path = "E:" + File.separator + "hrmUpload";
		String fileName = documentService.findDocumentById(id).getFileName();
		// 获取路径,创建文件对象
		File file = new File(path + File.separator + fileName);// File.separator为分隔符,如'/'
		// 通知浏览器以下载的方式打开文件
		response.reset();
		response.addHeader("Content-Type", "application/octet-stream");
		response.addHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(file.getName(), "utf-8"));
		// 通过文件对象获取文件相关的输入流
		InputStream in = new FileInputStream(file);
		// 获取response对象的输出流
		OutputStream out = response.getOutputStream();
		byte[] buffer = new byte[1024];
		int len;
		while ((len = in.read(buffer)) != -1) {
			out.write(buffer, 0, len);
		}
		// 关闭流
		in.close();
		out.close();

SSM框架下实现:

基于Servlet的文件上传和下载,完全适用于SSM框架下文件上传和下载

  • 文件上传

    先说一下文件的获取,文件的获取可以通过直接在方法中添加MultipartFile类型的参数进行自动获取,也可以像Servlet中一样通过遍历request进行获取。我这里使用document对象进行接收,其有一个MultipartFile类型的属性file。

首先要配置文件解析器(在Spring的配置文件中):

<!-- 配置文件解析器  -->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> 
    <property name="defaultEncoding" value="UTF-8"/>
</bean>

@RequestMapping("/addDocument.do")
	public String addDocument(Document document, HttpSession session, Model model) throws IllegalStateException, IOException {
		// 上传文件的路径
		// String path = session.getServletContext().getRealPath("/upload");
		String path = "E:" + File.separator + "hrmUpload";
		File file = new File(path);
		if (!file.exists()) {
			file.mkdir();
		}
		// 上传的文件名
		String fileName = document.getFile().getOriginalFilename();

		// 将文件保存到指定路径和名称
		document.getFile().transferTo(new File(path + File.separator + fileName));// File.separator分隔符/或者\

		document.setFileName(fileName);
		document.setUser((User) session.getAttribute("login_user"));

		int rows = documentService.addDocument(document);

		if (rows > 0) {
			return "redirect:/document/findDocument.do";
		} else {
			model.addAttribute("failMSG", "上传文件失败!");
			return "/jsp/fail.jsp";
		}

	}
  • 文件下载
@RequestMapping("/downLoad.do")
	public ResponseEntity<byte[]> downLoad(Integer id) throws IOException {
		String path = "E:" + File.separator + "hrmUpload";
		String fileName = documentService.findDocumentById(id).getFileName();

		File file = new File(path + File.separator + fileName);

		HttpHeaders headers = new HttpHeaders();

		String downloadFileName = new String(fileName.getBytes("UTF-8"), "iso8859-1");

		// 指定类型,应用程序的字节流
		headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);

		headers.setContentDispositionFormData("attachment", downloadFileName);

		return new ResponseEntity<byte[]>(FileUtils.readFileToByteArray(file), headers, HttpStatus.OK);
	}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SSM框架文件上传下载可以通过以下步骤实现: 1. 文件上传: - 在前端页面上添加文件选择框和上传按钮; - 在后端控制器添加处理文件上传方法; - 在方法使用SpringMVC的MultipartFile类获取上传的文件; - 对文件进行处理并保存到服务器上。 示例代码: ```java @RequestMapping(value = "/upload", method = RequestMethod.POST) @ResponseBody public String upload(MultipartFile file) { // 获取上传的文件名 String fileName = file.getOriginalFilename(); // 处理文件并保存到服务器上 // ... return "上传成功!"; } ``` 2. 文件下载: - 在前端页面上添加下载按钮; - 在后端控制器添加处理文件下载方法; - 在方法使用SpringMVC的ResponseEntity类将文件发送到客户端。 示例代码: ```java @RequestMapping(value = "/download", method = RequestMethod.GET) public ResponseEntity<byte[]> download() throws IOException { // 获取要下载的文件 File file = new File("文件路径"); // 将文件转换为字节数组 byte[] body = FileUtils.readFileToByteArray(file); // 设置响应头 HttpHeaders headers = new HttpHeaders(); headers.add("Content-Disposition", "attachment;filename=" + file.getName()); HttpStatus statusCode = HttpStatus.OK; ResponseEntity<byte[]> response = new ResponseEntity<>(body, headers, statusCode); return response; } ``` 以上是简单的文件上传下载实现方法,具体实现还需要根据具体需求进行调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值