【I/O操作】 Struts框架下上傳圖片

    從事開發的人一定會碰到對不同文件的上傳和下載功能,項目中用到了上傳圖片並預覽的功能,總結一下分享給大家。

框架:Struts 2

數據庫:MySQL

前臺:servlet

效果圖如下:

    

servlet頁面代碼清單:

<%@page import="com.bjpowernode.drp.basedata.domain.Item"%>
<%@ page language="java" contentType="text/html; charset=GB18030"
	pageEncoding="GB18030"%>

<%
	String path = request.getContextPath();
	String basePath = request.getScheme() + "://"
			+ request.getServerName() + ":" + request.getServerPort()
			+ path + "/";

	Item item = (Item) request.getAttribute("item");
%>
<html>
<head>
<base href="<%=basePath%>">
<title>物料維護</title>
<link rel="stylesheet" href="style/drp.css">
<script src="script/client_validate.js"></script>
<script language="javascript">
	
</script>
</head>

<body class="body1">
	<form name="itemForm" target="_self" id="itemForm"
		action="servlet/item/FileUploadServlet" enctype="multipart/form-data"
		method="post">
		<input type="hidden" name="itemNo" value="<%=item.getItemNo()%>">
		<div align="center">
			<table width="95%" border="0" cellspacing="2" cellpadding="2">
				<tr>
					<td> </td>
				</tr>
			</table>
			<table width="95%" border="0" cellspacing="0" cellpadding="0"
				height="8">
				<tr>
					<td width="522" class="p1" height="2" nowrap><img
						src="images/mark_arrow_03.gif" width="14" height="14">
						  <b>基礎數據管理>>物料維護>>上傳物料圖片</b></td>
				</tr>
			</table>
			<hr width="97%" align="center" size=0>
			<table width="95%" border="0" cellpadding="0" cellspacing="0">
				
				<tr>
					<td height="74">
						<div align="right">圖片: </div>
					</td>
<span style="white-space:pre">					<!-- 加載圖片 --></span>
					<td><img src="upload/<%=item.getFileName()%>" width="85"
						height="49"></td>
				</tr>
				<tr>
					<td width="20%" height="150">
						<div align="right">
							<font color="#FF0000">*</font>選擇圖片: 
						</div>
					</td>
					<td width="78%"><input name="fileName" type="file"
						class="text1" size="40" maxlength="40"></td>
				</tr>
			</table>
			<hr width="97%" align="center" size=0>
			<div align="center">
				<input name="btn_upload" class="button1" type="submit"
					id="btn_upload" value="上傳">      <input
					name="btnBack" class="button1" type="button" id="btnBack"
					value="返回" onClick="history.go(-1)">
			</div>
		</div>
	</form>
</body>
</html>
核心java類清單:

package com.bjpowernode.drp.basedata.web;

import java.io.File;
import java.io.IOException;
import java.util.Iterator;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

import com.bjpowernode.drp.basedata.manager.ItemManager;
import com.bjpowernode.drp.basedata.manager.ItemManagerImpl;
import com.bjpowernode.drp.util.ApplicationException;

//public class FileUploadServlet extends HttpServlet {
//	private ItemManager itemManager; 

public class FileUploadServlet extends AbstractItemServlet {

	private File uploadPath;

	private File tempPath;

	private ItemManager itemManager;

	public void doPost(HttpServletRequest req, HttpServletResponse res)
			throws ServletException, IOException {
		// form提交採用multipart/form-data,無法採用req.getParameter()取得數據
		DiskFileItemFactory factory = new DiskFileItemFactory();
		// maximum size that will be stored in memory
		factory.setSizeThreshold(4096);
		// the location for saving data that is larger than getSizeThreshold()
		factory.setRepository(tempPath);

		ServletFileUpload upload = new ServletFileUpload(factory);
		// maximum size before a FileUploadException will be thrown
		upload.setSizeMax(1000000 * 20);
		try {
			List fileItems = upload.parseRequest(req);
			String itemNo = "";
			for (Iterator iter = fileItems.iterator(); iter.hasNext();) {
				FileItem item = (FileItem) iter.next();

				// 是普通的表單輸入域
				if (item.isFormField()) {
					if ("itemNo".equals(item.getFieldName())) {
						itemNo = item.getString();
					}
				}
				// 是否爲input="type"輸入域
				if (!item.isFormField()) {
					String fileName = item.getName();
					long size = item.getSize();
					if ((fileName == null || fileName.equals("")) && size == 0) {
						continue;
					}
					// 截取字符串 如:C:\WINDOWS\Debug\PASSWD.LOG
					fileName = fileName.substring(
							fileName.lastIndexOf("\\") + 1, fileName.length());
					// item.write(new File(uploadPath, itemNo + ".gif"));
					item.write(new File(uploadPath, fileName));
					itemManager.uploadItemImage(itemNo, fileName);
				}
			}
			res.sendRedirect(req.getContextPath()
					+ "/servlet/item/SearchItemServlet");
		} catch (Exception e) {
			e.printStackTrace();
			throw new ApplicationException("上傳失敗!");
		}
	}

	public void init() throws ServletException {
		itemManager = new ItemManagerImpl();
		// 取得upload的絕對路徑
		uploadPath = new File(getServletContext().getRealPath("upload"));
		System.out.println("uploadPath=====" + uploadPath);
		// 如果目錄不存在
		if (!uploadPath.exists()) {
			// 創建目錄
			uploadPath.mkdir();
		}

		// 臨時目錄
		tempPath = new File(getServletContext().getRealPath("temp"));
		if (!tempPath.exists()) {
			tempPath.mkdir();
		}
		// 顯示調用父類的init方法
		super.init();
	}
}

    該工具類會將上傳的文件保存在服務器所在路徑下的upload文件夾下。這裏用到了private ItemManager itemManager這個後臺方法,具體的業務邏輯就是將前臺拿到的數據傳遞過去完成在數據庫中的更新,需要提出的是這裏對圖片的保存僅僅是一個圖片的文件名字,由於關係型數據庫MySQL的限制,並沒有將其原件保存下來(之後還會介紹一下非關係型數據庫中該功能的實現方式,敬請期待!),相應的當顯示的時候就從upload路徑下取得圖片加載。

web.xml配置文件清單:

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee 
	http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">

	<filter>
		<filter-name>CharsetEncodingFilter</filter-name>
		<filter-class>com.bjpowernode.drp.util.filter.CharsetEncodingFilter</filter-class>
		<init-param>
			<param-name>encoding</param-name>
			<param-value>GBK</param-value>
		</init-param>
	</filter>

	<filter-mapping>
		<filter-name>CharsetEncodingFilter</filter-name>
		<url-pattern>*.jsp</url-pattern>
	</filter-mapping>

	<filter-mapping>
		<filter-name>CharsetEncodingFilter</filter-name>
		<url-pattern>/servlet/*</url-pattern>
	</filter-mapping>

	<session-config>
		<session-timeout>60</session-timeout>
	</session-config>

	<servlet>
		<servlet-name>FileUploadServlet</servlet-name>
		<servlet-class>com.bjpowernode.drp.basedata.web.FileUploadServlet</servlet-class>
		<load-on-startup>10</load-on-startup>
	</servlet>

	<servlet-mapping>
		<servlet-name>FileUploadServlet</servlet-name>
		<url-pattern>/servlet/item/FileUploadServlet</url-pattern>
	</servlet-mapping>

	<servlet>
		<servlet-name>SearchItemServlet</servlet-name>
		<servlet-class>com.bjpowernode.drp.basedata.web.SearchItemServlet</servlet-class>
	</servlet>

	<servlet-mapping>
		<servlet-name>SearchItemServlet</servlet-name>
		<url-pattern>/servlet/item/SearchItemServlet</url-pattern>
	</servlet-mapping>

	<servlet>
		<servlet-name>ShowItemUploadServlet</servlet-name>
		<servlet-class>com.bjpowernode.drp.basedata.web.ShowItemUploadServlet</servlet-class>

	</servlet>

	<servlet-mapping>
		<servlet-name>ShowItemUploadServlet</servlet-name>
		<url-pattern>/servlet/item/ShowItemUploadServlet</url-pattern>
	</servlet-mapping>


	<error-page>
		<exception-type>com.bjpowernode.drp.util.ApplicationException</exception-type>
		<location>/error.jsp</location>
	</error-page>

	<error-page>
		<error-code>404</error-code>
		<location>/http_error.jsp</location>
	</error-page>


	<error-page>
		<error-code>500</error-code>
		<location>/500.jsp</location>
	</error-page>

</web-app>

    當然對於不同文件的處理還有很多可以優化的地方,這裏只是提供了一種實現的方式,希望可以幫到大家!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章