zoukankan      html  css  js  c++  java
  • java文件上传--基于ajaxFileUpload+struts2

    jQuery插件ajaxFileUpload可以实现ajax文件上传,使用非常简单。

    下面做一个简单的demo(以上传图片为例),实现图片上传,图片显示,图片下载

    注:以下的代码是在项目的基础上进行开发。css样式文件、包路径等未做修改。

    1、 ajaxFileUpload文件下载地址http://www.phpletter.com/Demo/AjaxFileUpload-Demo/

    2、自行引入jquery.js、ajaxFileUpload.js文件

    jsp核心代码:

    <script type="text/javascript">
      function fileUpload() {
    	$.ajaxFileUpload( {
    		url : 'admin/fileAction.do',//用于文件上传的服务器端请求地址
    		secureuri : false,          //一般设置为false
    		fileElementId : 'file',     //文件上传空间的id属性  <input type="file" id="file" name="file" />
    		dataType : 'json',          //返回值类型 一般设置为json
    		success : function(data, status) {
    			$("#downImg").show();   //待上传成功后 显示下载按钮
    			$("#downImg").attr("href","admin/downloadImage.do?filePath="+data.filePath);
    			$("#showImg").attr("src","admin/redImage.do?path=" + data.filePath);
    		}
    	})
      }
    </script>
    <table class="editTable">
       <tr>
    	<td colspan="4">
    		<img id="showImg" alt="" src="">
    		<a id="downImg" style="display: none" href="">下载</a> 
    	</td>
       </tr>
       <tr>
    	<td class="title">
    		上传图片:
    	</td>
    	<td colspan="3">
    		<input type="file" id="file" name="file" onchange="fileUpload();">
    	</td>
       </tr>
    </table>

    3、AjaxFileUploadAction

    public class AjaxFileUploadAction extends WebSupport {
    
    	private File file;            //文件
    	private String fileFileName;  //文件名 
    	private String filePath;      //文件路径
    	private InputStream inputStream;
    
    	/**
    	 * 图片上传
    	 * 
    	 * @return
    	 */
    	public String fileUpload() {
    		String path = ServletActionContext.getServletContext().getRealPath("/upload");
    		File file = new File(path); // 判断文件夹是否存在,如果不存在则创建文件夹
    		if (!file.exists()) {
    			file.mkdir();
    		}
    		try {
    		  if (this.file != null) {
    			File f = this.getFile();
    			String fileName = java.util.UUID.randomUUID().toString(); // 采用时间+UUID的方式随即命名
    			String name = fileName+ fileFileName.substring(fileFileName.lastIndexOf(".")); // 保存在硬盘中的文件名
    
    			FileInputStream inputStream = new FileInputStream(f);
    			FileOutputStream outputStream = new FileOutputStream(path+ "\" + name);
    			byte[] buf = new byte[1024];
    			int length = 0;
    			while ((length = inputStream.read(buf)) != -1) {
    				outputStream.write(buf, 0, length);
    			}
    			inputStream.close();
    			outputStream.flush();
    			//文件保存的完整路径  比如:D:	omcat6webappseserver\uploada0be14a1-f99e-4239-b54c-b37c3083134a.png
    			filePath = path+"\"+name;
    
    		  }
    		} catch (Exception e) {
    			e.printStackTrace();
    		}
    		return SUCCESS;
    	}
    
    	/**
    	 * 用于图片页面显示
    	 * 
    	 * @return
    	 */
    	public String readImg() {
    		try {
    			inputStream = new FileInputStream(new File(getRequest().getParameter("path")));
    		} catch (FileNotFoundException e) {
    			e.printStackTrace();
    		}
    		return SUCCESS;
    	}
    	/**
    	 * 图片下载
    	 * @return
    	 */
    	public String download() {
            String path = filePath;
            HttpServletResponse response = ServletActionContext.getResponse();
            try {
                // path是指欲下载的文件的路径。
                File file = new File(path);
                // 取得文件名。
                String filename = file.getName();
                // 取得文件的后缀名。
                String ext = filename.substring(filename.lastIndexOf(".") + 1).toUpperCase();
                // 以流的形式下载文件。
                InputStream fis = new BufferedInputStream(new FileInputStream(path));
                byte[] buffer = new byte[fis.available()];
                fis.read(buffer);
                fis.close();
                //清空response
                response.reset();
                //设置response的Header
                String filenameString = new String(filename.getBytes("gbk"),"iso-8859-1");
                response.addHeader("Content-Disposition", "attachment;filename=" + filenameString);
                response.addHeader("Content-Length", "" + file.length());
                OutputStream toClient = new BufferedOutputStream(response.getOutputStream());
                response.setContentType("application/octet-stream");
                toClient.write(buffer);
                toClient.flush();
                toClient.close();
            } catch (IOException ex) {
                ex.printStackTrace();
            }
            return null;
        }
    
    	public File getFile() {
    		return file;
    	}
    
    	public void setFile(File file) {
    		this.file = file;
    	}
    
    	public String getFileFileName() {
    		return fileFileName;
    	}
    
    	public void setFileFileName(String fileFileName) {
    		this.fileFileName = fileFileName;
    	}
    
    	public String getFilePath() {
    		return filePath;
    	}
    
    	public void setFilePath(String filePath) {
    		this.filePath = filePath;
    	}
    
    	public InputStream getInputStream() {
    		return inputStream;
    	}
    
    	public void setInputStream(InputStream inputStream) {
    		this.inputStream = inputStream;
    	}
    
    	private static final Logger log = Logger
    			.getLogger(AjaxFileUploadAction.class);
    	private static final long serialVersionUID = 1L;
    }

    4、struts配置

    <struts> 
       <package name="struts_Ajax_code" extends="json-default"> 
           <!-- 文件上传 -->  
           <action name="fileAction" class="com.bk.eserver.web.action.AjaxFileUploadAction" method="fileUpload"> 
                <result type="json" name="success"> 
                     <param name="contentType">text/html</param> 
                </result> 
           </action> 
       </package>  
       <package name="struts_Jsp_code" extends="struts-default"> 
           <!-- 图片读取 -->  
           <action name="redImage" class="com.bk.eserver.web.action.AjaxFileUploadAction" method="readImg"> 
                <result type="stream"> 
                     <param name="contentType">application/octet-stream</param>  
                     <param name="inputName">inputStream</param>  
                     <param name="contentDisposition">attachment;filename=${fileName}</param>  
                     <param name="bufferSize">4096</param> 
                </result> 
           </action>  
           <!-- 文件下载 -->  
           <action name="downloadImage" class="com.bk.eserver.web.action.AjaxFileUploadAction" method="download"> 
                <result type="stream"> 
                     <param name="contentType">application/octet-stream</param>  
                     <param name="inputName">inputStream</param>  
                     <param name="contentDisposition">attachment;filename=${fileName}</param>  
                     <param name="bufferSize">4096</param> 
                </result> 
           </action> 
       </package> 
    </struts>



  • 相关阅读:
    vs15
    Areas(区域)
    池编程技术
    MyBitis(iBitis)系列随笔之五:多表(一对多关联查询)
    MyBatis学习总结(五)——实现关联表查询
    Mapper映射语句高阶应用——ResultMap
    mysql中的null字段值的处理及大小写问题
    spring-boot支持双数据源mysql+mongo
    No resource identifier found for attribute 'showAsAction' in package 'android'
    No resource found that matches the given name 'Theme.AppCompat.Light'.
  • 原文地址:https://www.cnblogs.com/itmyhome/p/4131325.html
Copyright © 2011-2022 走看看