文件上传/下载的几种写法(java后端)

 

文件上传

1、框架已经帮你获取到文件对象File了

    public boolean uploadFileToLocale(File uploadFile,String filePath) {
        boolean ret_bl = false;
        try {
            InputStream in = new FileInputStream(uploadFile);
            ret_bl=copyFile(in,filePath);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return ret_bl;
    }    
    
    public  boolean copyFile(InputStream in,String filePath) {
        boolean ret_bl = false;
        FileOutputStream os=null;
        try {
            os = new FileOutputStream(filePath,false);
            byte[] b = new byte[8 * 1024];
            int length = 0;
            while ((length = in.read(b)) > 0) {
                os.write(b, 0, length);
            }
            os.close();
            in.close();
            ret_bl = true;
        } catch (Exception e) {
            e.printStackTrace();
        }finally{     
                try {
                    if(os!=null){
                        os.close();
                    }
                    if(in!=null){
                        in.close();
                    }
                    
                } catch (IOException e) {
                    e.printStackTrace();
                }
            
            
        }
        return ret_bl;
    }

}

2、天了个撸,SB架构师根本就飘在天空没下来,根本就没想文件上传这一回事

public String uploadByHttp(HttpServletRequest request) throws Exception{
        String filePath=null;
        List<String> fileNames = new ArrayList<>();
        //创建一个通用的多部分解析器 
        CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver(request.getSession().getServletContext());  
            //判断 request 是否有文件上传,即多部分请求  
            if(multipartResolver.isMultipart(request)){
                //转换成多部分request    
                MultipartHttpServletRequest multiRequest =multipartResolver.resolveMultipart(request);  
                MultiValueMap<String,MultipartFile> multiFileMap = multiRequest.getMultiFileMap();
                List<MultipartFile> fileSet = new LinkedList<>();
                for(Entry<String, List<MultipartFile>> temp : multiFileMap.entrySet()){
                    fileSet = temp.getValue();
                }
                String rootPath=System.getProperty("user.dir");
                for(MultipartFile temp : fileSet){
                    filePath=rootPath+"/tem/"+temp.getOriginalFilename();
                    File file = new File(filePath);
                    if(!file.exists()){
                        file.mkdirs();
                    }
                    fileNames.add(temp.getOriginalFilename());
                    temp.transferTo(file);
                }
            }
            
    }

3、神啊,我正在撸框架,请问HttpServletRequest怎么获取!!!!

(1)在web.xml中配置一个监听

<listener>
        <listener-class>
            org.springframework.web.context.request.RequestContextListener
        </listener-class>
    </listener>

(2)HttpServletRequest request = ((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getRequest();

文件下载(直接用链接下载的不算),这比较简单

1、本地文件下载(即文件保存在本地)

public void fileDownLoad(HttpServletRequest request,HttpServletResponse response,String fileName,String filePath) throws Exception {
        response.setCharacterEncoding("UTF-8");
        //设置ContentType字段值
        response.setContentType("text/html;charset=utf-8");
        //通知浏览器以下载的方式打开
        response.addHeader("Content-type", "appllication/octet-stream");
        response.addHeader("Content-Disposition", "attachment;filename="+fileName);
        //通知文件流读取文件
        InputStream in = request.getServletContext().getResourceAsStream(filePath);
        //获取response对象的输出流
        OutputStream out = response.getOutputStream();
        byte[] buffer = new byte[1024];
        int len;
        //循环取出流中的数据
        while((len = in.read(buffer)) != -1){
            out.write(buffer,0,len);
        }
    }

2、远程文件下载(即网上资源下载,只知道文件URI)

public static void  downLoadFromUrl(String urlStr,String fileName,HttpServletResponse response){  
         try {
                 urlStr=urlStr.replaceAll("\\\\", "/");  
                URL url = new URL(urlStr);    
                HttpURLConnection conn = (HttpURLConnection)url.openConnection();    
                //设置超时间为3秒  
                conn.setConnectTimeout(3*1000);  
                //防止屏蔽程序抓取而返回403错误  
                conn.setRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt)");  
              
                //得到输入流  
                InputStream inputStream = conn.getInputStream();    
               
                response.reset();
                response.setContentType("application/octet-stream; charset=utf-8");
          response.setHeader("Content-Disposition", "attachment; filename=" + new String(fileName.getBytes("GBK"),"ISO8859_1"));
                //获取响应报文输出流对象  
               //获取response对象的输出流
              OutputStream out = response.getOutputStream();
              byte[] buffer = new byte[1024];
              int len;
              //循环取出流中的数据
             while((len = in.read(buffer)) != -1){
                    out.write(buffer,0,len);
              }
        } catch (Exception e) {
            e.printStackTrace();
        } 
      
    }

Java的、协议和平台都独立的服务器端组件,使用请求/响应的模式,提供了一个基于 Java 的服务器解决方案。本文将从文件传输的基本原理入手,分析如何用 java进行文件的上传,并提出解决方案。 一、基本原理 通过 HTML 上载文件的基本流程如下图所示。浏览器端提供了供用户选择提交内容的界面(通常是一个表单),在用户提交请求后,将文件数据和其他表单信息编码并上传至服务器端,服务器端(通常是一个 cgi 程序)将上传的内容进行解 码了,提取出 HTML 表单中的信息,将文件数据存入磁盘或数据库。 -------------------------------------------------------------------------------- 回页首 二、各过程详解 A)填表单并提交 通过表单提交数据的方法有两种,一种是 GET 方法,另一种是 POST 方法,前者通常用于提交少量的数据,而在上传文件或大量数据时,应该选用 POST 方法。在 HTML 代码中,在 <form> 标签中添加以下代码可以页面上显示一个选择文件的控件。 <input type="file" name="file01"> 在页面中显示如下(可能随浏览器不同而不同) 可以直接在文本框中输入文件名,也可以点击按钮后弹出供用户选择文件的对话框。 B)浏览器编码 在向服务器端提交请求时,浏览器需要将大量的数据一同提交给 Server 端, 而提交前,浏览器需要按照 Server 端可以识别的方式进行编码,对于普通的表单数据,这种编码方式很简单,编码后的结果通常是 field1=value2&field2=value2&… 的形式,如 name=aaaa&Submit=Submit。这种编码的具体规则可以在 rfc2231 里查到, 通常使用的表单也是采用这种方式编码的,Servlet 的 API 提供了对这种 编码方式解码的支持,只需要调用 ServletRequest 类中的方法就可以得到 用户表单中的字段和数据。 这种编码方式( application/x-www-form-urlencoded )虽然简单,但对于传输大块的二进制数据显得力不从心,对于传输这类数据,浏览器采用了另一种编码方式,即 "multipart/form-data" 的编码方式,采用这种方式,浏览器可以很容易的表单内的数据和文件一起。这种编码方式先定义好一个不可能在数据中出现的字符串作为分界符,然后用它将各个数据段分开,而对于每个数据段都对应着 HTML 页面表单中的一个 Input 区,包括一个 content-disposition 属性,说明了这个数据段的一些信息,如果这个数据段的内容是一个文件,还会有 Content-Type 属性,然后就是数据本身。 这里,我们可以编一个简单的 Servlet 来看到浏览器到底是怎样编码的。 实现流程: 重载 HttpServlet 中的 doPost 方法 调用 request.getContentLength() 得到 Content-Length ,并定义一个与 Content-Length 大小相等的字节数组 buffer 。 从HttpServletRequest 的实例 request 中得到一个 InputStream, 并把它读入 buffer 中。 使用 FileOutputStream 将 buffer 入指定文件。 代码清单 // ReceiveServlet.java import java.io.*; import javax.servlet.*; import javax.servlet.http.*; //示例程序:记录下Form提交上来的数据,并存储到Log文件中 public class ReceiveServlet extends HttpServlet { public void doPost(HttpServletRequest request,HttpServletResponse response) throws IOException, ServletException { //1 int len = request.getContentLength(); byte buffer[] = new byte[len]; //2 InputStream in = request.getInputStream(); int total = 0; int once = 0;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值