文件上传细节处理

摘要:
文件上传中,我们会遇到很多问题,例如:1、上传文件名的中文乱码和上传数据的中文乱码:upload.setHeaderEncoding("UTF-8");//解决上传文件名的中文乱码//表单为文件上传,设置request编码无效,只能手工转换1.1value=newString(value.getBytes("iso8859-1"),"UTF-8");1.2Stringvalue=item.getS

文件上传中,我们会遇到很多问题,例如:

1、上传文件名的中文乱码和上传数据的中文乱码:

upload.setHeaderEncoding("UTF-8"); //解决上传文件名的中文乱码
//表单为文件上传,设置request编码无效,只能手工转换
1.1 value = new String(value.getBytes("iso8859-1"),"UTF-8");
1.2 String value = item.getString("UTF-8");

2.为保证服务器安全,上传文件应该放在外界无法直接访问的目录

3、为防止文件覆盖的现象发生,要为上传文件产生一个唯一的文件名

4、为防止一个目录下面出现太多文件,要使用hash算法打散存储

5.要限制上传文件的最大值,可以通过:
ServletFileUpload.setFileSizeMax(1024)
方法实现,并通过捕获:
FileUploadBase.FileSizeLimitExceededException异常以给用户友好提示

6.想确保临时文件被删除,一定要在处理完上传文件后,调用item.delete方法

7.要限止上传文件的类型:在收到上传文件名时,判断后缀名是否合法

8、监听文件上传进度:
ServletFileUpload upload = new ServletFileUpload(factory);
upload.setProgressListener(new ProgressListener(){
public void update(long pBytesRead, long pContentLength, int arg2) {
System.out.println("文件大小为:" + pContentLength + ",当前已处理:" + pBytesRead);
}
});

9. 在web页面中动态添加文件上传输入项
function addinput(){
var div = document.getElementById("file");
var input = document.createElement("input");
input.type="file";
input.name="filename";
var del = document.createElement("input");
del.type="button";
del.value="删除";
del.onclick = function d(){
this.parentNode.parentNode.removeChild(this.parentNode);
}
var innerdiv = document.createElement("div");
innerdiv.appendChild(input);
innerdiv.appendChild(del);
div.appendChild(innerdiv);
}

上传upload.jsp 如下

<%@ page language="java"import="java.util.*"pageEncoding="UTF-8"%>


<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>My JSP 'upload.jsp' starting page</title>
  </head>
  
  <body>
    
    <form action="${pageContext.request.contextPath }/servlet/UploadServlet1"
enctype
="multipart/form-data"method="post">上传用户:<input type="text"name="username"><br/>上传文件1:<input type="file"name="file1"><br/>上传文件2:<input type="file"name="file2"><br/> <input type="submit"value="提交"> </form> </body> </html>

上传UploadServlet1 如下:

public class UploadServlet1 extendsHttpServlet {

    public voiddoGet(HttpServletRequest request, HttpServletResponse response)
            throwsServletException, IOException {

        //request.getParameter("username");  //****错误
        request.setCharacterEncoding("UTF-8");  //表单为文件上传,设置request编码无效
        
        //得到上传文件的保存目录
        String savePath = this.getServletContext().getRealPath("/WEB-INF/upload");
        
        try{
            DiskFileItemFactory factory = newDiskFileItemFactory();
//当上传数据大于DiskFileItemFactory 工厂缓存大小,新建一个临时文件夹来保存到临时文件,再拷贝到文件中 factory.setRepository(
new File(this.getServletContext().getRealPath("/WEB-INF/temp"))); ServletFileUpload upload = new ServletFileUpload(factory); /*upload.setProgressListener(new ProgressListener(){ public void update(long pBytesRead, long pContentLength, int arg2) { System.out.println("文件大小为:" + pContentLength + ",当前已处理:" + pBytesRead); } });*/ upload.setHeaderEncoding("UTF-8"); //解决上传文件名的中文乱码 if(!upload.isMultipartContent(request)){ //按照传统方式获取数据 return; } /*upload.setFileSizeMax(1024); upload.setSizeMax(1024*10);*/List<FileItem> list =upload.parseRequest(request); for(FileItem item : list){ if(item.isFormField()){ //fileitem中封装的是普通输入项的数据 String name =item.getFieldName(); String value = item.getString("UTF-8"); //value = new String(value.getBytes("iso8859-1"),"UTF-8"); System.out.println(name + "=" +value); }else{ //fileitem中封装的是上传文件 String filename = item.getName(); //不同的浏览器提交的文件是不一样 c:a1.txt 1.txt System.out.println(filename); if(filename==null || filename.trim().equals("")){ continue; } filename = filename.substring(filename.lastIndexOf("\")+1); InputStream in =item.getInputStream(); String saveFilename = makeFileName(filename); //得到文件保存的名称 String realSavePath = makePath(saveFilename, savePath); //得到文件的保存目录 FileOutputStream out = new FileOutputStream(realSavePath + "\" +saveFilename); byte buffer[] = new byte[1024]; int len = 0; while((len=in.read(buffer))>0){ out.write(buffer, 0, len); } in.close(); out.close(); item.delete(); //删除临时文件,位置一定要位于流关闭之后 } } }catch(FileUploadBase.FileSizeLimitExceededException e) { e.printStackTrace(); request.setAttribute("message", "文件超出最大值!!!"); request.getRequestDispatcher("/message.jsp").forward(request, response); return; } catch(Exception e) { e.printStackTrace(); } } public String makeFileName(String filename){ //2.jpg return UUID.randomUUID().toString() + "_" +filename; } //利用Hashcode分散生成多级上传文件目录 publicString makePath(String filename,String savePath){ int hashcode =filename.hashCode(); int dir1 = hashcode&0xf; //0--15 int dir2 = (hashcode&0xf0)>>4; //0-15 String dir = savePath + "\" + dir1 + "\" + dir2; //upload23 upload35 File file = newFile(dir); if(!file.exists()){ file.mkdirs();//多级目录要创建目录的.mkdirs()方法 } returndir; } public voiddoPost(HttpServletRequest request, HttpServletResponse response) throwsServletException, IOException { doGet(request, response); } }

免责声明:文章转载自《文件上传细节处理》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇强大的日期控件(my 97)(七)学习CSS之filter属性下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

c++ string 的函数replace()用法

basic_string::replace 将原string 中的元素或子串替换。返回替换后的string。 (1)用string 或C-string 代替操作string 中从 _Pos1 开始的 _Num1 个字符 basic _ string& replace( size _ type _Pos1 ,size _ type _Num1 ,...

spring + redis 实现数据的缓存

1、实现目标   通过redis缓存数据。(目的不是加快查询的速度,而是减少数据库的负担)   2、所需jar包      注意:jdies和commons-pool两个jar的版本是有对应关系的,注意引入jar包是要配对使用,否则将会报错。因为commons-pooljar的目录根据版本的变化,目录结构会变。前面的版本是org.apache.pool,而...

matlab 中如何创建以及获取popupmenu的值

1.如何创建popupmenu的值 如图,点击河南左边的符号,会弹出右边的小窗口,输入完一项之后点击enter继续创建第二项即可。 2.如何获取popupmenu的值 functionpopupmenu_Callback(hObject, eventdata, handles) val = get(handles.popupmenu,'value...

MongoDB配置文件YAML-based选项全解

配置文件部分 MongoDB引入一个YAML-based格式的配置文件。2.4版本以前的仍然兼容。 我的mongodb配置文件: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39...

Spark学习进度11-Spark Streaming&amp;amp;Structured Streaming

Spark Streaming Spark Streaming 介绍 批量计算  流计算 Spark Streaming 入门  Netcat 的使用  项目实例 目标:使用 Spark Streaming 程序和 Socket server 进行交互, 从 Server 处获取实时传输过来的字符串, 拆开单词并统计单词数量, 最后打印出来每一个小批...

Send Email

private string SendEmail(string mailTo, string body, ref int sendresult) { string errorEmailAddress = ""; SmtpClient smtp = new SmtpClient(_SmtpS...