文件上传:
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);
}