JavaWeb - 文件上传和下载

文件上传和下载的实质:文件的拷贝

文件上传:从本地拷贝到服务器磁盘上 客户端需要编写文件上传表单---->服务端需要编写代码接受上传的 文件
文件下载:从服务器磁盘上拷贝到本地磁盘 需要编写服务端的代码,客户端的下载的工作浏览器内核解决的

  1. 文件上传的步骤:
    (1) 需要写一个文件上传表单
    (2) 编写服务器端的代码用于接收上传的文件
  2. 客户端的编码
    注意事项:


    html代码
  3. 服务端接受文件上传的表单数据
    文件上传原理


    HTTP请求头

    使用方便快捷的文件上传的工具---Apache Commons-fileupload.jar
    使用步骤:
    (1) 下载文件上传的jar包 fileuplaod 借助于 commons-io.jar


    工具jar包

    (2) 使用fileupload工具中的API进行编码
  4. FileUpload工具中三个核心的对象
    DiskFileItemFactory:磁盘文件项工厂--一些相关的配置的设置 缓存的大小 临时目录的位置
    ServletFileUplaod:文件上传的一个核心类
    FileItem:代表每一个表单项
  5. 快速入门
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.List;
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.disk.DiskFileItem;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

public class FileuploadServlet extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {      
        try {
            //接受上传文件    
            //1、创建磁盘文件项工厂
            DiskFileItemFactory factory = new DiskFileItemFactory();
            //2、创建文件上传的核心类
            ServletFileUpload upload = new ServletFileUpload(factory);  
            //3、解析request---获得文件项集合
            List<FileItem> parseRequest = upload.parseRequest(request);
            //4、遍历文件项集合
            for(FileItem item : parseRequest){
                //5、判断普通表单项/文件上传项
                boolean formField = item.isFormField();//是否是一个普通表单项
                if(formField){
                    //普通表单项
                    String fieldName = item.getFieldName();
                    String fieldValue = item.getString();
                    System.out.println(fieldName+":"+fieldValue);
                }else{
                    //文件上传项
                    //获得上传文件的名称
                    String fileName = item.getName();
                    //获得上传文件的内容
                    InputStream in = item.getInputStream();
                    //将in中的数据拷贝服务器上
                    String path = this.getServletContext().getRealPath("upload");
                    OutputStream out = new FileOutputStream(path+"/"+fileName);
                    int len = 0;
                    byte[] buffer = new byte[1024];
                    while((len=in.read(buffer))>0){
                        out.write(buffer, 0, len);
                    }               
                    in.close();
                    out.close();
                }
            }           
        } catch (FileUploadException e) {
            e.printStackTrace();
        }
    }

    public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }
}
  1. 文件上传的API的详解
    (1) DiskFileItemFactory
    设置缓存大小:factory.setSizeThreshold() 单位是字节
    设置临时文件的目录:factory.setRepository(File)
    (2) ServletFileUpload
    判断是否是一个文件上传的表单:ServletFileUpload.isMultipartContent(request);
    解析request获得表单项的集合:upload.parseRequest(request);
    设置上传的文件名的编码方式:upload.setHeaderEncoding("UTF-8");
    (3) FileItem
    判断是否是普通表单项:item.isFormField();
    获得表单的name属性值:item.getFieldName();
    获得表单的value值:item.getString("UTF-8") --- UTF-8表示获得中文时的编码
    获得上传文件的名称:item.getName()
    获得上传文件:item.getInputStream();
    删除临时文件:item.delete();
  2. 代码实现
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.List;
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.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.apache.commons.io.IOUtils;

public class FileuploadServlet2 extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        try {
            //1、创建磁盘文件项工厂
            //作用:设置缓存文件的大小  设置临时文件存储的位置
            String path_temp = this.getServletContext().getRealPath("temp");
            //DiskFileItemFactory factory = new DiskFileItemFactory(1024*1024, new File(path_temp));
            DiskFileItemFactory factory = new DiskFileItemFactory();
            factory.setSizeThreshold(1024*1024);
            factory.setRepository(new File(path_temp));
            //2、创建文件上传的核心类
            ServletFileUpload upload = new ServletFileUpload(factory);
            //设置上传文件的名称的编码
            upload.setHeaderEncoding("UTF-8");
            //ServletFileUpload的API
            boolean multipartContent = upload.isMultipartContent(request);//判断表单是否是文件上传的表单
            if(multipartContent){
                //是文件上传的表单
                //***解析request获得文件项集合
                List<FileItem> parseRequest = upload.parseRequest(request);
                if(parseRequest!=null){
                    for(FileItem item : parseRequest){
                        //判断是不是一个普通表单项
                        boolean formField = item.isFormField();
                        if(formField){
                            //username=zhangsan
                            String fieldName = item.getFieldName();
                            String fieldValue = item.getString("UTF-8");//对普通表单项的内容进行编码                     
                            System.out.println(fieldName+"----"+fieldValue);                    
                            //当表单是enctype="multipart/form-data"时 request.getParameter相关的方法
                            //String parameter = request.getParameter("username");                  
                        }else{
                            //文件上传项
                            //文件的名
                            String fileName = item.getName();
                            //获得上传文件的内容
                            InputStream in = item.getInputStream();
                            String path_store = this.getServletContext().getRealPath("upload");
                            OutputStream out = new FileOutputStream(path_store+"/"+fileName);
                            IOUtils.copy(in, out);
                            in.close();
                            out.close();
                            //删除临时文件
                            item.delete();
                        }
                    }
                }
            }else{
                //不是文件上传表单
                //使用原始的表单数据的获得方式 request.getParameter();
            }
        } catch (FileUploadException e) {
            e.printStackTrace();
        }
    }

    public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 173,966评论 25 709
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,099评论 19 139
  • 【晨读感悟第13天】 穷人真正要小心的是心穷 作家杰克•伦敦有个短篇《热爱生命》。一个美国西部的淘金者落了单,在冬...
    在在姐阅读 150评论 0 0
  • 这些天朋友圈都在被江苏湖北支援西部减招本省高考生源的消息刷屏,各个群里忽然冒出来一张张各省市招生比例的表格,朋友圈...
    影秋千阅读 242评论 0 0