`

javaweb文件上传的九大问题

阅读更多
1、如何保证服务器的安全
把保存上传文件的目录放到WEB-INF目录中。

2、中文乱码问题
2.1普通字段的中文请求参数
String value = FileItem.getString("UTF-8");
2.2上传的文件名是中文
解决办法:request.setCharacterEncoding("UTF-8");

3、重名文件被覆盖的问题
System.currentMillions()+"_"+a.txt(乐观)
        UUID+"_"+a.txt:保证文件名唯一

4、分目录存储上传的文件
方式一:当前日期建立一个文件夹,当前上传的文件都放到此文件夹中。
例如:生成一个2014-10-6的文件夹
Date date = new Date();
DateFormat df = DateFormat.getDateInstance(DateFormat.MEDIUM);
String s = df.format(date);
String path = storePath+"\\"+s;
File file = new File(path);
if(!file.exists()){
    file.mkdirs();//创建多级目录,mkdir只创建一级目录
}
return path;//文件夹的地址

方式二:利用文件名的hash码打散目录来存储。
int hashCode = fileName.hashCode();

1001 1010 1101 0010 1101 1100 1101 1010
hashCode&0xf   0000 0000 0000 0000 0000 0000 0000 1111 &
---------------------------------------------
0000 0000 0000 0000 0000 0000 0000 1010   取hashCode的后4位
0000~1111:整数0~15共16个

1001 1010 1101 0010 1101 1100 1101 1010
(hashCode&0xf0) 0000 0000 0000 0000 0000 0000 1111 0000  &
--------------------------------------------
0000 0000 0000 0000 0000 0000 1101 0000  >>4
--------------------------------------------
0000 0000 0000 0000 0000 0000 0000 1101
     0000~1111:整数0~15共16个

5、限制用户上传的文件类型
通过判断文件的扩展名来限制是不可取的。
通过判断其Mime类型才靠谱。FileItem.getContentType();

6、如何限制用户上传文件的大小
6.1单个文件大小限制。超出了大小友好提示
抓异常进行提示:
org.apache.commons.fileupload.FileUploadBase.FileSizeLimitExceededException
6.2总文件大小限制。超出了大小友好提示
抓异常进行提示:
org.apache.commons.fileupload.FileUploadBase.SizeLimitExceededExcept

7、临时文件的问题
commons-fileupload组件不会删除超出缓存的临时文件。
FileItem.delete()方法删除临时文件。但一定要在关闭流之后。

8、多个文件上传时,没有上传内容的问题
if(fileName==null||"".equals(fileName.trim())){
continue;
}


9、上传进度检测
给ServletFileUpload注册一个进度监听器即可,把上传进度传递给页面去显示
//pBytesRead:当前以读取到的字节数
//pContentLength:文件的长度
//pItems:第几项
public void update(long pBytesRead, long pContentLength,
				int pItems) {
System.out.println("已读取:"+pBytesRead+",文件大小:"+pContentLength+",第几项:"+pItems);
}


完整实例 :
表单:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">
    
    <title>My JSP '1.jsp' starting page</title>
    
	<meta http-equiv="pragma" content="no-cache">
	<meta http-equiv="cache-control" content="no-cache">
	<meta http-equiv="expires" content="0">    
	<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
	<meta http-equiv="description" content="This is my page">
	<!--
	<link rel="stylesheet" type="text/css" href="styles.css">
	-->

  </head>
  
  <body>
 <form action="${pageContext.request.contextPath}/servlet/UploadServlet3" method="post" enctype="multipart/form-data">
   用户名<input type="text" name="username"/> <br/>
   <input type="file" name="f1"/><br/>
   <input type="file" name="f2"/><br/>
   <input type="submit" value="保存"/>
 </form>
  </body>
</html>


UploadServlet3
package com.mair.upload;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.text.DateFormat;
import java.util.Date;
import java.util.List;
import java.util.UUID;
import java.util.logging.SimpleFormatter;

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.FileUploadException;
import org.apache.commons.fileupload.ProgressListener;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

public class UploadServlet3 extends HttpServlet {

	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		
		//设置编码
		request.setCharacterEncoding("UTF-8");
		response.setContentType("text/html;charset=UTF-8");
		PrintWriter pw = response.getWriter();
		try {
			//设置系统环境
			DiskFileItemFactory factory = new DiskFileItemFactory();
			//文件存储的路径
			String storePath = getServletContext().getRealPath("/WEB-INF/files");
			//判断传输方式  form  enctype=multipart/form-data
			boolean isMultipart = ServletFileUpload.isMultipartContent(request);
			if(!isMultipart)
			{
			   	pw.write("传输方式有错误!");
			   	return;
			}
			ServletFileUpload upload = new ServletFileUpload(factory);
			upload.setFileSizeMax(4*1024*1024);//设置单个文件大小不能超过4M
			upload.setSizeMax(4*1024*1024);//设置总文件上传大小不能超过6M
			//监听上传进度
			upload.setProgressListener(new ProgressListener() {

				//pBytesRead:当前以读取到的字节数
 				//pContentLength:文件的长度
 				//pItems:第几项
				public void update(long pBytesRead, long pContentLength,
						int pItems) {
					System.out.println("已读去文件字节 :"+pBytesRead+" 文件总长度:"+pContentLength+"   第"+pItems+"项");
					
				}
			});
			//解析
			List<FileItem> items = upload.parseRequest(request);
			for(FileItem item: items)
			{
				if(item.isFormField())//普通字段,表单提交过来的
				{
					String name = item.getFieldName();
					String value = item.getString("UTF-8");
					System.out.println(name+"=="+value);
				}else
				{
//					String mimeType = item.getContentType(); 获取上传文件类型
//					if(mimeType.startsWith("image")){
					InputStream in =item.getInputStream();
					String fileName = item.getName(); 
					if(fileName==null || "".equals(fileName.trim()))
					{
						continue;
					}
					fileName = fileName.substring(fileName.lastIndexOf("\\")+1);
					fileName = UUID.randomUUID()+"_"+fileName;
					
					//按日期来建文件夹
					String newStorePath = makeStorePath(storePath);
					String storeFile = newStorePath+"\\"+fileName;
					OutputStream out = new FileOutputStream(storeFile);
					byte[] b = new byte[1024];
					int len = -1;
					while((len = in.read(b))!=-1)
					{
				         out.write(b,0,len);		
					}
					in.close();
					out.close();
					item.delete();//删除临时文件
				}
			  }
//			}
		}catch(org.apache.commons.fileupload.FileUploadBase.FileSizeLimitExceededException e){ 
		      //单个文件超出异常
			pw.write("单个文件不能超过4M");
		}catch(org.apache.commons.fileupload.FileUploadBase.SizeLimitExceededException e){
			//总文件超出异常
			pw.write("总文件不能超过6M");
			
		}catch (FileUploadException e) {
			e.printStackTrace();
		}
		
		

	}
       //用日期生成的目录,如果想用hashcode,后面
	private String makeStorePath(String storePath) {
		
		Date date = new Date();
		DateFormat df = DateFormat.getDateInstance(DateFormat.MEDIUM);
		String s = df.format(date);
		String path = storePath+"\\"+s;
		File file = new File(path);
		if(!file.exists())
		{
			file.mkdirs();//创建多级目录,mkdir只创建一级目录
		}
		return path;
		 
	}

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

}

用hashcode生成目录:只需要改写一下makeStorePath(String storePath, String fileName)函数
private String makeStorePath(String storePath, String fileName) {
		int hashCode = fileName.hashCode();
		int dir1 = hashCode & 0xf;// 0000~1111:整数0~15共16个
		int dir2 = (hashCode & 0xf0) >> 4;// 0000~1111:整数0~15共16个

		String path = storePath + "\\" + dir1 + "\\" + dir2; // WEB-INF/files/1/12
		File file = new File(path);
		if (!file.exists())
			file.mkdirs();

		return path;
	}

分享到:
评论

相关推荐

    javaweb文件上传与下载

    javaweb文件上传与下载

    javaweb文件上传和下载

    在Java Web开发中,文件上传和下载是常见的功能,尤其对于构建交互性强的Web应用程序至关重要。本教程将详细讲解如何实现这些功能,为初学者提供一个基础的学习平台。 一、文件上传 1. **Servlet API**:在Java ...

    javaweb文件上传与下载模块源代码

    这个"javaweb文件上传与下载模块源代码"提供了一个实现这些功能的基础框架,对于初学者和Java程序员来说,这是一个很好的学习资源。下面将详细讲解其中涉及的关键知识点。 1. **Servlet和HTTP协议**: - 在Java ...

    JavaWeb12-文件上传.rar

    JSP+servlet+javabean学习 里面有PDF文件对该章节的详细讲解,培训老师才讲的到的,非常详细......资源内容如下: JavaWeb02-request与response.rar ...JavaWeb12-文件上传.rar JavaWeb13-过滤器与监听器.rar

    javaweb文件域包

    JavaWeb文件域包是开发JavaWeb应用程序时处理文件上传功能的重要工具。在Web应用中,用户经常需要上传图片、文档等文件,这时就需要借助特定的库来实现这一功能。"commons-fileupload-1.3.1.jar" 和 "commons-io-2.4...

    JavaWeb中文件上传最强工具类

    在JavaWeb开发中,文件上传是一项常见的功能,用于接收用户通过网页上传的文件,例如图片、文档等。这里我们关注的是一个自定义的Util工具类,它特别针对Excel2007格式进行了优化,同时也兼容其他版本的Excel处理。...

    JavaWeb文件上传功能

    以下是对"JavaWeb文件上传功能"这一主题的详细阐述: 1. **前端交互**:在用户界面层,通常使用HTML的`&lt;input type="file"&gt;`元素来创建一个文件选择控件,允许用户选择要上传的文件。配合JavaScript,可以实现文件...

    javaweb简单实现文件上传与下载源代码

    在JavaWeb开发中,文件上传和下载是常见的功能需求,特别是在构建交互性强的Web应用时。本源代码示例提供了一个简单的实现,帮助开发者理解如何处理这些操作。下面将详细解释涉及的技术点。 1. **文件上传** - **...

    javaweb的文件上传整理

    #### 一、JavaWeb文件上传概述 在JavaWeb开发中,文件上传是一项常见的功能需求。本文将重点介绍两种文件上传方式:一种是基于Servlet的普通文件上传;另一种则是利用Struts2框架实现的文件上传。 #### 二、普通...

    JAVAWeb文件上传组件

    以上就是关于“JAVAWeb文件上传组件”的基本介绍,包括Apache Commons FileUpload和Commons IO的作用以及它们在Struts2框架中的使用。通过理解这些知识点,开发者可以有效地实现在Java Web应用中处理文件上传的需求...

    javaweb文件上传/图片上传

    在Java Web开发中,文件上传是一项常见的功能,尤其在处理用户提交的图片时更是不可或缺。本文将深入探讨“文件上传/图片上传”这一主题,包括基本概念、实现方式以及最佳实践。 1. 文件上传的基本原理 文件上传是...

    javaweb文件上传解析架包.rar

    "javaweb文件上传解析架包.rar"很可能是包含了一些实现这一功能的框架或库的压缩包。这里我们将详细探讨Java Web中的文件上传原理、常用框架以及解析过程。 1. 文件上传原理: 在HTTP协议中,文件上传通常通过POST...

    javaWeb文件的上传下载

    JavaWeb 文件上传下载功能实现 JavaWeb 文件上传下载是 Web 应用系统开发中非常常用的功能之一。今天,我们来讲一下 JavaWeb 中的文件上传和下载功能的实现。 文件上传实现 文件上传是将文件从客户端上传到服务器...

    文件上传到服务器 javaweb

    在Java Web开发中,文件上传是一项常见的功能,用于将用户选择的本地文件传输到服务器端。本教程将探讨如何利用Servlet技术实现文件上传至由Tomcat服务器托管的应用中。 首先,我们需要了解Servlet的基本概念。...

    JavaWEB文件上传需要的jar包

    在这个场景中,"JavaWEB文件上传需要的jar包"可能包括Apache Commons FileUpload库和Apache Commons IO库。这两个库为Java Web应用提供了强大的文件上传支持。 Apache Commons FileUpload库是专门处理HTTP请求中的...

    javaweb文件上传

    JavaWeb文件上传是一个常见的功能,尤其在构建交互式Web应用时。这个项目是基于Eclipse开发的,使用了Apache的Commons FileUpload库来处理文件上传。下面将详细讲解相关知识点。 1. **JavaWeb**: JavaWeb是Java技术...

    FileUploadServlet_javaweb文件上传servlet_

    在本示例中,"FileUploadServlet"是一个专门处理文件上传的Servlet,让我们详细了解一下如何利用Servlet实现文件上传功能。 首先,我们需要了解Servlet生命周期中的关键方法,如`init()`, `service()`, `doGet()` ...

    javaweb表单数据和多文件上传

    在Java Web开发中,表单数据和文件上传是常见的需求,尤其在构建动态网页和交互式应用程序时。本文将深入探讨如何使用Java Servlet和相关的库(如Apache Commons FileUpload)来实现这一功能。 首先,我们需要了解...

    javaweb实际项目开发中上传文件图片的实现(代码)

    - 文件上传过程中可能出现各种异常,如文件过大、格式不正确、磁盘空间不足等,需要捕获并妥善处理这些异常,通常会返回错误信息给前端。 7. **代码示例**: - 使用Spring MVC实现文件上传的简单示例: ```java ...

Global site tag (gtag.js) - Google Analytics