Javaweb 图片上传格式以及尺寸大小的限制

时间:2024-10-18 08:33:23

首先需要上传图片的jsp页面是这样的,从选择文件这里选择图片.

下面是jsp的部分页面.

 <body>
  <div>
   <p style="font-weight: 900; color: red;">${msg }</p>
   <form action="<c:url value='/admin/AdminAddBookServlet'/>" enctype="multipart/form-data" method="post" >
    <div>
	    <ul>
	    	<li>书名: <input  type="text" name="bname" value="Spring实战(第3版)(In Action系列中最畅销的Spring图书,近十万读者学习Spring的共同选择)" style="width:500px;"/></li>
	    	<li>大图: <input  type="file" name="image_w"/></li>
	    	<li>小图: <input  type="file" name="image_b"/></li>
	    	<li>当前价:<input  type="text" name="price" value="40.7" style="width:50px;"/></li>
	    	<li>定价: <input  type="text" name="currPrice" value="59.0" style="width:50px;"/>
	    	折扣:<input  type="text" name="discount" value="6.9" style="width:30px;"/>折</li>
	    </ul>
		<hr style="margin-left: 50px; height: 1px; color: #dcdcdc"/>
		<table>
			<tr>
				<td colspan="3">
					作者:<input type="text"  name="author" value="Craig Walls" style="width:150px;"/>
				</td>
			</tr>
			<tr>
				<td colspan="3">
					出版社: <input type="text" name="press"  value="人民邮电出版社" style="width:200px;"/>
				</td>
			</tr>
			<tr>
				<td colspan="3">出版时间:<input type="text"  name="publishtime" value="2013-6-1" style="width:100px;"/></td>
			</tr>
			<tr>
				<td>版次:<input type="text" name="edition"  value="1" style="width:40px;"/></td>
				<td>页数:<input type="text" name="pageNum"  value="374" style="width:50px;"/></td>
				<td>字数:<input type="text" name="wordNum"  value="48700" style="width:80px;"/></td>
			</tr>
			<tr>
				<td width="250">印刷时间:<input type="text" name="printtime"  value="2013-6-1" style="width:100px;"/></td>
				<td width="250">开本:<input type="text" name="booksize"  value="16" style="width:30px;"/></td>
				<td>纸张:<input type="text" name="paper"  value="胶版纸" style="width:80px;"/></td>
			</tr>
			<tr>
				<td>
					一级分类:<select name="pid"  onchange="loadChildren()">
						<option value="">==请选择1级分类==</option>
			    	<c:forEach items="${parents}" var="parent">
			    		<option value="${}">${}</option>
			    	</c:forEach>
					</select>
				</td>
				<td>
					二级分类:<select name="cid" >
						<option value="">==请选择2级分类==</option>
					</select>
				</td>
				<td></td>
			</tr>
			<tr>
				<td>
					<input type="button"  class="btn" value="新书上架">
				</td>
				<td></td>
				<td></td>
			</tr>
		</table>
	</div>
   </form>
  </div>
  </body>

下面是servlet中的限制图片尺寸,格式的代码.

package ;

import ;
import ;
import ;
import ;
import ;
import ;
import ;

import ;
import ;
import ;
import ;
import ;

import ;
import ;
import ;
import ;
import ;

import ;
import ;
import ;
import ;

public class AdminAddBookServlet extends HttpServlet {

	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		("utf-8");
		("text/html;charset=utf-8");
		
		/*
		 * 1. commons-fileupload的上传三步
		 */
		FileItemFactory factory = new DiskFileItemFactory();		//disk...Factory这个构造器可以给参数(缓存大小 or 缓存目录),不给缓存大小就是 10KB
		/*
		 * 2.创建解析器对象
		 */
		ServletFileUpload sfu = new ServletFileUpload(factory);
		(80 * 1024);			//设置单个上传的文件上限为  80KB
		/*
		 * 3.解析request得到List<FileItem>
		 */
		List<FileItem> fileItemList = null(此处写空Null,不知道为什么浏览器没显示);
		try {
			fileItemList = (request);
		} catch (FileUploadException e) {
			//如果出现这个异常,说明单个文件超出了 80 KB
			error("上传的文件超出了80KB", request, response);
			return;
		}
		
		/*
		 * 4.把List<FileItem>封装到book对象中
		 * 4.1首先把"普通表单字段"放到一个map中,再把map转换成book和category对象,再建立两者的关系.
		 */
		Map<String, Object> map = new HashMap<String, Object>();
		for(FileItem fileItem : fileItemList){
			if(()){				//如果是普通表单字段
			((), ("UTF-8"));
			}
		}
		Book book = (map, );				//把Map中的大部分数据封装到book对象中
		Category category = (map, );	//把map中的cid封装到category中
		(category);
		
		/*
		 * 4.2把上传的图片保存起来
		 *  >获取文件名:截取之
		 *  >给文件添加前缀:使用uuid前缀,为了避免文件同名现象
		 *  >校验文件的扩展名:只能是jpg
		 *  >校验图片的尺寸
		 *  >指定图片的保存路径,这需要使用ServletContext#getRealPath()
		 *  >保存之
		 *  >把图片的路径设置给book对象
		 */
		
		//获取文件名
		FileItem fileItem = (1);				//获取大图
		String filename = ();
		//截取文件名,因为部分浏览器上传的是绝对路径
		int index = ("\\");
		if(index !=-1){
			filename = (index + 1);
		}
		//给文件名添加uuid的前缀,避免文件重名现象
		filename = () + "_" + filename;
		//校验文件的扩展名
		if(!().endsWith(".jpg")){		//将大写转换成小写进行比较
			error("上传的图片扩展名必须是JPG", request, response);
			return;
		}
		//校验图片的尺寸
		//保存上传的图片,把图片new成图片对象: Image,Icon,ImageIcon,BufferedImage,ImageIO
		/*
		 *保存图片:
		 *1.获取真实路径
		 */
		String savepath = ().getRealPath("/book_img");
		/*
		 * 2.创建目标文件 
		 */
		File destFile = new File(savepath,filename);
		/*
		 * 3.保存文件
		 */
		try {
			(destFile);//它会把临时文件重定向到指定的路径,再删除临时文件
		} catch (Exception e) {
			throw new RuntimeException(e);
		}
		//校验尺寸
		//1.使用文件路径创建ImageIcon
		ImageIcon icon = new ImageIcon(());
		//2.通过ImageIcon得到Image对象
		Image image = ();
		//3.获取宽高来进行校验
		if((null)>350 || (null)>350){
			error("您上传的图片尺寸超出了350*350像素!", request, response);
			();			//删除图片
			return;
		}
		//把图片的路径设置给book对象
		book.setImage_w("book_img/" + filename);
		
		
		//获取文件名
		fileItem = (2);				//获取小图
		filename = ();
		//截取文件名,因为部分浏览器上传的是绝对路径
		index = ("\\");
		if(index !=-1){
			filename = (index + 1);
		}
		//给文件名添加uuid的前缀,避免文件重名现象
		filename = () + "_" + filename;
		//校验文件的扩展名
		if(!().endsWith(".jpg")){
			error("上传的图片扩展名必须是JPG", request, response);
			return;
		}
		//校验图片的尺寸
		//保存上传的图片,把图片new成图片对象: Image,Icon,ImageIcon,BufferedImage,ImageIO
		/*
		 *保存图片:
		 *1.获取真实路径
		 */
		savepath = ().getRealPath("/book_img");
		/*
		 * 2.创建目标文件 
		 */
		destFile = new File(savepath,filename);
		/*
		 * 3.保存文件
		 */
		try {
			(destFile);//它会把临时文件重定向到指定的路径,再删除临时文件
		} catch (Exception e) {
			throw new RuntimeException(e);
		}
		//校验尺寸
		//1.使用文件路径创建ImageIcon
		icon = new ImageIcon(());
		//2.通过ImageIcon得到Image对象
		image = ();
		//3.获取宽高来进行校验
		if((null)>350 || (null)>350){
			error("您上传的图片尺寸超出了350*350像素!", request, response);
			();			//删除图片
			return;
		}
		//把图片的路径设置给book对象
		book.setImage_b("book_img/" + filename);
		
		
		//调用service完成保存
		(());
		BookService bookService = new BookService();
		(book);
		
		//保存成功信息转发到
		("msg", "添加图书成功!");
		("/adminjsps/").forward(request, response);
	}
	
	/*
	 * 保存错误信息,转发到
	 */
	private void error(String msg, HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		("msg", msg);
		("/adminjsps/admin/book/").forward(request, response);
	}

}

下面是bookservice的添加方法.

public class BookService {
	private BookDao bookDao = new BookDao();
	/**
	 * 添加图书
	 * @param book
	 */
	public void add(Book book){
		try {
			(book);
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			throw new RuntimeException(e);
		}
	}
}

下面是bookDao的sql代码.

public class BookDao {
	private QueryRunner qr = new TxQueryRunner();
	/**
	 * 添加图书
	 * @param book
	 * @throws SQLException 
	 */
	public void add(Book book) throws SQLException {
		String sql = "insert into t_book(bid,bname,author,price,currPrice,"+
				"discount,press,publishtime,edition,pageNum,wordNum,printtime,"+
				"booksize,paper,cid,image_w,image_b)"+
				"values(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)";
		Object[] params = {(),(),(),
						   (),(),(),
						   (),(),(),
						   (),(),(),
						   (),(),().getCid(),
						   book.getImage_w(),book.getImage_b()};
		(sql,params);
	}
}