Struts2.0文件上传原理
Struts2文件上传默认采用apache的文件上传的包,新建处理上传的Servlet 如下:
?
??
/** * * @author 张明学 * *使用apache的commons-io-1.3.2.jar,commons-fileupload-1.2.1.jar完成处理文件上传的Servlet */public class UploadServlet extends HttpServlet {public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {/** * request.getRealPath("/")返回的是当前项目所在硬盘的路径 如:C:\Program Files\Apache * Software Foundation\Tomcat 6.0\webapps\Struts2_9\ * request.getRealPath("/upload")返回的是当前项目所在硬盘的路径+根目录下面的upload的路径 * 如:C:\Program Files\Apache Software Foundation\Tomcat * 6.0\webapps\Struts2_9\Upload */String path = request.getRealPath("/upload");DiskFileItemFactory factory = new DiskFileItemFactory();/** * Apache上传组件上传的文件若小于某一值时就将要上面的文件放在内存中,否则就放到一个临时的目录中去。 *//** * 设置文件小于多少时放到内存当中去。1024*1024为1M的大小 */factory.setSizeThreshold(1024 * 1024);/** * 设置大于上面设置的大小的文件上传时所放的临时目录,上传完成后临时目录所存放的垃圾文件不自动删除。 */factory.setRepository(new File(path));/** * ServletFileUpload完成上传的核内类 */ServletFileUpload servletUpload = new ServletFileUpload(factory);try {List<FileItem> list = servletUpload.parseRequest(request);for (FileItem item : list) {/** * 非file字段,即普通的字段 */if (item.isFormField()) {/** * 获得字段的名称,即对应页面文本框等的名称 */String name = item.getFieldName();/** * 以gbk方式获得该字段的value值,即对应页面文本框等所输入的值 */String value = item.getString("gbk");request.setAttribute(name, value);} else {/** * file型字段 *//** * 获得页面file的名称 */String name = item.getFieldName();/** * 获得页面file中用户选择的文件的路径(与普通的字段不同) * 由于不同的浏览器所取得值不同,有的得到是所选择文件的路径,有的得到的就是所选择的文件的名称。 * 如:有的浏览器所取得的是:C:\Documents and * Settings\Administrator\桌面\电话本.txt 有的浏览器所取得的是:电话本.txt */String value = item.getName();/** * 下面做一个统一的处理 若为文件名则下面没有”\“则start为-1 */int start = value.lastIndexOf("\");String fileName = value.substring(start + 1);request.setAttribute(name, fileName);/** * 下面做上传的处理 */InputStream is = item.getInputStream();/** * 上传的路径依然选择path */File UploadFile = new File(path, fileName);OutputStream os = new FileOutputStream(UploadFile);byte[] buffer = new byte[400];int length = 0;while ((length = is.read(buffer)) > 0) {os.write(buffer, 0, buffer.length);}os.close();is.close();/** * 更简单的上传方式 * 无需使用InputStream和OutputStream对象item.write(File)即可 * item.write(UploadFile); */}}} catch (FileUploadException e) {e.printStackTrace();}}public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {this.doPost(request, response);}}?