文件上传(java),文件上传java

java Web 文件上传,javaweb文件上传

介意:央浼实体过大的题目,请校订Nginx服务器的大小(百度参考413 Request
Entity Too Large 的解决措施)
jsp:<input type=”file”  style=”height: 114px;width: 100%;position:
absolute;opacity: 0;” name=”file1″ id=”file1″ >

$(function(){

        $("#file1").change(function(){
            //创建FormData对象
            var data = new FormData();
            //为FormData对象添加数据
            $.each($('#file1')[0].files, function(i, file) {
                     data.append('upload_file', file);
             });
            $.ajax({
                 url:'${pageContext.request.contextPath}/uploadImage',
                 type:'POST',
                 data:data,
                 cache: false,
                 contentType: false,    //不可缺
                 processData: false,    //不可缺
                 success:function(data){
                    //显示追加
                     var imgUrl="/"+data;
                     var showImg = "<div class='img-item'>" +
                             "<img src='" + imgUrl + "'>" +
                             "" +
                             "</div>";
                     $("#addImg").before(showImg);
                     //数据追加
                     var inputImg = "<input type='hidden' name='postImage'value='" + imgUrl + "' >";
                     $("#typeId").after(inputImg);
                  }
             });
         });
    });

java后台部分:

 1     @RequestMapping(value = "/uploadImage", method = RequestMethod.POST)
 2     @ResponseBody
 3     public String uploadImage(HttpServletRequest request) throws IOException {
 4         MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest)request;
 5         Iterator<String> iterator = multipartRequest.getFileNames();
 6         String fileName = "";
 7         SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
 8         String dir = "upload/" + sdf.format(new Date()) + "/";
 9         String realPath = request.getSession().getServletContext().getRealPath("/");
10         while(iterator.hasNext()){
11             MultipartFile multipartFile = multipartRequest.getFile(iterator.next());
12             if(multipartFile != null){
13                 String fn = multipartFile.getOriginalFilename();
14                 String suffix = fn.substring(fn.lastIndexOf("."));
15                 fileName = dir  + Utils.getRandomStringByLength(6) + suffix;
16                 String path = realPath + fileName;
17                 path = path.replace("\\", "/");
18                 File f = new File(path);
19                 if(!f.mkdirs()){
20                     f.mkdir();
21                 }
22                 multipartFile.transferTo(f);
23             }
24         }
25         return fileName;
26     }
27   //    上面方法需要用到下面的方法
28   public String getRandomStringByLength(int length) {
29         String base = "abcdefghijklmnopqrstuvwxyz0123456789";
30         Random random = new Random();
31         StringBuffer sb = new StringBuffer();
32         for (int i = 0; i < length; i++) {
33             int number = random.nextInt(base.length());
34             sb.append(base.charAt(number));
35         }
36         return sb.toString();
37     }

 

Web 文件上传,javaweb文件上传
注意:哀求实体过大的主题素材,请矫正Nginx服务器的高低(百度参照他事他说加以调查413 Request
Entity Too Large 的消除办法) js…

小心:须求实体过大的难题,请更改Nginx服务器的轻重缓急(百度参谋413 Request
Entity Too Large 的减轻方法)
jsp:<input type=”file”  style=”height: 114px;width: 100%;position:
absolute;opacity: 0;” name=”file1″ id=”file1″ >

javaweb 之 文件上传与下载,javaweb文件上传

java web图片上传和文件上传,javaweb图片上传

图形上传和文书上传本质上是一模二样的,图片本人也是文本。文件上传就是将图片上传来服务器,格局固然有成都百货上千,但底层的完成都以文本的读写操作。

注意事项

1.form表单一定要写属性enctype=”multipart/form-data”

2.为了能有限扶植文件能上传成功file控件的name属性值要和您付出的调节层变量名生机勃勃致,

比如说空间名是file那么你要在后台那样定义

private File file; //file控件名

private String fileContentType;//图片类型

private String fileFileName; //文件名

 

1.jsp页面

<%@ page language="java" contentType="text/html; charset=UTF-8"  
    pageEncoding="UTF-8"%>  
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">  
<html>  
<head>  
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">  
<meta http-equiv="pragma" content="no-cache" />  
<base target="_self">  
<title>文件上传</title> 
</head>
<body>
<form method="post" action="" enctype="multipart/form-data">
<input type="file" name="file" value="file">
<input type="submit" value="确定">
</form>
</body>
</html>

 

 

1.页面数码须要提交的Controller

package com.cpsec.tang.chemical.action;

import java.io.File;
import java.io.IOException;
import java.util.Random;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;

import org.apache.commons.io.FileUtils;
import org.apache.struts2.ServletActionContext;
import org.springframework.stereotype.Controller;

import com.cpsec.tang.chemical.biz.LunboBiz;
import com.cpsec.tang.chemical.entity.Image;
import com.opensymphony.xwork2.ActionSupport;


@Controller("lunboAction")
public class LunboAction extends ActionSupport {
    /**
     * 
     */
    private static final long serialVersionUID = 1L;
    @Resource(name="lunboBiz")
    private LunboBiz lunboBiz;
    private Image image;
    private File file; //file控件名
    private String fileContentType;//图片类型
    private String fileFileName; //文件名
    private Integer number;

    public String findImage(){
        image=lunboBiz.findImage();
        return SUCCESS;
    }

    public String alterImage(){
        image=lunboBiz.findImage();
        return SUCCESS;
    }

    public String alterImage1(){
        HttpServletRequest request = ServletActionContext.getRequest();
        String root = request.getRealPath("/upload");//图片要上传到的服务器路径
        String names[]=fileFileName.split("\\.");
        String fileName="";
        if(names.length>=1){
            fileName=getRandomString(20)+"."+names[names.length-1];
        }
        String picPath="upload/"+fileName;//图片保存到数据库的路径
        File file1=new File(root);
        try {
            FileUtils.copyFile(file, new File(file1,fileName));
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return SUCCESS;
    }

    /*获取一条随机字符串*/
    public String getRandomString(int length) { //length表示生成字符串的长度  
        String base = "abcdefghijklmnopqrstuvwxyz0123456789";     
        Random random = new Random();     
        StringBuffer sb = new StringBuffer();     
        for (int i = 0; i < length; i++) {     
            int number = random.nextInt(base.length());     
            sb.append(base.charAt(number));     
        }     
        return sb.toString();     
     }    

}

那是经过复制的章程上传文件,还也会有此外方式

方法二

@Controller("contractAction")
public class ContractAction extends ActionSupport {

    private final static String UPLOADDIR = "/files";//文件上传的路径,在webContent下建立
    private File file;  //input控件名一定为file 
    //上传文件名集合   
    private String fileFileName;   
    //上传文件内容类型集合   
    private String fileContentType; 

    private String filename;

    public String upload() throws FileNotFoundException, IOException{
        String path=uploadFile();//文件保存数据库的路径

        return SUCCESS;
    }

    //执行上传功能   
    @SuppressWarnings("deprecation")
    public String uploadFile() throws FileNotFoundException, IOException {   
        try {   
            InputStream in = new FileInputStream(file);   
            String dir = ServletActionContext.getRequest().getRealPath(UPLOADDIR);  
            File fileLocation = new File(dir);  
            //此处也可以在应用根目录手动建立目标上传目录  
            if(!fileLocation.exists()){  
                boolean isCreated  = fileLocation.mkdir();  
                if(!isCreated) {  
                    //目标上传目录创建失败,可做其他处理,例如抛出自定义异常等,一般应该不会出现这种情况。  
                    return null;  
                }  
            }
           // this.setFileFileName(getRandomString(20));
            String[] Name=this.getFileFileName().split("\\.");
            String fileName=getRandomString(20)+"."+Name[Name.length-1];
            this.setFileFileName(fileName);
            System.out.println(fileName);
            File uploadFile = new File(dir, fileName);
            OutputStream out = new FileOutputStream(uploadFile);   
            byte[] buffer = new byte[1024 * 1024];   
            int length;   
            while ((length = in.read(buffer)) > 0) {   
                out.write(buffer, 0, length);   
            }
            in.close();   
            out.close();   
            return UPLOADDIR.substring(1)+"\\"+fileFileName;
            } catch (FileNotFoundException ex) {
                return null;   
            } catch (IOException ex) {
                return null;   
        }   
    }


    public static String getRandomString(int length){
        String str="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
        Random random=new Random();
        StringBuffer sb=new StringBuffer();
        for(int i=0;i<length;i++){
          int number=random.nextInt(62);
          sb.append(str.charAt(number));
        }
        return sb.toString();
    }    

}

 

除开单图上传还会有多图上传,原理都以千篇一律的

package com.cpsec.tang.chemical.action;

import java.io.File;  
import java.io.FileInputStream;  
import java.io.FileNotFoundException;  
import java.io.FileOutputStream;  
import java.io.IOException;  
import java.io.InputStream;  
import java.io.OutputStream;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionSupport;


/**
 * 多文件上传
 */
public class FilesUploadAction extends ActionSupport {
         //上传文件存放路径   
         private final static String UPLOADDIR = "/upload";   
         //上传文件集合   
         private List<File> file;   
         //上传文件名集合   
         private List<String> fileFileName;   
         //上传文件内容类型集合   
         private List<String> fileContentType;   

         public List<File> getFile() {   
             return file;   
         }   

         public void setFile(List<File> file) {   
             this.file = file;   
         }   

        public List<String> getFileFileName() {   
            return fileFileName;   
        }   

         public void setFileFileName(List<String> fileFileName) {   
             this.fileFileName = fileFileName;   
         }   

         public List<String> getFileContentType() {   
             return fileContentType;   
         }   

         public void setFileContentType(List<String> fileContentType) {   
             this.fileContentType = fileContentType;   
         }   


         public String uploadform() throws Exception {
             HttpServletRequest request = ServletActionContext.getRequest();
             String webpath=null;//上传路径
             for (int i = 0; i < file.size(); i++) {   
                 //循环上传每个文件   
                 uploadFile(i); 
                 webpath="upload/"+this.getFileFileName().get(i);
             }
             return "SUCCESS";
         }  



        //执行上传功能   
         private String uploadFile(int i) throws FileNotFoundException, IOException {   
             try {   

                 InputStream in = new FileInputStream(file.get(i));   
                 String dir = ServletActionContext.getRequest().getRealPath(UPLOADDIR);  
                 File fileLocation = new File(dir);  
                 //此处也可以在应用根目录手动建立目标上传目录  
                 if(!fileLocation.exists()){  
                     boolean isCreated  = fileLocation.mkdir();  
                     if(!isCreated) {  
                         //目标上传目录创建失败,可做其他处理,例如抛出自定义异常等,一般应该不会出现这种情况。  
                         return null;  
                     }  
                 }  
                 String fileName=this.getFileFileName().get(i);  
                 File uploadFile = new File(dir, fileName);
                 OutputStream out = new FileOutputStream(uploadFile);   
                 byte[] buffer = new byte[1024 * 1024];   
                 int length;   
                 while ((length = in.read(buffer)) > 0) {   
                     out.write(buffer, 0, length);   
                 }
                 in.close();   
                 out.close();   
                 return uploadFile.toString();
             } catch (FileNotFoundException ex) {
                 return null;   
             } catch (IOException ex) {
                 return null;   
             }   
         }
     }

 

web图片上传和文书上传,javaweb图片上传
图片上传和文书上传本质上是大器晚成致的,图片本人也是文本。文件上传正是将图片上传出服务器,…

文本上传(java),文件上传java

  [1] 简介
        > 将一个用户端的本地的文件发送到服务器中保留。
        > 上传文件是透过流的样式将文件发送给服务器。
    
    [2] 表单的设置(文件上传日常选拔表单)
    
        > 向服务器上传一个文件时,表单要运用post恳求。
        > 表单的暗中认可属性enctype=”application/x-www-form-urlencoded”
            – 这些天性的意趣是供给体中的内容将会使用URL编码
vnsc威尼斯城官方网站,        > 上传文件的表单enctype须要安装为 multipart/form-data
            – multipart/form-data表示的是表单是贰个多部件的表单
            –
如若类型设置为它,则我们的每贰个表单项都会作为二个单独的预制构件发送给服务器。
            – 七个部件之间利用雷同—————————–7df2d08c0892 分割符来分别
        >
当表单设置为multipart/form-data时,我们request.getParameter()将失效,我们无法再经过该方法获得央浼参数。

1 <form action="${pageContext.request.contextPath }/FileUploadServlet" method="post" enctype="multipart/form-data">
2         用户:<input type="text" name="name">
3         <input type="file" name="photo"><br>
4         <input type="submit" value="提交">
5    </form>

    [3] FileUpload
        >
咱们经常意况下使用commons-fileupload-1.3.1.jar那么些工具来解析多部件诉求。
        > fileupload 依赖 commons-io
所以大家假如Filtupload必要同有的时候候导入io包。
        > 核心类:
            DiskFileItemFactory
                – 工厂类,用于营造七个深入分析器实例。
                
            ServletFileUpload
                – 分析器类,通过此类实例来分析request中的哀告音讯。
                
            FileItem
                –
工具会将我们恳请中每四个构件,都卷入为二个FileItem对象,管理公事上传时,只需求调用该对象的艺术
                –    方法:
                    boolean    isFormField()  –>
当前表单项是否是叁个普通表单项,true是普通表单项, false是文件表单项
                    String    getContentType() –>
再次来到的是文件的档期的顺序,是MIME值
                    String    getFieldName()   –>
获取表单项的name属性值
                    String    getName()         –>
获取上传的公文的名字
                    long getSize()          –> 获取文件的轻重
                    String    getString(String encoding) –>
获取表单项的value属性值,要求选拔一个编码作为参数。
                    void    write(File file)    –>
将表单项中的内容写入到磁盘中
                
        > 使用手续:
            1.收获工厂类实例[DiskFileItemFactory]
            2.获得分析器类实例[ServletFileUpload]
            3.解析request获取FileItem[parseRequest()]       

      vnsc威尼斯城官方网站 1

 1 @WebServlet("/FileUploadServlet")
 2 public class FileUploadServlet extends HttpServlet {
 3     private static final long serialVersionUID = 1L;
 4  
 5     protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
 6 
 7         //创建工厂类
 8         DiskFileItemFactory factory=new DiskFileItemFactory();
 9         //创建FileUploadServlet对象,通过这个对象完成上传功能
10         ServletFileUpload fileUpload=new ServletFileUpload(factory);
11         //用这个fileUpload对象解析request请求
12         try {
13             List<FileItem> fileList = fileUpload.parseRequest(request);
14             for(FileItem item:fileList){
15                 if (item.isFormField()) {
16                     //代表普通表单项
17                     String name = item.getFieldName();
18                     String value = item.getString("UTF8");
19                     System.out.println(name+":"+value);
20                 }else {
21                     //代表上传的文件
22                     long size = item.getSize();
23                     String contentType = item.getContentType();
24                     String name = item.getName();
25                     String fieldName = item.getFieldName();
26                                     System.out.println(size+":"+contentType+":"+name+":"+fieldName);
27                     String uuid = UUID.randomUUID().toString();//名字重复,后一章会覆盖前一章
28                     uuid.replace("-", "");
29                     item.write(new File("C:\\Users\\kanglu\\Desktop\\"+uuid+"_"+name));
30                 }//MIME 
31             }
32         }catch (Exception e) {
33             // TODO Auto-generated catch block
34             e.printStackTrace();
35         }
36     }
37 }

文本上传基本落到实处

    [4] 细节
        第二个难题
        > 部分浏览器会将文件的完好路径作为文件名发送。
            C:\Users\lilichao\Desktop\day20\图片\蒙娜Lisa.jpg
        >
像那类文件名我们须要截取一下字符串,只获得名字那大器晚成部分,而没有必要获得路线部分的新闻。
            通过如下代码对文件名张开截取字符串的操作:
                if(name.contains(“\\”)){
                    //借使满含则截取字符串
                    name = name.substring(name.lastIndexOf(“\\”)+1);
                }
              
        首个难题
        >
上传的文件有相当大希望现身重名,后上传的文本会将先上传的公文覆盖。
        > 化解:给文件名加一个唯风姿罗曼蒂克的前缀。
                唯大器晚成标记_fennu.jpg
                UUID_fennu.jpg   

1  //添加唯一前缀
2  String uuid = UUID.randomUUID().toString();//名字重复,后一章会覆盖前一章
3                  uuid.replace("-", "");

 

        第五个难题
        > 有个别情状需求节制上传文件的轻重缓急。
            – 设置单个文件大小为50KB:
                fileUpload.setFileSizeMax(1024*50);
            –
设置完单个文件大小限定之后,意气风发旦上传的公文超过约束,则会抛出如下万分:
                FileSizeLimitExceededException
               
全部能够对该极度举行捕获,当现身该非常时则设置一个错误新闻。
            
            – 设置多少个文件的总大小为150KB
                fileUpload.setSizeMax(1024*150);
            – 当八个文本的轻重超过范围时,会抛出如下格外
                SizeLimitExceededException

vnsc威尼斯城官方网站 2

 1 //单个文件
 2 fileUpload.setFileSizeMax(1024*50);
 3 try{
 4         ......
 5 }catch (FileSizeLimitExceededException e) {
 6     System.out.println("文件大小超出限制");
 7 }
 8 
 9 //多个文件
10 设置插入多个文件
11 <input type="file" name="photo"><br>
12 <input type="file" name="photo"><br>
13 限制大小处理
14 fileUpload.setSizeMax(1024*150);
15 try{
16         ......
17 }catch (SizeLimitExceededException e) {
18     System.out.println("整体文件大小超出限制");
19 }

约束文件大小

        第多少个难题
            > 当顾客上传一个空的文本,依旧会将文件保留到硬盘上。
            >
在保存文件应该先对文本的轻重实行推断,假设size为0,则不管理。

1 long size = item.getSize();
2 if(size==0){
3     System.out.println("文件大小为空");
4     continue;
5 }//若是多个文件,空文件可能位于首位,所以用continue;
6 //若是单个文件,可用break;
7 //此处针对上面所写代码,其位于for循环中

 

  [5]上传服务器

    上边代码汉语件直接传到本身的微型Computer上,客户无法由此浏览器举办互连网访谈。

    若要能透过浏览器访谈,可上传到tomcat服务器位于eclipse的镜像中。(自身使用的是eclipse进行编码)

 1  将文件上传到服务器上:
 2   1、将links和tc-servlet包复制到eclipse文件目录下;
 3  
 4   2、    //将文件存在tomcat服务器镜像上,获取镜像目录
 5       ServletContext servletContext=request.getServletContext();
 6       String realPath = servletContext.getRealPath("/upload");//要存储的具体位置
 7       File file = new File(realPath);
 8       if(!file.exists()){
 9           file.mkdirs();//文件不存在,创建文件(目录)
10          //file.isDirectory()表明上传的文件是个目录
11      }

 

   通过real帕特h获取文件所在地方,在浏览器上输入(如图片地址),即可获得

1  localhost:9999/web-upload/upload/168ea717-401b-485c-9d1f-c62cfa50d361_fennu.jpg
2  //在浏览器地址栏输入如上地址内容即可查看刚刚上传的文件(以图片为例),
3  //localhost:9999为tomcat端口号,web-upload为所写项目名,
4  //upload为文件所在位置,
5  //168ea717-401b-485c-9d1f-c62cfa50d361_fennu.jpg为图片名
6 6//_前内容为随机生成的唯一标识符

 
 完整代码,包涵上传服务器:

package com.neuedu.servlet;

import java.io.File;
import java.io.IOException;
import java.util.List;
import java.util.UUID;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
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.FileUploadBase.FileSizeLimitExceededException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

@WebServlet("/FileUploadServlet")
public class FileUploadServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        //创建工厂类
        DiskFileItemFactory factory=new DiskFileItemFactory();
        //创建FileUploadServlet对象,通过这个对象完成上传功能
        ServletFileUpload fileUpload=new ServletFileUpload(factory);

        fileUpload.setFileSizeMax(1024*50);

        //将文件上传到服务器,是能在互联网上访问
        ServletContext servletContext=request.getServletContext();
        String realPath = servletContext.getRealPath("/upload");
        File file = new File(realPath);
        if(!file.exists()){
            file.mkdirs();//文件不存在,创建文件(目录)
            //file.isDirectory()表明上传的文件是个目录
        }


        //用这个fileUpload对象解析request请求
        try {
            List<FileItem> fileList = fileUpload.parseRequest(request);
            for(FileItem item:fileList){
                if (item.isFormField()) {
                    //代表普通表单项
                    String name = item.getFieldName();
                    String value = item.getString("UTF8");
                    System.out.println(name+":"+value);
                }else {
                    //代表上传的文件
                    fileUpload.setFileSizeMax(1024*50);
                    long size = item.getSize();
                    String contentType = item.getContentType();
                    String name = item.getName();
                    String fieldName = item.getFieldName();
                    if(size==0){
                        System.out.println("文件大小为空");
                        continue;
                    }
                    System.out.println(size+":"+contentType+":"+name+":"+fieldName);
                    String uuid = UUID.randomUUID().toString();//名字重复,后一章会覆盖前一章
                    uuid.replace("-", "");
                    try {
                        item.write(new File(realPath+"\\"+uuid+"_"+name));
                    } catch (Exception e) {
                        // TODO: handle exception
                    }
                }//MIME
            }
        }catch (FileSizeLimitExceededException e) {
            System.out.println("文件大小超出限制");
        }
        catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

}

 

[1] 简要介绍将三个顾客端的地头的文件发送到服务器中保留。
上传文件是经过流的款型将文件发送给服务器。…

$(function(){

        $("#file1").change(function(){
            //创建FormData对象
            var data = new FormData();
            //为FormData对象添加数据
            $.each($('#file1')[0].files, function(i, file) {
                     data.append('upload_file', file);
             });
            $.ajax({
                 url:'${pageContext.request.contextPath}/uploadImage',
                 type:'POST',
                 data:data,
                 cache: false,
                 contentType: false,    //不可缺
                 processData: false,    //不可缺
                 success:function(data){
                    //显示追加
                     var imgUrl="/"+data;
                     var showImg = "<div class='img-item'>" +
                             "<img src='" + imgUrl + "'>" +
                             "" +
                             "</div>";
                     $("#addImg").before(showImg);
                     //数据追加
                     var inputImg = "<input type='hidden' name='postImage'value='" + imgUrl + "' >";
                     $("#typeId").after(inputImg);
                  }
             });
         });
    });

1、文件上传的原理剖析

java后台部分:

1.1文件上传的必备前提:

  • a、提供form表单,method必须是post
  • b、form表单的enctype必须是multipart/form-data
  • c、提供input type=”file”类的上传输入域
 1     @RequestMapping(value = "/uploadImage", method = RequestMethod.POST)
 2     @ResponseBody
 3     public String uploadImage(HttpServletRequest request) throws IOException {
 4         MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest)request;
 5         Iterator<String> iterator = multipartRequest.getFileNames();
 6         String fileName = "";
 7         SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
 8         String dir = "upload/" + sdf.format(new Date()) + "/";
 9         String realPath = request.getSession().getServletContext().getRealPath("/");
10         while(iterator.hasNext()){
11             MultipartFile multipartFile = multipartRequest.getFile(iterator.next());
12             if(multipartFile != null){
13                 String fn = multipartFile.getOriginalFilename();
14                 String suffix = fn.substring(fn.lastIndexOf("."));
15                 fileName = dir  + Utils.getRandomStringByLength(6) + suffix;
16                 String path = realPath + fileName;
17                 path = path.replace("\\", "/");
18                 File f = new File(path);
19                 if(!f.mkdirs()){
20                     f.mkdir();
21                 }
22                 multipartFile.transferTo(f);
23             }
24         }
25         return fileName;
26     }
27   //    上面方法需要用到下面的方法
28   public String getRandomStringByLength(int length) {
29         String base = "abcdefghijklmnopqrstuvwxyz0123456789";
30         Random random = new Random();
31         StringBuffer sb = new StringBuffer();
32         for (int i = 0; i < length; i++) {
33             int number = random.nextInt(base.length());
34             sb.append(base.charAt(number));
35         }
36         return sb.toString();
37     }

1.2enctype属性

效用:告知服务器央求正文的MIME类型。(乞求音信头:Content-Type效率是同样的)

可选值:application/x-www-form-urlencoded(默认):

正文:name=admin&password=123

服务器获取数据:String name = request.getParameter(“name”);

multipart/form-data:

正文

vnsc威尼斯城官方网站 3

服务器获取数据:request.getParameter(String)方法得到钦命的表单字段字符内容,但文件上传表单已经不在是字符内容,而是字节内容,所以失效。

文本上传:深入深入分析呼吁正文的每部分的剧情。

 

2、依附第三方的上传组件达成文件上传

2.1 fileupload概述

fileupload是由apache的commons组件提供的上传组件。它最要紧的做事正是帮大家分析request.getInputStream()。

导入commons-fileupload相关jar包

2.2 fileupload的宗旨类有:

a、分析原理

vnsc威尼斯城官方网站 4

2.3 fileupload轻巧利用

应用fileupload组件的步调如下:

创设工厂类DiskFileItemFactory对象:  DiskFileItemFactory factory = new
DiskFileItemFactory()

选择工厂创制剖析器对象:         ServletFileUpload fileUpload =
new ServletFileUpload(factory)

应用拆解深入分析器来深入分析request对象:      List<FileItem> list =
fileUpload.parseRequest(request)

FileItem对象对应一个表单项(表单字段)。可以是文件字段或普通字段

  •  boolean
    isFormField():推断当前表单字段是不是为日常文书字段,假若回去false,表明是文本字段;
  •  String getFieldName():获取字段名称,比方:<input
    type=”text” name=”username”/>,重返的是username;
  •  String
    getString():获取字段的内容,假如是文本字段,那么获取的是文件内容,当然上传的文书必得是文件文件;
  •  String getName():获取文件字段的文件名称;(a.txt)
  •  String
    getContentType():获取上传的文本的MIME类型,举个例子:text/plain。
  •  int getSize():获取上传文件的分寸;
  •  InputStream getInputStream():获取上传文件对应的输入流;
  •  void write(File):把上传的公文物尊崇留到钦赐文件中。
  • delete();

3、文件上传时要考虑的多少个难题(经验共享)

a、保险服务器的安全

  把保存上传文件的目录放在客户一向访谈不到的地点。

b、幸免文件被遮住

  让文件名唯生机勃勃就能够

c、防止同二个文本夹中的文件过多

  • 方案生龙活虎:依据日期进行打垮存款和储蓄目录
  • 方案二:用文件名的hashCode计算打垮的囤积目录:二级目录

d、节制文件的尺寸:web格局不合乎上传大的文本

  • 单个文件大小:ServletFileUpload.setFileSize马克斯(字节)
  • 总文件大小:(多文件上传)ServletFileUpload.setSize马克斯(字节)

e、上传字段客户并未有上传的标题

  通过判定文件名是或不是为空就能够

f、有的时候文件的主题材料

DiskFileItemFactory:  作用:产生FileItem对象

其间有三个缓存,缓存大小暗许是10Kb。假如上传的文件当先10Kb,用磁盘作为缓存。

寄放缓存文件的目录在何地?私下认可是系统的一时目录。

纵然协和用IO流完成的文件上传,要在流关闭后,清理有时文件。FileItem.delete();

  1 package com.upload;
  2 
  3 import java.io.File;
  4 import java.io.FileOutputStream;
  5 import java.io.IOException;
  6 import java.io.InputStream;
  7 import java.text.SimpleDateFormat;
  8 import java.util.Date;
  9 import java.util.List;
 10 import java.util.UUID;
 11 import java.util.logging.SimpleFormatter;
 12 
 13 import javax.servlet.ServletException;
 14 import javax.servlet.http.HttpServlet;
 15 import javax.servlet.http.HttpServletRequest;
 16 import javax.servlet.http.HttpServletResponse;
 17 
 18 import org.apache.commons.fileupload.FileItem;
 19 import org.apache.commons.fileupload.FileUploadBase;
 20 import org.apache.commons.fileupload.FileUploadException;
 21 import org.apache.commons.fileupload.disk.DiskFileItemFactory;
 22 import org.apache.commons.fileupload.servlet.ServletFileUpload;
 23 import org.apache.commons.io.FilenameUtils;
 24 
 25 import com.util.UUIDUtil;
 26 
 27 public class UploadServlet2 extends HttpServlet {
 28 
 29     public void doGet(HttpServletRequest request, HttpServletResponse response)
 30             throws ServletException, IOException {
 31         //执行文件上传的操作
 32         //判断是否写了那个multipart/form-data 即是否支持文件上传
 33         boolean isMultipartContent = ServletFileUpload.isMultipartContent(request);
 34         if(!isMultipartContent){
 35             throw new RuntimeException("your form is not multipart/form-data ");
 36         }
 37         //创建一个DiskFileItemfactory工厂类
 38         DiskFileItemFactory factory = new DiskFileItemFactory();
 39         //保存临时文件的目录
 40         factory.setRepository(new File("f:\\"));
 41         //创建一个servletFileUpload核心对象(表单解析器)
 42         ServletFileUpload sfu = new ServletFileUpload(factory);
 43         
 44         //解析request对象,并得到一个表单项的集合
 45         try {
 46             //sfu.setFileSizeMax(1024*1024*3);//3M
 47             
 48             sfu.setFileSizeMax(1024*1024*36);
 49             
 50             List<FileItem> fileItems = sfu.parseRequest(request);
 51             //遍历表单项
 52             for (FileItem fileItem : fileItems) {
 53                 if(fileItem.isFormField()){
 54                     //普通表单项
 55                     processFormField(fileItem);
 56                 }else{
 57                     //上传表单项
 58                     processUploadField(fileItem);
 59                 }
 60             }
 61             
 62         }catch (FileUploadBase.FileSizeLimitExceededException e) {
 63             //throw new RuntimeException("文件过大,不能超过3M");
 64             System.out.println("文件过大,不能超过3M");
 65         }
 66         catch (FileUploadException e) {
 67             e.printStackTrace();
 68         }
 69     }
 70     //上传表单项
 71     private void processUploadField(FileItem fileItem) {
 72         
 73         try {
 74             //得到文件输入流
 75             InputStream is = fileItem.getInputStream();
 76             //创建一个文件存盘的目录
 77             String directoryRealPath = this.getServletContext().getRealPath("/WEB-INF/upload");
 78             //既代表文件有代表目录
 79             File storeDirectory = new File(directoryRealPath);
 80             if(!storeDirectory.exists()){
 81                 storeDirectory.mkdirs();
 82             }
 83             //得到文件名
 84             String filename = fileItem.getName();
 85             //filename = filename.substring(filename.lastIndexOf(File.separator)+1);
 86             if(filename!=null){    
 87                 filename = FilenameUtils.getName(filename);
 88                 if(filename=="")
 89                     System.out.println("空文件");
 90             }
 91             //解决重名问题 UUID亦可以
 92             filename = UUIDUtil.getUUID()+"_"+filename;
 93             //目录打散
 94             //String childDirectory = makeChildDirectory(storeDirectory);
 95             
 96             String childDirectory = makeChildDirectory(storeDirectory,filename);
 97             
 98             //在storeDirectory目录下构建一个完整目录下的文件 
 99             File file = new File(storeDirectory,childDirectory+File.separator+filename);
100             //通过文件输出流将上传的文件保存到磁盘
101             FileOutputStream fos = new FileOutputStream(file);
102             int len = 0;
103             byte[] b = new byte[1024];
104             while((len = is.read(b))!= -1){
105                 fos.write(b,0,len);
106             }
107             fos.close();
108             is.close();
109             fileItem.delete();
110         } catch (IOException e) {
111             e.printStackTrace();
112         }
113         
114     }
115     //按目录打散
116     private String makeChildDirectory(File storeDirectory, String filename) {
117         int hascode = filename.hashCode();//返回字符串转换的32位hascode码 int值
118         
119         String code = Integer.toHexString(hascode);//把hascode转换成十六进制的字符     assdas3234af
120         
121         String childDirectory = code.charAt(0)+File.separator+code.charAt(1);
122         File file = new File(storeDirectory,childDirectory);
123         if(!file.exists()){
124             file.mkdirs(); 
125         }
126         return childDirectory;
127     }
128     /*//按日期打散
129     private String makeChildDirectory(File storeDirectory) {
130         SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
131         String dateDirectory = sdf.format(new Date());
132         //只管创建目录
133         File file = new File(storeDirectory,dateDirectory);
134         if(!file.exists()){
135             file.mkdirs(); 
136         }
137         return dateDirectory;
138     }*/
139     //普通表单项
140     private void processFormField(FileItem fileItem) {
141         String fieldname = fileItem.getFieldName();
142         String fieldvalue = fileItem.getString();
143         System.out.println(fieldname+"="+fieldvalue);
144         
145     }
146 
147     public void doPost(HttpServletRequest request, HttpServletResponse response)
148             throws ServletException, IOException {
149         doGet(request, response);
150     }
151 
152 }

普通话编码难题

 1 private void processUploadField(FileItem fileItem) {
 2         // 得到文件输入流
 3         try {
 4             InputStream is = fileItem.getInputStream();
 5             // 创建一个文件存盘的目录
 6             String directoryRealPath = this.getServletContext().getRealPath(
 7                     "/WEB-INF/upload");
 8             // 既代表文件有代表目录
 9             File storeDirectory = new File(directoryRealPath);
10             if (!storeDirectory.exists()) {
11                 storeDirectory.mkdirs();
12             }
13             // 得到文件名
14             String filename = fileItem.getName();
15             if (filename != null) {
16                 filename = FilenameUtils.getName(filename);
17                 if (filename == "")
18                     System.out.println("空文件");
19             }
20             // 解决重名问题 UUID亦可以
21             filename = UUIDUtil.getUUID() + "_" + filename;
22             String childDirectory = makeChildDirectory(storeDirectory, filename);
23             // 上传文件自动删除临时文件 
24             /*
25              * fileItem.write(new
26              * File(storeDirectory,childDirectory+File.separator+filename));
27              * fileItem.delete();
28              */
29             // 上传文件,自动删除临时文件
30             fileItem.write(new File(storeDirectory, childDirectory
31                     + File.separator + filename));
32             fileItem.delete();//!!!
33         } catch (IOException e) {
34             e.printStackTrace();
35         } catch (Exception e) {
36             e.printStackTrace();
37         }
38     }

 

4、文件的下载

 1 package com.servlet;
 2 
 3 import java.io.IOException;
 4 import java.io.PrintWriter;
 5 import java.net.URLEncoder;
 6 
 7 import javax.servlet.ServletException;
 8 import javax.servlet.http.HttpServlet;
 9 import javax.servlet.http.HttpServletRequest;
10 import javax.servlet.http.HttpServletResponse;
11 
12 public class DownloadServlet extends HttpServlet {
13 
14     public void doGet(HttpServletRequest request, HttpServletResponse response)
15             throws ServletException, IOException {
16         //设置一个要下载的文件
17         String filename = "销售榜单.csv";
18         
19         //设置文件名的编码
20         if(request.getHeader("user-agent").toLowerCase().contains("msie")){
21             filename = URLEncoder.encode(filename, "UTF-8");//将不安全的文件名改为UTF-8格式
22         }else{
23             filename = new String(filename.getBytes("UTF-8"),"iso-8859-1");//火狐浏览器
24         }
25         //告知浏览器要下载文件
26         response.setHeader("content-disposition", "attachment;filename="+filename);
27         //response.setHeader("content-type", "image/jpeg");
28         //根据文件名自动获得文件类型
29         response.setContentType(this.getServletContext().getMimeType(filename));
30         //告知服务器使用什么编码
31         response.setCharacterEncoding("UTF-8");
32         //创建一个文件输出流
33         PrintWriter out = response.getWriter();
34         out.write("电视机,20\n");
35         out.write("洗衣机,10\n");
36         out.write("冰箱,8\n");
37     }
38 
39     public void doPost(HttpServletRequest request, HttpServletResponse response)
40             throws ServletException, IOException {
41         doGet(request, response);
42     }
43 
44 }

 

之 文件上传与下载,javaweb文件上传
1、文件上传的法规深入分析 1.1文书上传的必备前提:
a、提供form表单,method必需是 post b、form表单的…

相关文章