欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

图片上传

程序员文章站 2022-04-08 16:06:25
...

这里用的原生方法。

也可以使用springMVC中的文件上传,通过配置springmvc.xml 然后添加依赖或导入jar包直接调用,很方便。

首先util类:

       这里为了其他地方调用方便,使用了泛型

public class FileUploadUtil extends HttpServlet {

		public  static  <T> T fileUpload(HttpServletRequest req, HttpServletResponse resp)
				throws ServletException, IOException {
			// 获取ServletContext对象
			ServletContext sc=req.getServletContext();
			/*String encode=sc.getInitParameter("encode");*/
			String encode="UTF-8";
			// 声明临时文件夹和上传文件夹的相对路径
			String tempPath="/WEB-INF/temp";
			String uploadPath="/WEB-INF/upload";
			
			// 声明一个用于保存普通表单项数据的map集合
			Map<String, String> pMap=new HashMap<String, String>();
			// 声明一个变量,保存商品图片的实际url
			String imgurl=null;
			// 1.接收请求参数
			// 2.表单验证(略)
			// 借助commons-fileupload.jar
			
			
			DiskFileItemFactory factory=new DiskFileItemFactory(1024*1024,new File(sc.getRealPath(tempPath)));
			ServletFileUpload fileUpload=new ServletFileUpload(factory);
			if(!fileUpload.isMultipartContent(req)){
				throw new RuntimeException("请使用正确的文件上传表单");
			}
			// 设置单个文件的大小
			fileUpload.setFileSizeMax(1024*1024);//10KB
			// 设置一次上传的文件的总大小
			fileUpload.setSizeMax(1024*1024);//1mb
			
			// 解决上传文件名的乱码问题
			fileUpload.setHeaderEncoding(encode);
			try {
				// 解析请求
				List<FileItem> list=fileUpload.parseRequest(req);
				if(list!=null && list.size() >0){
					for(FileItem fileItem:list){
						if(fileItem.isFormField()){
							// 普通表单项
							String name=fileItem.getFieldName();
							String value=fileItem.getString(encode);
							//System.out.println(name+"~~~"+value);
							//将普通表单项数据添加到pMap集合中
							pMap.put(name, value);
						}else{
							// 3.将上传的图片保存到对应位置
							// 文件上传项
							String fileName=fileItem.getName();
							
							//ie bug
							if(fileName.contains("\\")){
								fileName=fileName.substring(fileName.lastIndexOf("\\")+1);
							}
							
							//文件名重复问题
							fileName=UUID.randomUUID().toString()+"_"+fileName;
							
							//文件路径问题
							String hexStr=Integer.toHexString(fileName.hashCode());
							//补足8位
							while(hexStr.length()<8){
								hexStr="0"+hexStr;
							}
							// 拆分成路径
							String midPath="/";
							for(int i=0;i<hexStr.length();i++){
								midPath+=hexStr.charAt(i)+"/";
							}
							
							// /WEB-INF/upload/a/b/c/d/1/2/3/4/1231231.jpg
							imgurl=uploadPath+midPath+fileName;
							// 生成目录
							// d:/web/workspace/easymall/webroot/....
							uploadPath=sc.getRealPath(uploadPath+midPath);
							new File(uploadPath).mkdirs();
							
							//将文件保存到目标目录
							InputStream is=fileItem.getInputStream();
							FileOutputStream fos=null;
							try {
								fos=new FileOutputStream(uploadPath+"/"+fileName);
								byte[] array=new byte[1024];
								int len=is.read(array);
								while(len!=-1){
									fos.write(array, 0, len);
									len=is.read(array);
								}
							} catch (Exception e) {
								e.printStackTrace();
								throw new RuntimeException("图片上传失败");
							}finally{
								is.close();
								fos.close();
								//删除临时文件
								fileItem.delete();
							}
						}
					}
				}
			} catch (FileUploadException e) {
				e.printStackTrace();
			}
			
			//用户信息更新文件上传
			if(pMap.get("upType").equals("userUpdate")){
				// 创建一个JavaBean,封装本次表单提交的商品信息
				User updateInfo = new User();
				// 从pMap中获取普通表单项数据,添加到prod对象中
				updateInfo.setId(pMap.get("id"));
				updateInfo.setUsername(pMap.get("username"));
				updateInfo.setNickname(pMap.get("nickname"));
				updateInfo.setGender(pMap.get("gender"));
				// 保存商品图片的url 相对于当前应用的路径
				updateInfo.setProfilehead(imgurl);     
				updateInfo.setAge(pMap.get("age"));
				updateInfo.setEmail(pMap.get("email"));
				updateInfo.setTell(pMap.get("tell"));
				updateInfo.setProfile(pMap.get("profile"));
				 return (T) updateInfo;
				}
			//后台添加影片文件上传
			if(pMap.get("upType").equals("movieAdd")){
			// 创建一个JavaBean,封装本次表单提交的商品信息
			Movie addMovie = new Movie();
			// 从pMap中获取普通表单项数据,添加到prod对象中
			addMovie.setId(DateUtil.getId());
			addMovie.setName(pMap.get("name"));
			addMovie.setPrice(Double.parseDouble(pMap.get("price")));
			addMovie.setDuration(Integer.valueOf(pMap.get("duration").trim()));
			// 保存商品图片的url 相对于当前应用的路径
			addMovie.setImgurl(imgurl);     
			addMovie.setContents(pMap.get("contents"));
			return  (T) addMovie;
			}
		//后台上线影院文件上传
		 if(pMap.get("upType").equals("cinemaAdd")){
			Cinema addCinema= new Cinema();
			// 从pMap中获取普通表单项数据,添加到prod对象中
			addCinema.setId(DateUtil.getId());
			addCinema.setName(pMap.get("name"));
			addCinema.setAddress(pMap.get("address"));
			addCinema.setImgurl(imgurl);
			addCinema.setTell(pMap.get("tell"));
			  return (T) addCinema;
		 }
			
		//后台更新影片文件上传
		if(pMap.get("upType").equals("movieUpdate")){
		Movie updateMovie = new Movie();
		// 从pMap中获取普通表单项数据,添加到prod对象中
		updateMovie.setId(pMap.get("id"));
		updateMovie.setName(pMap.get("name"));
		updateMovie.setPrice(Double.parseDouble(pMap.get("price")));
		updateMovie.setDuration(Integer.valueOf(pMap.get("duration").trim()));
		// 保存商品图片的url 相对于当前应用的路径
		updateMovie.setImgurl(imgurl);     
		updateMovie.setContents(pMap.get("contents"));
		return  (T) updateMovie;
		}
		//后台更新影院文件上传
		 if(pMap.get("upType").equals("cinemaUpdate")){
				Cinema updateCinema= new Cinema();
				// 从pMap中获取普通表单项数据,添加到prod对象中
				updateCinema.setId(pMap.get("id"));
				updateCinema.setName(pMap.get("name"));
				updateCinema.setAddress(pMap.get("address"));
				updateCinema.setImgurl(imgurl);
				updateCinema.setTell(pMap.get("tell"));
				  return (T) updateCinema;
			 }
		 
		return (T)pMap;
	}
	}	

直接调用即可。

form表单:

<form id="f" action="" method="post"  enctype="multipart/form-data">
...
<img id="myhead"  src="film/getFileImg.do?imgurl=${loginUser.profilehead}"  width="100" height="100"><br/>   //显示
<input type="file" name="profilehead"  onchange="changImg(event)" accept="image/*"/>

  这里使用了图片回显。回显请看下一篇。

相关标签: 图片上传