Servlet3.0 提供了比较简单的文件上传的api,今天自己写了一个,方便以后使用。
java code:
package org.vic.test; import java.io.File; import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.Set; import java.util.UUID; import java.util.concurrent.Callable; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; import javax.servlet.ServletException; import javax.servlet.annotation.MultipartConfig; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.Part; //@MultipartConfig is necessary, we cannot get anything from request without it. @MultipartConfig public class UploadServlet extends HttpServlet { /** * */ private static final long serialVersionUID = 1L; private static final String DIR = "D:/Users/upload"; private static final String KEY = "fileKey"; private static final String SUCCESS = "success"; private static final String NONE = "none"; @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { try { List<Future<Map<FileHelper, String>>> results = doUpload(req); if (results != null && results.size() > 0) { for (Future<Map<FileHelper, String>> future : results) { Map<FileHelper, String> map = future.get(); String result = getResult(map); System.out.println(result); } } else { System.out.println("encountered an error!"); } } catch (Exception e) { e.printStackTrace(); System.out.println(e.getMessage()); } } private String getResult(Map<FileHelper, String> map) { Set<Entry<FileHelper, String>> set = map.entrySet(); Iterator<Entry<FileHelper, String>> it = set.iterator(); while (it.hasNext()) { Entry<FileHelper, String> entry = it.next(); FileHelper fileHelper = entry.getKey(); String result = entry.getValue(); String val = "file name: " + fileHelper.getFileName() + "(Temporary id: " + fileHelper.getTempId() + "), upload result: " + result; return val; } return NONE; } private List<Future<Map<FileHelper, String>>> doUpload( HttpServletRequest req) throws Exception { List<Future<Map<FileHelper, String>>> futures = new ArrayList<>(); String key = null; Part p = req.getPart(KEY); if (p != null) { key = readInputStream(p.getInputStream()); } if (key == null || "".equals(key)) { key = "file"; } Collection<Part> parts = req.getParts(); if (parts == null || parts.size() == 0) { return null; } ExecutorService threadPool = Executors.newCachedThreadPool(); for (Part part : parts) { if (key.equals(part.getName())) { if (part.getSize() == 0) { continue; } String fileName = getFileName(part); UUID tempId = UUID.randomUUID(); FileHelper fileHelper = new FileHelper(fileName, part, tempId); Future<Map<FileHelper, String>> future = threadPool .submit(new UploadTasker(fileHelper)); futures.add(future); } } return futures; } private String readInputStream(InputStream in) throws IOException { StringBuffer buff = new StringBuffer(); byte[] b = new byte[1024]; int flag = 0; while ((flag = in.read(b)) != -1) { buff.append(new String(b, 0, flag)); } return buff.toString(); } private String getFileName(Part part) { String header = part.getHeader("Content-Disposition"); String fileName = header.substring(header.indexOf("filename=\"") + 10, header.lastIndexOf("\"")); header.lastIndexOf("\""); return fileName; } private class FileHelper { private String fileName; private Part part; private UUID tempId; public FileHelper(String fileName, Part part, UUID tempId) { this.fileName = fileName; this.part = part; this.tempId = tempId; } public String getFileName() { return fileName; } public Part getPart() { return part; } public UUID getTempId() { return tempId; } } private class UploadTasker implements Callable<Map<FileHelper, String>> { private FileHelper fileHelper; public UploadTasker(FileHelper fileHelper) { this.fileHelper = fileHelper; } @Override public Map<FileHelper, String> call() throws Exception { String fileName = fileHelper.getFileName(); Part part = fileHelper.getPart(); Map<FileHelper, String> returnMap = new HashMap<>(); try { File file = new File(DIR); if (!file.exists()) { file.mkdirs(); } String filePath = DIR + "/" + fileName; part.write(filePath); returnMap.put(fileHelper, SUCCESS); } catch (Exception e) { returnMap.put(fileHelper, e.getMessage()); } return returnMap; } } }
html code: (在网上扒了一个,稍作了修改 )
<!DOCTYPE html> <html> <head> <title>test</title> <!-- <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> --> </head> <body> <div> <form action="http://localhost:8080/UploadTest/upload.do" method="POST" enctype="multipart/form-data"> <table> <tr> <td><label for="file1">文件1:</label></td> <td><input type="file" id="file1" name="file"></td> </tr> <tr> <td><label for="file2">文件2:</label></td> <td><input type="file" id="file2" name="file"></td> </tr> <tr> <td><label for="file3">文件3:</label></td> <td><input type="file" id="file3" name="file"></td> </tr> <tr> <td colspan="2"><input type="submit" value="上传" name="upload"></td> </tr> </table> <input type="hidden" name="fileKey" value="file"/> </form> </div> </body> </html>
相关推荐
总结起来,"servlet3.0-demo"项目展示了Servlet 3.0的关键特性,包括使用注解声明Servlet、处理文件上传以及异步处理。这些改进极大地提升了开发效率,使得Servlet API更加现代化和易于使用。通过学习这个示例,...
综上所述,Servlet 3.0简化了Java Web中文件上传的实现,通过`Part` API,我们可以方便地处理Multipart请求,实现安全、高效的文件上传功能。在实际应用中,结合最佳实践和安全策略,可以为用户提供更好的服务。
Servlet3.0提供了对文件上传的原生支持,开发者可以直接使用Servlet3.0提供的API实现文件上传功能,不需要借助任何第三方上传组件。在这里,我们将介绍使用Servlet3.0实现文件上传的步骤和代码实现。 使用Servlet...
- 提供了新的`Part`接口和相关的API,使得处理上传的多部分表单数据(如文件上传)更加方便。 9. **安全增强**: - Servlet 3.0增强了安全相关的API,比如`HttpServletRequest.isUserInRole()`方法现在可以接受多...
在本文中,我们将深入探讨如何使用JavaServer Faces (JSF) 2.0与Servlet 3.0结合实现文件上传功能。JSF是Java平台上的一种Web应用程序开发框架,而Servlet 3.0则是用于处理HTTP请求的核心Java API,两者结合可以提供...
Servlet3.0 实现文件上传的方法是通过利用其新特性,包括注解支持和HttpServletRequest对象对文件上传的内置处理,从而简化了以往依赖第三方库如Apache Commons FileUpload的复杂过程。在Servlet 3.0中,我们可以...
因此,Servlet 3.0引入了`Part`接口,提供了更方便的方式来处理文件上传。你可以使用`request.getPart("filename")`来获取名为`filename`的`Part`对象,然后调用`Part`的`write()`方法将其写入到服务器上的文件系统...
在这里,'uploadServlet'是处理文件上传的Servlet的URL,'onUploadSuccess'回调函数则用于处理文件上传成功后的行为。 在Servlet端,我们需要处理multipart/form-data类型的请求。为此,可以使用Servlet 3.0引入的...
在Servlet 3.0中,可以使用Part接口来处理多部分表单数据,包括文件上传。例如,使用HttpServletRequest的getParts()方法获取上传的文件,然后保存到服务器指定路径,如`request.getServletContext().getRealPath("/...
在本文中,我们将深入探讨如何使用JSP、Servlet和MySQL实现文件上传功能,特别是基于Servlet 3.0的实现方式。文件上传是Web应用程序中常见的需求,它允许用户上传文件到服务器并存储在数据库中。这里我们将讲解关键...
// 使用Servlet 3.0以上API处理文件上传 List Parts = request.getParts(); for (Part part : parts) { String fileName = part.getName(); // 获取文件名 part.write("/path/to/save/" + fileName); // 保存...
接下来,我们需要在SpringMVC的配置文件`servlet.xml`中声明`MultipartResolver`,这是处理文件上传的关键组件。这里我们使用的是`StandardServletMultipartResolver`: ```xml <bean id="multipartResolver" class...
Servlet通过`Part` API(自Java Servlet 3.0版本开始引入)来处理文件。以下是一个简单的Servlet实现: ```java import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import ...
总的来说,实现Servlet多文件上传(带进度条)涉及的技术包括:Servlet的Part接口、文件流操作、Ajax异步请求、前端的进度条更新以及文件上传的错误处理和安全性措施。通过这些技术的结合,我们可以创建出一个高效且...
然后,重写`doPost()`方法来处理文件上传请求。 ```java @WebServlet("/upload") public class FileUploadServlet extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse...
在Servlet3.0中,文件上传是通过使用注解@MultipartConfig将一个Servlet标识为支持文件上传,并使用Part对象来操作上传的文件。Part对象是Servlet3.0中引入的一个新的概念,用于表示multipart/form-data类型的POST...
Servlet 3.0及以上版本提供了对这种请求的内置支持,我们可以通过`HttpServletRequest`接口的`getParts()`方法来获取上传的文件。以下是一个简单的文件上传Servlet示例: ```java @WebServlet("/FileUploadServlet...
当用户通过HTML表单提交包含文件的请求时,Servlet接收到这个请求,并使用`Part`接口(来自Java Servlet 3.0及以上版本)来解析请求中的文件数据。以下是一个简单的文件上传Servlet示例: ```java @WebServlet("/...
在这个例子中,我们使用了Servlet 3.0的`Part`接口来处理文件上传,将上传的文件保存到"uploads/"目录下。 总结来说,“EXT3.0 JSP上传”涉及到EXT3.0的FormPanel和FileUploadField组件来构建前端文件选择和上传...
Servlet 3.0引入了异步处理和文件上传的内置支持,使得处理文件上传变得更加简单。 1. **Servlet 3.0 File Upload**: 使用`@MultipartConfig`注解标记Servlet类,开启对多部分请求的支持。然后,我们可以通过...