如何在项目中上传文件

        

对于我这样的初学者来说,记一下笔记还是有必要的,针对于在工作中常见的一些功能做一下自己的总结,以便于以后的工作节省更多的时间,比方说上传文件这样的模块

下面就上代码吧!

public void updateNewsServlet(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		// 设置响应乱码
		response.setContentType("text/html;charset=utf-8");
		// 接收新闻参数
		String tid = null;
		String ntitle = null;
		String nauthor = null;
		String nsummary = null;
		String ncontent = null;
		String newsid = null;
		String newPicPath = null;

		// 上传文件
		// 1.准备一个文件存储的地方File.separator表示在不同的系统创建目录方式不同/ window \ linux
		// 因为图片是从服务器获取的所以通过上下文对象获取服务器的绝对路径
		String path = this.getServletContext().getRealPath("/upload");
		// String filePath = "d:"+File.separator+"admin";
		// 创建一个文件对象
		File file = new File(path);
		// 判断这个文件是否存在
		if (!file.exists()) {
			// 如果该文件目录不存在则进行创建
			file.mkdirs();// 递归创建
		}
		// 2.准备一个文件缓存的地方
		String empPath = "e:" + File.separator + "emp";
		// 创建文件缓存对象
		File fileEmp = new File(empPath);
		// 同上的判断
		if (!fileEmp.exists()) {
			// 如果不存在则递归创建
			fileEmp.mkdirs();
		}
		// 3.控制上传文件的大小
		long fileMax = 6 * 1024 * 1024;
		// 4.控制上传文件的类型
		List<String> fileType = new ArrayList<String>();
		fileType.add("jpg");
		fileType.add("bmp");
		fileType.add("png");
		fileType.add("jpeg");
		fileType.add("tif");
		fileType.add("gif");
		// 5.开始上传文件
		// 创建文件缓冲区的大小
		FileItemFactory fif = new DiskFileItemFactory(4096, fileEmp);
		// 创建ServletFileUpload文件上传对象
		ServletFileUpload sfu = new ServletFileUpload(fif);

		boolean fileflag = false;
		String message = "";
		try {
			// 先判断表单里面是否有enctype属性,有则为文件表单,没有则为普通的表单
			if (sfu.isMultipartContent(request)) {
				// 正常情况下普通表单类型
				// 先判断是普通字段还是文件字段
				List<FileItem> filItems = sfu.parseRequest(request);
				for (FileItem fileItem : filItems) {
					// isFormField为true则为普通表单字段 false则为文件字段
					if (fileItem.isFormField()) {
						// 为true则为普通表单用的
						if (fileItem.getFieldName().equals("ntid")) {
							tid = fileItem.getString("utf-8");
						}
						if (fileItem.getFieldName().equals("ntitle")) {
							ntitle = fileItem.getString("utf-8");
						}
						if (fileItem.getFieldName().equals("nauthor")) {
							nauthor = fileItem.getString("utf-8");
						}
						if (fileItem.getFieldName().equals("nsummary")) {
							nsummary = fileItem.getString("utf-8");
						}
						if (fileItem.getFieldName().equals("ncontent")) {
							ncontent = fileItem.getString("utf-8");
						}
						if (fileItem.getFieldName().equals("newsid")) {
							newsid = fileItem.getString("utf-8");
						}
					} else {
						// false文件字段
						// 开始上传
						// 得到文件的大小
						long fileSize = fileItem.getSize();
						// 如果大小不为0的话才开始上传
						if (fileSize != 0) {
							// 判断如果这个文件大于fileMax最大值则不提示上传文件不能超过6MB
							if (fileSize <= fileMax) {
								// 获得上传文件名
								String newFileName = fileItem.getName();
								// 截取文件名后面的文件类型
								String newFileType = newFileName
										.substring(newFileName.lastIndexOf(".") + 1);
								// 判断文件类型
								boolean flag = false;
								// 遍历定义文件类型,如果上传的文件类型与定义的文件类型匹配则跳出循环将flag值置为true
								for (String str : fileType) {
									// 如果截取的文件类型相同则跳出循环
									if (str.equals(newFileType)) {
										flag = true;
										break;
									}
								}
								if (flag) {
									// 得到文件名的绝对路径
									String truePath = path + File.separator
											+ newFileName;
									// 记录文件的路径
									newPicPath = "upload" + File.separator
											+ newFileName;
									// 创建一个文件对象
									File trueFile = new File(truePath);
									// 上传 将FileItem对象中保存的主体内容保存到指定的文件中
									fileItem.write(trueFile);
								} else {
									// 上传失败
									fileflag = true;
									message = "修改失败,文件类型不匹配,支持(png,jpg,bmp,tif,jpeg,gif)";
								}
							} else {
								// 提示上传文件不能超过最大值
								fileflag = true;
								message = "修改失败,上传的文件不能超过6MB";
							}
						}
					}
				}

			} else {
				// 说明表单中没有文件属性
				fileflag = true;
				message = "修改失败,表单中缺少某些属性,请联系管理员";
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		if (fileflag) {
			response.getWriter()
					.write("<script>alert('"
							+ message
							+ "');location.href='newsServlet?method=toUpdateNewsServlet&nid='"
							+ newsid + ";</script>");
		}

		// 创建新闻对象封装数据
		News news = new News();
		news.setNewId(Integer.valueOf(newsid));
		news.setNewAuthor(nauthor);
		news.setNewContent(ncontent);
		news.setNewTitle(ntitle);
		news.setNewSummary(nsummary);
		news.setNewModiftDate(new Date());
		news.setNewPicPath(newPicPath);
		Topic topic = new Topic();
		topic.setTopicId(Integer.valueOf(tid));
		news.setTopic(topic);

		// 调用修改新闻的方法
		boolean flag = newsService.updateNewsByNid(news);
		if (flag == true) {
			response.getWriter()
					.write("<script>alert('修改成功');location.href='newsServlet?method=loginToAdmin';</script>");
		} else {
			request.getRequestDispatcher("newsServlet?method=toUpdateNewsServlet&nid="
					+ newsid);
		}

	}

有上传就有下载下面是下载的代码

public class FileDownDemo extends HttpServlet {

	
	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		doPost(request, response);
	}

	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		//第一步设置相应文件内容,告诉浏览器,现在要输出的是下载文件,不要用普通的html页面解析
		response.setContentType("application/x-msdownload");
		//设置下载的文件名字(可以从数据库中取出)
		String FileName = "文件下载.png";
		//URLEncoder.encode(FileName, "utf-8")  作用更改编码格式  url的编码格式  转码
		//第二步,告诉浏览器,需要用户自定义选择下载,不用浏览器客户端自动解析
		response.setHeader("Content-Disposition", "attachment;filename="+URLEncoder.encode(FileName, "utf-8"));
		//第三步使用流写到浏览器上  
		OutputStream FileOut = response.getOutputStream();
		//定义需要下载的文件位置,不一定文件要在webRoot下(可以数据库记录文件位置,然后使用这个能找到就行)
		String DownFileName = "C:\\Users\\Administrator\\Desktop\\网段.PNG";
		//使用流读出来然后写入
		InputStream in = new FileInputStream(DownFileName);
		byte[] buffer = new byte[in.available()];
		//通过流读出到内存
		in.read(buffer);
		//写入流向客户端
		FileOut.write(buffer);
		//关闭流
		in.close();
		FileOut.close();
		
	}

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值