文件上传与下载--初入茅庐必先知

上传

  • 提交方式:post
  • 表单enctype 属性:multipart/form-data
  • 上传类型为file
  • 请求头信息:Content-Type multipart/form-data; boundary=
    —————————-99723099725366,
    boundary的值为随机产生的分隔符,会在post的请求体中分割参数
  • post数据体中,文件类型的Content-Disposition:包含一个filename属性

如:

form的post数据提交:
        -----------------------------99723099725366
        Content-Disposition: form-data; name="username"

        kk
        -----------------------------99723099725366
        Content-Disposition: form-data; name="file1"; filename="python安装.txt"
        Content-Type: text/plain

        ÅäÖû·¾³±äÁ¿£º
        E:\software\python2.7.13;E:\software\python2.7.13\Scripts
        °²×°¿â:
        pip install MySQLdb

        pip install bs4
        pip install BeautifulSoup
        pip install lxml
        -----------------------------99723099725366--

当了解了上传的原理后,后台做处理就很明确了:
1.判断请求头Content-Type是否包含multipart/form-data,包含则进行文件处理
2.通过boundary分隔符的值对post提交数据进行处理,即数据分割
3.获取到文件输入流后,即可根据需求设置文件保存路径,进行重命名等处理
4.通过输出流输出文件,结束后关闭输入流、输出流

下载

  • 根据文件名或者文件路径定位文件,具体的策略主要根据自己的需求,总之需要系统能找到的文件全路径。
  • 获取输入流,从目标文件获取输入流。
  • 根据文件路径获取文件输入流,进行文件输出,通过配置response下载文件
  • 设置response属性,包括CharacterEncoding,Content-disposition,Content-Length,注意文件名称会因为浏览器的不同而出现乱码,解决方法如下
if(userAgent.contains("MSIE") ||userAgent.contains("rv:11")){
    fileName = URLEncoder.encode(fileName, "UTF-8");
}else{
    fileName = new String(fileName.getBytes("UTF-8"), "ISO-8859-1");
 }
 fileName为文件名,IE10及以下用MSIE判断,IE11用rv:11判断。

 response.setHeader("Content-disposition",
                String.format("attachment; filename=\"%s\"", fileName)); 
 response.setHeader("Content-Length", String.valueOf(fileLength));
 response.setCharacterEncoding("UTF-8");
 response.setHeader("Content-Length", String.valueOf(fileLength));

不同浏览器下载弹窗不一样,下载的主要的问题是文件名乱码问题。
结语

文件的上传下载基本思路就是这些,稍后章节我会发布具体的上传下载代码,包括基本的servlet上传下载、使用springmvc的MultipartFile进行文件上传示例。

详细java代码:http://download.csdn.net/detail/csdnindex/9874608

你可能感兴趣的:(编程基础)