struts2文件上傳

對於struts2文件上傳之前寫過一個,是通過struts.properties的配置實現的,現在將配置信息改到了struts.xml中,一樣可以成功了。

實現對文件上傳類型,文件大小上限,保存文件絕路路徑參數注入action。



上傳jsp頁面:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>發微博</title>
    <meta http-equiv="content-type" content="text/html; charset=UTF-8">
    
  </head>
  
  <body style="font-size:14px;">
    <h2>寫微博      <a href="index.jsp">返回首頁</a></h2>
    <form action="upload" method="post" enctype="multipart/form-data">
    	<textarea name="sayMessage" rows="4" cols="50"></textarea><br>
    	發文件<input name="upload" type="file"/><input type="submit" value="發微博">
    </form>
    <s:fielderror></s:fielderror>
  </body>
</html>



struts2.xml文件中頂部常量配置部分:

<!-- 配置文件上傳時臨時文件存放路徑,我測試的過程中沒配,報錯說該項爲空。 -->
	<constant name="struts.multipart.saveDir" value="E:\UploadFileDemo\tmp"></constant>
	<!-- 設置上傳大小上限:200M -->
	<constant name="struts.multipart.maxSize" value="209715200"></constant>
	<!-- 指定資源文件 -->
	<constant name="struts.custom.i18n.resources" value="ApplicationResource"></constant>

struts2.xml文件中action部分:

<action name="upload" class="myFileUploadAction">
			<result name="success">/index.jsp</result>
			<result name="input">/saymessage.jsp</result>
			<!--struts2默認只能上傳2M文件,類型不限。 配置攔截器來限制上傳文件的類型和大小 -->
			<interceptor-ref name="fileUpload">
				<!-- 限定文件上傳類型 -->
				<param name="allowedTypes">image/png,image/x-png,image/jpg,image/pjpeg,image/bmp,image/gif</param>
				<!-- maximumSize指每個上傳文件的大小上限,單位爲:byte,這裏設爲30M,該值不能大於struts.multipart.maxSize總大小 -->
				<param name="maximumSize">31457280</param>				
			</interceptor-ref>			
			<!-- 默認攔截器棧 -->
			<interceptor-ref name="defaultStack"></interceptor-ref>
			<!-- 注入文件上傳路徑參數到myFileUploadAction中 -->
			<param name="savePath">E:\\UploadFileDemo</param>
			
		</action>


文件上傳action代碼:

package com.gifer.action;

import java.io.File;
import java.io.IOException;
import java.sql.Timestamp;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.HashSet;
import java.util.List;
import java.util.Random;
import java.util.Set;

import org.apache.commons.io.FileUtils;
import org.apache.log4j.Logger;

import com.gifer.model.LoginUser;
import com.gifer.model.SayFiles;
import com.gifer.model.SayMessage;
import com.gifer.service.SayMessageService;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;

public class FileUpLoadAction extends ActionSupport {

	private static final long serialVersionUID = -1232100382633301276L;

	private static final Logger log = Logger.getLogger(FileUpLoadAction.class);

	// 微博內容
	private String sayMessage;

	// 上傳多個文件的集合文本
	private List<File> upload;

	// 多個上傳文件的類型集合
	private List<String> uploadContextType;

	// 多個上傳文件的文件名集合
	private List<String> uploadFileName;

	// 文件存放路徑根目錄
	private String savePath;

	private SayMessageService sayMessageService;

	public String getSayMessage() {
		return sayMessage;
	}

	public void setSayMessage(String sayMessage) {
		this.sayMessage = sayMessage;
	}

	public List<File> getUpload() {
		return upload;
	}

	public void setUpload(List<File> upload) {
		this.upload = upload;
	}

	public List<String> getUploadContextType() {
		return uploadContextType;
	}

	public void setUploadContextType(List<String> uploadContextType) {
		this.uploadContextType = uploadContextType;
	}

	public List<String> getUploadFileName() {
		return uploadFileName;
	}

	public void setUploadFileName(List<String> uploadFileName) {
		this.uploadFileName = uploadFileName;
	}

	/**
	 * 從配置文件注入文件根目錄參數,絕對路徑
	 * 
	 * @param savePath
	 */
	public void setSavePath(String savePath) {
		this.savePath = savePath;
	}

	public void setSayMessageService(SayMessageService sayMessageService) {
		this.sayMessageService = sayMessageService;
	}

	@Override
	public String execute() throws Exception {

		try {
			// 把上傳的文件放到指定的路徑下 取相對路徑
			// savePath = ServletActionContext.getServletContext().getRealPath(
			// "/WEB-INF/uploadfiles");

			Calendar myDate = Calendar.getInstance();
			int intYear = myDate.get(Calendar.YEAR);
			int intMonth = myDate.get(Calendar.MONTH) + 1;
			int intDate = myDate.get(Calendar.DATE);

			// 一律使用'/'以兼容windows和linux操作系統路徑
			// 文件url相對路徑
			String relativeUrl = "Files/" + intYear + "/" + intMonth + "/"
					+ intDate + "/";
			// 文件保存絕對路徑
			savePath += "/" + intYear + "/" + intMonth + "/" + intDate;

			// 文件保存目錄
			File files = new File(savePath);
			// 如果指定的路徑沒有就創建
			if (!files.exists()) {
				files.mkdirs();
			}

			// 組織成微博實體對象
			SayMessage sayMessage = new SayMessage();
			sayMessage.setSayContent(this.getSayMessage());
			Timestamp sayTime = new Timestamp(System.currentTimeMillis());
			sayMessage.setSayTime(sayTime);// 當前時間
			LoginUser sayUser = (LoginUser) ActionContext.getContext()
					.getSession().get("user");// 從session中獲取用戶信息
			sayMessage.setSayUser(sayUser.getUserId());

			Set sayFiles = new HashSet();

			// 把得到的文件的集合通過循環的方式讀取並放在指定的路徑下
			for (int i = 0; i < upload.size(); i++) {
				try {
					SayFiles sayFile = new SayFiles();

					String oldFileName = uploadFileName.get(i);// 上傳文件原名

					// 生成隨機文件名:當前年月日時分秒+五位隨機數(爲了在實際項目中防止文件同名而進行的處理)
					Random r = new Random();
					int rannum = (int) (r.nextDouble() * (99999 - 10000 + 1)) + 10000; // 獲取隨機數
					SimpleDateFormat sDateFormat = new SimpleDateFormat(
							"yyyyMMddHHmmss"); // 時間格式
					String nowTimeStr = sDateFormat.format(new Date()); // 當前時間字符串
					String extName = "";
					// 獲取拓展名
					if (oldFileName.lastIndexOf(".") >= 0) {
						extName = oldFileName.substring(oldFileName
								.lastIndexOf("."));
					}
					// 新文件名
					String newFileName = nowTimeStr + rannum + extName;
					relativeUrl += newFileName;// 文件保存到數據庫中的相對路徑
					// list集合通過get(i)的方式來獲取索引
					// 將文件逐一複製到指定目錄
					FileUtils.copyFile(upload.get(i), new File(files,
							newFileName));
					sayFile.setFileName(oldFileName);
					sayFile.setFileUrl(relativeUrl);
					sayFile.setUploadTime(sayTime);
					sayFile.setSayMessage(sayMessage);
					sayFiles.add(sayFile);
				} catch (IOException e) {
					log.error(e.getMessage(), e);
				}
			}
			sayMessage.setSayFileses(sayFiles);
			this.sayMessageService.save(sayMessage);

		} catch (Exception e) {
			log.error(e.getMessage(), e);
			throw new RuntimeException();
		}

		return SUCCESS;
	}

}

ApplicationResource.properties資源文件

#Generated by ResourceBundle Editor (http://eclipse-rbe.sourceforge.net)

login.user.password         = \u5BC6\u7801
login.user.password.invalid = \u5BC6\u7801\u4E0D\u80FD\u4E3A\u7A7A
login.user.userId           = \u7528\u6237\u540D
login.user.userId.invalid   = \u7528\u6237\u540D\u4E0D\u80FD\u4E3A\u7A7A
#\u66F4\u6539\u4E0A\u4F20\u6587\u4EF6\u7C7B\u578B\u4E0D\u5141\u8BB8\u7684\u63D0\u793A\u4FE1\u606F  
struts.messages.error.content.type.not.allowed=\u6587\u4EF6\u4E0A\u4F20\u5931\u8D25\uFF0C\u60A8\u4E0A\u4F20\u7684\u6587\u4EF6\u7C7B\u578B\u4E0D\u88AB\u5141\u8BB8
#\u66F4\u6539\u4E0A\u4F20\u6587\u4EF6\u592A\u5927\u7684\u63D0\u793A\u4FE1\u606F  
struts.messages.error.file.too.large=\u6587\u4EF6\u4E0A\u4F20\u5931\u8D25\uFF0C\u60A8\u4E0A\u4F20\u7684\u6587\u4EF6\u5927\u5C0F\u8D85\u8FC7\u4E0A\u9650\uFF0830M\uFF09
#\u6587\u4EF6\u4E0A\u4F20\u5176\u5B83\u9519\u8BEF\u4FE1\u606F  
struts.messages.error.uploading=\u6587\u4EF6\u4E0A\u4F20\u5931\u8D25\uFF0C\u4E0A\u4F20\u7A0B\u5E8F\u53D1\u751F\u5185\u90E8\u9519\u8BEF




發佈了53 篇原創文章 · 獲贊 2 · 訪問量 48萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章