`

博客系统之文件上传

 
阅读更多

一个博客系统中,图片的上传时必不可少的。

 

<form action="<%=URL%>/PhotoAction.action?action=upload" method="post" 
		  enctype="multipart/form-data">

  这是一个文件上传的表单的form项,enctype属性规定在发送到服务器之前应该如何对表单数据进行编码,一般默认是在发送表单前编码所有字符,默认值是”application/x-www-form-urlencoded”,我们进行文件上传时,不用编码,所以我们的设置值为multipart/form-data,因为对于文件上传的过程中是将文件以流的形式提交到服务器端的。

 

 

<input type="file" name="upfile">

  然后inputtypefile,表示上传文件,nameupfile

 

文件上传的表单时代码是这样:

 

<form action="<%=URL%>/PhotoAction.action?action=upload" method="post" 
		  enctype="multipart/form-data">
	<!--  <input type="hidden" name="action" value="upload">  -->
		<div>
			<table>
			<tr>
				<td>
					<input type="file" name="upfile">
				</td>	
			</tr>
			<tr>
				<td>
					<label for="photoInfo">图片描述:</label>
			<input type="text" id="photoInfo" name="photoInfo">
				</td>	
			</tr>
			<tr>
				<td>
					<input type="submit" value="上传">
				</td>	
			</tr>
			</table>
		</div>
		
	</form>

  表单弄好了我们就可以上传了,一般地,我们用servlet来处理文件上传。一般我们如果是直接获取上传的输入流后,再解析里面的请求参数是很麻烦的,处理不好可能会使保存的文件出现错误。

 

就比如下面这个例子,我们把这个表单上传的内容全部输出看看是什么样的结构:

 

String getAction = request.getParameter("action");
		if (getAction != null && (getAction.equals("upload"))) // 上传文件
		{
			// 定义上传的最大文件字节数1M
			int MAX_SIZE = 1024000;
			String rootPath;
			//输入流
			DataInputStream in = null;
			//文件输出流
			FileOutputStream fileOut = null;
			String remoteAddr = request.getRemoteAddr();
			String serverName = request.getServerName();
			String realPath = request.getRealPath("/");
			realPath = realPath.substring(0, realPath.lastIndexOf("\\"));
			// 设置保存文件的目录
			rootPath = realPath + "\\upload\\telRecord\\";
			// 取得客户端上传的数据类型
			String contentType = request.getContentType();
			if (contentType.indexOf("multipart/form-data") >= 0) {
				try {
					//获取request的输入流,并创建DataInputStream流
					in = new DataInputStream(request.getInputStream());
					//获取内容大小
					int formDataLength = request.getContentLength();
					if (formDataLength > MAX_SIZE) {
						//大于限制则禁止上传
						String url = "error.jsp";
						return url;
					}
					// 用dateBytes保存上传的文件数据
					byte dateBytes[] = new byte[formDataLength];
					int byteRead = 0;
					int totalRead = 0;
					//读取表单所有内容
					while (totalRead < formDataLength) {
						byteRead = in.read(dateBytes, totalRead, formDataLength);
						//读取内容,并保存在dateBytes里面
						totalRead += byteRead;
					}
					String data = new String(dateBytes, "UTF-8");
					//把表单的内容转成utf-8
					System.out.println(data);
					//输出内容
					
					
					//后面的是如何截取表单中的文件内容,并把内容存入文件
					//的操作但是我们必须是对dateBytes截取,不能是data,
					//因为必须是非编码内容,如果是转成了string的data,估计
					//已经对其编码了,如果我们截取data,那可能会乱码的。
					
					//后面的步骤就省略了
					String url = this.adminSelectPhoto(request, response);
					return url;

				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}
		String url = "error.jsp";
		return url;

  我们上传的表单是这样设置的:

我们点击上传后。

  这是我们输出的表单内容的最前面的一部分:

  这是我们输出表单内容的最后面的一部分:

  我们会发现,我们上传的表单的内容是用

  这个字符串来隔开的,它把上传文件和图片描述输入框这两部分内容分割开来,而且整个表单开始也是用这个字符串。

  整个表单结束是

  这个字符从结束的

 

  首先第一个是文件


 
 文件名是123.jpg.

  ?PNG及其后面这些乱码就是文件内容。

 

  然后是我们的图片描述的输入,我们输入的是123,

  可以看出,我们的输入框的名字photoInfo,内容是123。

  看到这里,我们已经明白了怎么把文件内容取出来了,这整个表单内容,我们只要截取文件内容那一段,然后把它保存到文件里面就ok了,但是我们一般不宜采取string的格式来寻找文件内容,应该是按照比较原始的byte的格式来截取,转成string后来弄的话,会造成我们保存的文件出现问题。截取表单中的文件内容,并把内容存入文件的操作,我们必须是对dateBytes截取,不能是data,因为必须是非编码内容,如果是转成了string的data,估计已经对其编码了,如果我们截取data,那可能会乱码的。

所以我们一般采用apache的开源工具common-fileupload这个文件上传组件,然后common-fileupload是依赖于common-io这个包的,所以还要下载这个包。

 

然后这两个包放在项目的WebContent/WEB-INF/lib文件夹里面:


 
 然后我们处理上传的代码如下:

// 获得目前登录的博主的id
		HttpSession session = request.getSession();
		MasterBean master = (MasterBean) session.getAttribute("masterBean");
		int masterID = master.getId();
		File file;
		// 上传文件的最大值
		int maxFileSize = 5000 * 1024;
		// 内存中存储文件的最大值
		int maxMemSize = 5000 * 1024;
		// 为了设置文件存储路径,我们先获取该类PhotoAction.Java在web项目下的路径
		URL url_photoAction = this.getClass().getResource("PhotoAction.class");
		System.out.println(url_photoAction);
		// 将URL类型的路径转换成String类型,方便后面利用indexOf方法对路径进行截取
		String str_url_photoAction = url_photoAction.toString();
		System.out.println(str_url_photoAction);
		// 由于url_photoAction的路径是D:\JavaWeb\tomcat\wtpwebapps\MyBlog\WEB-INF\classes\com\MyBlog\action_implements
		// 自己希望存储的路径为D:\JavaWeb\tomcat\wtpwebapps\MyBlog\images\photo
		// 因此需要进行路径截取,以及配置,找到所需路径的最后一个位置的坐标
		int pos = str_url_photoAction.indexOf("WEB-INF");
		// 通过pos值。截取,先获得web服务器所在的根路径
		String rootPath = str_url_photoAction.substring(6, pos);
		// 设置自己想要存储的相对路径
		String relativePath = "images/photo";
		// 最后,设置文件存储路径
		String filePath = rootPath + relativePath;
		System.out.println(filePath);
		System.out.println("action=" + request.getParameter("action"));

		// 验证上传内容了类型
		String contentType = request.getContentType();
		if ((contentType.indexOf("multipart/form-data") >= 0)) {
			// 如果上传的是"multipart/form-data",即不编码的内容,那么久处理,

			// 创建一个DiskFileItemFactory工厂,
			// 这个类的作用就是把文件内容临时保存到内存中
			DiskFileItemFactory factory = new DiskFileItemFactory();
			// 设置内存中存储文件的最大值
			factory.setSizeThreshold(maxMemSize);
			// 当内存中存储的数据大于 maxMemSize,那么保存到磁盘中,
			// 所以这里设置用于存放临时文件的存放路径
			factory.setRepository(new File("c:\\temp"));

			// 创建一个新的文件上传解析器
			// 把刚刚创建的factory传进去,
			// 因为这个ServletFileUpload依赖于
			// DiskFileItemFactory工厂
			ServletFileUpload upload = new ServletFileUpload(factory);
			// 设置最大上传的文件大小
			upload.setSizeMax(maxFileSize);
			try {
				// 解析获取的文件,解析结果返回的是一个List<FileItem>集合,
				// 每一个FileItem都对应一个form表单的ipnutx项。
				List fileItems = upload.parseRequest(request);

				// 处理上传的文件。先获取fileItems迭代器
				Iterator i = fileItems.iterator();
				while (i.hasNext()) {// 遍历整个迭代器
					FileItem fi = (FileItem) i.next();
					// 获取fileItems中的一项的内容,并强制转换为FileItem
					if (!fi.isFormField()) {
						// 这里是判断这个input项是不是非普通输入,即是文件输入

						// 获取上传的文件名字,因为上传过程中,可能会在原文件
						// 上面添加一些附加的信息,所以截掉"\\"前面的所有字符以及"\\"
						String fileName = fi.getName();
						// 写入文件
						if (fileName.lastIndexOf("\\") >= 0) {
							file = new File(filePath, fileName.substring(fileName.lastIndexOf("\\")));
						} else {
							file = new File(filePath, fileName.substring(fileName.lastIndexOf("\\") + 1));
						} // 对文件名字进行处理

						System.out.println(">>>>>>>>>>" + file);
						if (!file.exists())
							file.createNewFile();// 如果文件不存在,先创建文件

						fi.write(file);// 将内容写入文件
						// out.println("Uploaded Filename: " + filePath +
						// fileName + "<br>");
						// 获取页面上面的关于图片的描述信息
						String photo_info = request.getParameter("photoInfo");
						System.out.println("photoInfo:" + photo_info);
						PhotoBean photoBean = new PhotoBean();
						photoBean.setPhotoAddr("/images/photo/" + fileName);
						photoBean.setPhotoSdTime(Common.changeTime(new Date()));
						if (photo_info == null || photo_info.equals("")) {
							// 若页面没有添加图片描述信息,则默认为文件名作为描述信息
							photoBean.setPhotoInfo(fileName);
						} else {
							photoBean.setPhotoInfo(photo_info);
						}
						photoBean.setMasterID(masterID);
						PhotoDao photoDao = new PhotoDao();
						boolean flag = photoDao.operationPhoto("upload", photoBean);
						if (flag) {
							String url = this.adminSelectPhoto(request, response);
							return url;
						}
					}
				}
			} catch (Exception ex) {
				ex.printStackTrace();
			}
		}
		String url = "error.jsp";
		return url;

 

  这里面涉及到一个迭代器的使用。

List的迭代器的用法如下:  

 Iterator it = list.iterator();

    while (it.hasNext()) {

        personnelID= (String) it.next();

//这里一般要强制转换会原来的数据类型,因为这里返回的是object类型。

    }

1)使用iterator()方法可使list返回一个迭代器It

2)it第一次调用next方法会返回list的第一个元素。

3)hasnext是判断是否存在下一个元素。

4)next方法获取下一个元素,并把这个迭代器移到这个元素的位置上。

  这样不断循环,直到下一个没有元素,退出循环,达到遍历list的目的。

 

 

 

 

 

  • 大小: 5.9 KB
  • 大小: 71.8 KB
  • 大小: 20.1 KB
  • 大小: 4.7 KB
  • 大小: 7.8 KB
  • 大小: 5 KB
  • 大小: 79.1 KB
  • 大小: 6.3 KB
  • 大小: 21 KB
分享到:
评论

相关推荐

    基于javaweb的blog博客系统(源代码+sql文件)

    9. **文件上传**:如果博客支持图片或附件上传,那么需要处理文件上传功能,涉及文件存储策略、大小限制和格式检查等。 10. **错误处理和日志记录**:一个成熟的系统会包含异常处理机制和日志记录,帮助开发者定位...

    基于ThinkPHP 6 和 LayUI 框架 的博客管理系统,用户登录注册包含验证码,博客文件上传,博客文章的crud

    基于ThinkPHP 6 和 LayUI 框架 的博客管理系统,用户登录注册包含验证码,博客文件上传,博客文章的crud,用户个人信息的crud,jquery操作dom的ajax回调,博客文章上传的加密操作,用户密码加密,用户的登出。...

    博客中的多文件上传

    在IT行业中,多文件上传是一项常见的功能,尤其在博客、论坛和社交媒体等平台中,用户可能需要一次上传多个图片、文档或视频。本教程将深入探讨如何在C# ASP.NET环境中实现这一功能,并结合HTMLTable展示上传文件。...

    Python-一个基于Django博客系统

    **Python-基于Django的博客系统** Python-一个基于Django博客系统是一个使用Python编程语言和Django框架构建的应用程序,特别设计用于内容管理和在线发布。这个博客系统由两个主要部分构成:前台展示系统和后台编辑...

    ThinkPHP 6 和 LayUI 框架 的博客管理系统,用户登录注册包含验证码博客文件上传.zip

    ThinkPHP 6 和 LayUI 框架 的博客管理系统,用户登录注册包含验证码博客文件上传,博客文章的crud,用户个人信息的crud,jquery操作dom的ajax回调,博客文章上传的加密操作,用户密码加密,用户的登出。

    个人博客管理系统

    对于压缩包内的文件"说明.htm",它可能包含博客系统安装、配置和使用的详细指南,指导用户如何在Appserv环境下搭建和运行此博客系统。"lnblog-1.1.0"可能是博客系统的源代码或者安装包,用户需要解压后按照说明进行...

    php + mysql 个人博客系统

    2. 响应式设计:考虑到不同设备的屏幕尺寸,使用媒体查询(media queries)实现响应式布局,使博客系统在手机、平板和桌面电脑上都能良好展示。 六、SEO优化与性能提升 1. SEO友好:通过元标签、URL重写、XML ...

    POETIZE个人博客系统源码.zip

    5. `poetize_picture`:很可能存储了博客系统中使用的图片资源,包括但不限于logo、示例图片、用户上传的头像等。 6. `poetize-server`:这个目录很可能是博客系统的后端服务器端代码,负责处理HTTP请求、数据库...

    Java EE个人博客系统

    6. **文件上传与下载**:博客系统可能支持用户上传头像或附件,这就需要用到文件上传功能。Java EE提供了Part接口和相关的API来处理文件上传,同时需要考虑文件的存储位置、大小限制以及安全性。 7. **模板引擎**:...

    毕业设计之博客管理系统(含数据库文件及开发设计文档)

    在博客系统中,SQL Server 2005负责存储用户信息、文章内容、评论等数据,并提供高效的查询和事务处理能力。 3. **数据库设计**:数据库文件是系统的重要组成部分,通常包含用户表(存储用户名、密码、邮箱等)、...

    简单的博客系统-SSH

    在这个"简单的博客系统"中,这三者协同工作,提供了一个功能完备的个人博客平台,允许用户创建、编辑和发布文章,同时支持文件上传。 ### 1. Struts2 Struts2 是一个基于MVC(Model-View-Controller)设计模式的...

    ASP.NET网络系统实例之个人博客系统

    【ASP.NET网络系统实例之个人博客系统】 ASP.NET是由微软公司推出的一种强大的Web应用程序开发框架,主要用于构建功能丰富的、高性能的、易于维护的网站和应用程序。在这个实例中,我们关注的是一个基于ASP.NET 2.0...

    博客系统项目代码

    博客系统项目代码通常涵盖了一个完整的Web应用程序开发,用于创建、发布和管理个人或集体的博客内容。这样的系统可能包括前端用户界面、后端服务器逻辑、数据库交互以及一系列辅助功能,如用户注册、权限管理、评论...

    thinkphp 开源博客系统

    解压后,将文件上传到你的服务器或者本地开发环境中。然后,通过 Web 浏览器访问安装目录,按照提示进行数据库连接配置、管理员账号创建等步骤。完成这些,博客系统就可以正常运行并开始使用了。 在后台管理部分,...

    java web 博客系统

    【Java Web 博客系统】是一个综合性的应用项目,它结合了前端网页设计与后端服务器编程技术,实现了用户在Web上进行博客创作、浏览、交互的功能。在本项目中,核心的技术点主要包括Java Web开发、数据库管理和用户...

    基于JAVA的个人博客系统的设计与实现.pdf

    在信息化社会中,个人博客系统不仅用于信息的发布和沟通,还能提供个性化的设计,帮助用户管理和展示个人信息,增进人与人之间的互动和交流。 ### 知识点二:基于Java的个人博客系统技术架构 本系统采用了JSP与...

    SSH个人博客系统

    SSH个人博客系统是一款基于Java技术开发的轻量级博客平台,主要由Struts、Spring和Hibernate这三个核心框架组成,这就是所谓的SSH(Struts + Spring + Hibernate)架构。这个项目是作者在课余时间完成的,虽然规模较...

    可编译的好用轻博客系统

    在压缩包文件【HaiTian.RuanJian.HaiKe - 0120】中,可能包含了轻博客系统的安装文件、数据库配置、源代码、文档教程等资源。用户在下载后,可以通过编译源代码将系统部署到自己的服务器上,根据提供的文档进行配置...

    基于thinkphp5.0的个人博客系统

    【压缩包子文件的文件名称列表】:尽管没有提供具体的文件名,但通常一个基于ThinkPHP5.0的个人博客系统会包含以下组件: 1. 源代码文件夹(如application、public、runtime等):存放所有业务逻辑、视图模板、配置...

    免费个人博客系统(兼多用户博客系统)

    免费个人博客系统(兼多用户博客系统)是支持一个空间2个网站的全能型网站管理系统,本免费个人博客系统通用和拓展性强,博客、文章系统、商城、企业网站、个性化论坛等类型网站都可以使用,将来网站无论如何转型或...

Global site tag (gtag.js) - Google Analytics