• java文件操作


    使用Servlet3.0实现文件上传
    
    必须满足2个条件:
    1.    添加@MultipartConfig注解。
    注解的属性:
    属性名    类型    是否可选    描述
    fileSizeThreshold    int    是    当数据量大于该值时,内容将被写入文件
    location    String    是    存放临时生成的文件地址
    maxFileSize    long    是    允许上传的文件最大值。默认值-1,表示没有限制
    maxRequestSize    long    是    针对该multipart/form-data请求的最大数量,默认值-1,表示没有限制
    2.    使用2个重要方法
    Part  getPart(String  name):name请求的文件名。
    Collection<Part>  getParts():获取请求文件中的所有文件。
    
    实例
    上传jsp页面
    <form action="FirstServlet" enctype="multipart/form-data" method="post">
    <ul>
    <li>
    <input type="file" name="file1" id="file1">
    </li>
    <li><input type="submit" value="提交"/></li>
    </ul>
    </form>
    
    FirstSservlet代码
    注意:使用Servlet3.0在开发时上传location属性指定的临时文件路径会报路径无效的异常(the temporary upload (路径地址) is not valid),只要在指定路径里添加缺少的文件夹就可以。
    @WebServlet("/FirstServlet")
    @MultipartConfig(location="temp")
    public class FirstServlet extends HttpServlet {
        private static final long serialVersionUID = 1L;
           
        /**
         * @see HttpServlet#HttpServlet()
         */
        public FirstServlet() {
            super();
            // TODO Auto-generated constructor stub
        }
    
        /**
         * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
         */
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            // TODO Auto-generated method stub
            response.getWriter().append("Served at: ").append(request.getContextPath());
        }
    
        /**
         * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
         */
        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            // TODO Auto-generated method stub
            
            //设置响应page指令的contentType属性值
            response.setContentType("text/html;charset=UTF-8");
            //获得PrintWriter对象
            PrintWriter pw=response.getWriter();
            //获取服务器的地址
            String path=this.getServletContext().getRealPath("/");
            //获得用户上传的文件
            Part  p=request.getPart("file1");
            //处理上传的为图像文件
            if(p.getContentType().contains("image")){
                //创建ApplicationPart对象
                ApplicationPart ap=(ApplicationPart)p;
                //获得文件名字
                String  fname1=ap.getSubmittedFileName();
                //对上传文件名进行截取
                int path_idx=fname1.lastIndexOf("\")+1;
                //获取文名
                String fname2=fname1.substring(path_idx, fname1.length());
                p.write(path+"/upload/"+fname2);
                pw.write("文件上传成功");
                
            }else{
                
                pw.write("文件上传失败");
            }
        
            RequestDispatcher dispatcher=request.getRequestDispatcher("Deal.jsp");
            //执行转发
            dispatcher.forward(request, response);
            doGet(request, response);
        }
    
    }
    
    
    使用Commons-FileUpload组件实现文件上传
    
    1.    创建上传对象
    创建一个工厂对象
    DiskFileItemFactory  factory=new DiskFileItemFactory ();
    创建一个新的文件上传对象
    ServletFileUpload  upload=new  ServletFileUpload(factory);
    2.    解析上传请求
    通过parseRequest()方法获取全部表单项。
    Public  List  parseRequest(HttpServletRequest  request) throws FileUploadException
    通过isFormField()方法判断表单项是文件域还是普通表单域。如果返回true说明是普通表单域。
    Public  Boolean  isFormField()
    通过FileItem类的getName()方法实现获取文件上传名称。
    getSize()方法获得文件上传的大小。
    getContentType()方法获得上传文件的类型。
    
    上传文件实例
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            // TODO Auto-generated method stub
            String  ctname;
            //获得文件上传的真实地址
            String fileDir=request.getRealPath("upload/");
            String  mesg="文件上传成功";
            String  address="";
            
            //判断是否上传文件
            if(ServletFileUpload.isMultipartContent(request)){
                //创建一个工厂对象
                DiskFileItemFactory  factory=new DiskFileItemFactory();
                //设置内存中允许存储的字节
                factory.setSizeThreshold(20*1024);
                //设置存放临时文件的路径
                factory.setRepository(factory.getRepository());
                //创建一个上传文件的对象
                ServletFileUpload  upload=new ServletFileUpload(factory);
                //设置上传文件大小
                int size=4*1024*1024;
                //保存上传文件的集合对象
                List list=null;
                
                try {
                    //获得上传文件列表
                    list=upload.parseRequest(request);
                } catch (FileUploadException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                //创建迭代器
                Iterator  iter=list.iterator();
                //循环迭代
                while(iter.hasNext()){
                    //创建FileItem对象,获得每一个上传文件
                    FileItem  flie=(FileItem)iter.next();
                    //判断是文件域或普通表单域
                    if(!flie.isFormField()){
                        //获得文件名称
                        String name=flie.getName();
                        //判断文件大小是否超过设定文件大小
                        if(flie.getSize()>size){
                            mesg="文件过大,无法上传";
                            
                        }
                        
                        //获取上传文件大小
                        String ctsize=new  Long(flie.getSize()).toString();
                        //判断文件是否存在
                        if((name==null || name.equals("")) && ctsize.equals("0")){
                            
                            mesg="文件为空。";
                            continue;//文件为空跳出本次循环
                        }
                        //创建上传文件的名称
                        ctname=name.substring(name.lastIndexOf("\")+1,name.length());
                        address=fileDir+"\"+ctname;
                        //创建File对象,根据文件地址创建一个空文件
                        File  file=new File(address);
                        
                        try {
                            //向创建的文件中写入数据
                            flie.write(file);
                        } catch (Exception e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        }
                        
                    }
                    
                }
    
            }
        
            request.setAttribute("msg", mesg);
            RequestDispatcher dispatcher=request.getRequestDispatcher("Deal.jsp");
            //执行转发
            dispatcher.forward(request, response);
            doGet(request, response);
        }
    
    使用Commons-FileUpload组件实现文件下载
    
    1.    使用文件File类获取需要下载的文件
    File(String  path)
    File  file=new  File(“D:\11\text.txt”);
    File  file=new  File(“D:\11”,”text.txt”)
    2.    创建字节输入流
    FileInputStream   in=new  FileInputStream(File  file);
    3.    创建字节输出流
    OutputStream  os=request.getOutputStream();
    实例
    如果使用表单的话可以指定调用:doPost()或doGet()方法。
    但如果使用a标签,a标签是默认调用doGet()方法。所以使用a标签调用Servlet时必须砸doGet()方法中写后天逻辑。
    
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            // TODO Auto-generated method stub
            //获得path的参数值
                    String  path="D:\Users\Administrator\workspace\HelloWorld\upload\IMG_20161014_095008.jpg";
                            //request.getParameter("path");
                    //将Path的字符集修改为UTF-8
                    path=new String(path.getBytes("ISO-8859-1"),"UTF-8");
                    //创建File对象
                    File  file=new  File(path);
                    //创建文件字节输入流
                    FileInputStream  in=new FileInputStream(file);
                    //创建文件字节输出流,通过response获取OutputStream对象
                    OutputStream  os=response.getOutputStream();
                    //设置应答头文件Content-Disposition属性,值为ttachment;filename=文件路径名
                    response.setHeader("Content-Disposition", "attachment;filename="
                            +new String(file.getName().getBytes("GBK"),"ISO-8859-1"));
                    //设置应答头文件信息文件大小
                    response.setHeader("Content-Length", file.length()+"");
                    //设置应答文件的编码
                    response.setCharacterEncoding("UTF-8");
                    //设置文件为文件输出流
                    response.setContentType("application/octet-stream");
                    //声明数据变量
                    int  data=0;
                    while((data=in.read())!=-1){
                        //向指定目录中输出文件
                        os.write(data);
                        
                    }
                    //关闭文件输入流和文件输出流
                    in.close();
                    os.close();
                    
            RequestDispatcher dispatcher=request.getRequestDispatcher("login.jsp");
            //执行转发
            dispatcher.forward(request, response);
            
            
            
            doGet(request, response);
        }
  • 相关阅读:
    .net中的目录
    select into in mysql
    内存泄漏调查
    【NO.3】 c program to caculate and display sum of two matrix
    LoadRunner获取一个独特的价值在执行的场景
    Android 基于Netty接收和发送推送解决方案的消息字符串(三)
    springmvc如何访问静态文件,例如jpg,js,css
    HTTP求
    SlopOne推荐算法
    回溯-01背包问题之二:连续工作模式
  • 原文地址:https://www.cnblogs.com/gynbk/p/6556270.html
Copyright © 2020-2023  润新知