1.文件的上传
    [1] 简介
        > 将本地的文件上传到服务器中
        > 用户需要通过一个表单将文件上传到服务器中
 
    [2] 表单的设置
        > 上传文件时需要使用input表单项,input的type时file。
        > 上传文件的表单一定要是post请求。
        > 在表单中还有一个属性:
            enctype,使用它来指定如何处理请求体,它的默认值是application/x-www-form-urlencoded。
            他的意思是请求体会被URL编码,而我们上传文件时上传的是文件流,它是不需要被编码的
        > 在上传文件时enctype属性必须设置为:multipart/form-data
            它表示将我们的表单设置为一个多部件的表单,当表单设置为该值时,那么我们的一个表单项会作为一个部件,发送到服务器。
                当使用多部件表达式,请求体会使用类似这样的-----------------------------7e01ce2921096c分割符来分割。
        > 当表单设置为多部件表单以后,我们的request.getParameter()就废了。       
 
    [3] FileUpload
        > commons-fileupload
        > commons-fileupload是Apache出的一款专门用来处理文件上传的工具,
            使用它可以自动去解析多部件表单。
        > commons-fileupload依赖于commons-io
        > 使用它需要导入两个jar包:
            commons-fileupload-1.3.1.jar
            commons-io-1.4.jar
        > 核心类:
            DiskFileItemFactory
                - 工厂类,用来构建解析器
            ServletFileUpload
                - 解析器类,用来解析请求报文
            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.获取工厂类实例
            2.获取解析器类实例
            3.解析请求报文获取FileItem对象
 
    [4] 细节
        >  部分浏览器在上传文件时,文件名使用的是文件的绝对路径。
            而在保存文件时,使用绝对路径会出现问题,文件不能正常写入到服务器中。
        > 所以这种情况我们需要做一些处理:
            C:\asd\zxc\Desktop\qwe\ert\rrrr.jpg
            所以这种文件名,我们需要对它进行截取字符串的操作,从最后一个\以前的内容全都不要
 
        > 当我们上传文件时,很有可能多个用户上传同名文件,这样会导致后上传的文件覆盖旧文件,
            我们可以为图片添加一个唯一的标识作为前缀:唯一标识_rrrr.jpg。
            这里我们的唯一标识使用UUID
 
        > 文件大小的限制
            - 限制文件大小的操作,都是通过解析器对象ServletFileUpload来进行
            1.单个文件大小的限制
                - 限制文件大小为60kb
                    fileUpload.setFileSizeMax(1024*60);
                - 当上传的文件超过限制,程序会抛出异常:
                    FileSizeLimitExceededException
                - 我们可以对该异常进行捕获,然后显示一个错误消息   
 
            2.文件总大小的限制
                - 限制文件总大小为150KB
                    fileUpload.setSizeMax(1024*150);
                - 当上传文件的总大小超标是,会抛出如下异常:
                    SizeLimitExceededException
                - 我们可以对该异常进行捕获,然后显示一个错误消息   
 
2.文件的下载
    [1] 简介
        > 将服务器中的文件下载到本地
        > 下载文件很简单,直接把文件放到服务器中,然后为浏览器提供一个超链接即可,
            但是如果浏览器支持当前文件格式,浏览器会自动打开文件,不会直接下载。
        > 如果将文件直接放到服务器中,当用户下载文件时不会有任何的限制,不能去检查用户的权限。
            所以一般我们下载时我们将文件放到WEB-INF文件夹下,让用户通过访问一个Servlet来进行下载。
 
    [2] 下载所需要的内容
            1.获取到文件的流
            2.设置两个响应头
 
    [3] 下载相关的两个响应头
        1) 文件类型 Content-Type --> 文件的MIME类型   
            - 下载的文件的类型,需要设置一个MIME值
            - 文件的MIME类型可以通过总的web.xml进行查询
            - 我们也可以通过ServletContext的getMimeType()方法来获取文件的MIME类型
 
        2) 下载文件的信息 Content-Disposition --> attachment; filename=文件名
            - Content-Disposition这个头用来告诉浏览器如何处理文件
            - 值 attachment; filename=文件名,这个值就是告诉浏览器我发给你的是一个附件,请你下载
                filename用来指定文件的名字。
 
        3) 中文乱码问题:
            > 在响应头中不能直接设置中文,如果非得设置,必须对文件名进行url编码。
                fileName = URLEncoder.encode(fileName, "utf-8");
                大部分浏览器可以采用以上方式
            > 但是FireFox它是使用Base64进行的编码,所以如果是火狐,使用上述方式,依然不好使。
                火狐的编码方式:fileName = "=?utf-8?b?"+new BASE64Encoder().encode(fileName.getBytes())+"?=";
            > 但是火狐的方式IE又不支持了,如果我们需要同时兼容这两款浏览器,在设置编码是必须做一个判断,
                如果是IE浏览器,则使用 fileName = URLEncoder.encode(fileName, "utf-8");
                    如果是Firefox,则使用 fileName = "=?utf-8?b?"+new BASE64Encoder().encode(fileName.getBytes())+"?=";
            > 我们可以通过User-Agent的请求头,来判断浏览器的版本,如果头中包含Firefox,则表示他是火狐。
            > 事例代码:
                //判断浏览器是否是火狐
                if(ua.contains("Firefox")){
                    //如果是火狐浏览器
                    fileName = "=?utf-8?b?"+new BASE64Encoder().encode(fileName.getBytes())+"?=";
                }else{
                    //其他浏览器
                    //对文件名进行编码
                    //encode()需要两个参数,第一个被编码的字符串,第二个是使用的字符集
                    fileName = URLEncoder.encode(fileName, "utf-8");
                }
 
            > 还有一种方式,不太讲理,谁问跟谁急
            > 先是用gbk为文件名进行编码,再使用iso-8859-1进行解码
                fileName = new String(fileName.getBytes("gbk"), "iso-8859-1");
            > 这种方式虽然简单,但是有一些个别的字符会出问题。   
 
 
3.国际化(I18N)
    [1]国际化简介
        > 国际化主要指我们的应用对不同国家和地区的语言的支持。
        > 国际化主要指支持英文。
 
    [2]核心类
        ResourceBundle
            - 负责管理国际化资源文件,根据不同的国家和地区的信息去加载不同的国际化资源文件
 
        Locale
            - locale负责表示国家地区和语言的信息
 
    [3]国际化的原理
        国际化资源文件:   
            > 国际化资源文件实际上就是一个properties文件,它配置的都是一些键值对结构
            > 国际化资源文件要求必须放到类路径下(src)
            > 命名规则:基础名_语言_国家.properties
 
        ResourceBundle会根据不同Locale信息,去加载不同的国际化资源文件,从而达到国际化的目的。
 
 
 
 
    [4]格式化标签库
        > 还可以使用JSTL中fmt标签来完成国际化的操作。
        > 导入fmt标签:
            <%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>   
        > 常用标签
            <fmt:setBundle basename="基础名"/>
            <fmt:message key="属性名" />
            <fmt:setLocale value="zh_CN"/>
            <fmt:formatDate value="<%=new Date() %>" type="both" dateStyle="full" timeStyle="full"/>
                value属性:是被格式化的日期
                type属性:日期的类型,date只显示日期,time只显示时间,both全都显示
                dateStyle和timeStyle属性:用来设置日期和时间的风格
                    可选值:full long medium short
        > 占位符:
            在国际化资源文件中可以指定带占位符的信息,占位符从0开始,形式如下:
                WELCOME {0} TO OUR SITE, TODAY IS {1}
            在页面中使用带占位符的消息,需要在message标签中插入param子标签,
                param子标签用来指定替换站位符的内容,
                    第一个param会替换所有的{0}
                    第二个会替换所有的{1}
                    以此类推
            例子:
                <fmt:message key="info">
                    <fmt:param>
                        <span style="color: red;">大师兄</span>
                    </fmt:param>
                    <fmt:param>
                        <span style="color: red;"><fmt:formatDate value="<%=new Date() %>" type="both" dateStyle="full" timeStyle="full"/></span>
                    </fmt:param>
                </fmt:message>
 

转载请注明出处!

http://www.cnblogs.com/libingbin/

感谢您的阅读。如果文章对您有用,那么请轻轻点个赞,以资鼓励。

文件的上传(如何兼容火狐与IE)与国际化的原理的更多相关文章

  1. jquery uploadify上传插件兼容火狐问题

    jquery uploadify长传插件兼容火狐问题.因为现在火狐以不在默认安装flash插件.所以uploadify的flash版就需要安装flash插件.还可以成功. 可以到哪里下载安装:http ...

  2. 赞!带进度条的 jQuery 文件拖放上传插件

    jQuery File Uploader 是一个 jQuery 文件拖放上传插件,包括 Ajax 上传和进度条效果.作者编写这个插件的想法是要保持它非常简单,不像其他的插件,很多的标记,并提供一些 H ...

  3. 文件正在上传的转圈圈gif图片引出的fixed定位和absolute定位

     文件正在上传的转圈圈gif图片  一.文件上传时,未上传返回成功状态之前给个gif动态图片显示在页面,改善用户体验. <!--S 遮罩层 --> <div id="mas ...

  4. SpringMVC+SwfUpload进行多文件同时上传

    由于最近项目需要做一个多文件同时上传的功能,所以好好的看了一下各种上传工具,感觉uploadify和SwfUpload的功能都比较强大,并且使用起来也很方便.SWFUpload是一个flash和js相 ...

  5. Struts2基础学习(六)—文件的上传和下载

    一.文件的上传 1.单个文件上传      Struts2使用拦截器完成了文件的上传,而且底层使用的也是FileUpload开源组件. 客户端注意事项: (1)method="post&qu ...

  6. html5 实现 文件夹上传

    先插个背景:最近所在项目有个小需求,就是上传文件要可以同时选择文件夹及文件,然后把文件夹内得文件及所选单文件全部选择上传,借助于搜索关键词没搜到想要的结果(相关文章貌似很好,要么就是遍历文件夹内的文件 ...

  7. 使用springmvc进行文件的上传和下载

    文件的上传 SpringMVC支持文件上传组件,commons-fileupload,commons-fileupload依赖commons-io组件 配置步骤说明 第一步:导入包 commons-f ...

  8. plupload 大文件分片上传与PHP分片合并探索

    最近老大分给我了做一个电影cms系统,其中涉及到一个功能,使用七牛云的文件上传功能.七牛javascript skd,使用起来很方便,屏蔽了许多的技术细节.如果只满足与调用sdk,那么可能工作中也就没 ...

  9. 文件的上传和下载--SpringMVC

    文件的上传和下载是项目开发中最常用的功能,例如图片的上传和下载.邮件附件的上传和下载等. 接下来,将对Spring MVC环境中文件的上传和下载进行详细的讲解. 一.文件上传 多数文件上传都是通过表单 ...

随机推荐

  1. Objective-C中的继承和多态

    面向对象编程之所以成为主流的编程思想和他的继承和多态是分不开的,只要是面向对象语言都支持继承和多态,当然不同的OOP语言之间都有其特点.OC中和Java类似,不支持多重继承,但OOP语言C++就支持多 ...

  2. 【经验之谈】Windows环境下配置WordPress

    前言 wordpress全球著名的开放博客平台,拥有成千上万个各式插件和不计其数的主题模板样式,使用php和mysql搭建,下面说下载windows环境下配置wordpress,经验之谈. 安装 关于 ...

  3. NPM使用前设置和升级

    升级版本npm3和切换模块数据源为taobao,大大提高下载速度. 步骤一:升级npm3默认npm为2.x推荐使用npm3. npm i -g npm@3 步骤二:修改npm数据源为taobao(默认 ...

  4. 1Z0-053 争议题目解析698

    1Z0-053 争议题目解析698 考试科目:1Z0-053 题库版本:V13.02 题库中原题为: 698.In your production database, you: -Are using ...

  5. js制作点击会自动隐藏的导航栏(固定在在头部的)

    想必大家应该见过这样的特效,本来头部是固定在网页的最上方的,点一下缩进去,再点一下 又可以缩回来,这种效果怎么实现的呢,我今天就做了一个.菜鸟勿喷. @charset "utf-8" ...

  6. java删除文件夹

    想删除本地一个项目目录,结果windows说路径太长,不能删除.于是试了试java删除.一切ok.以后一定要抓紧时间学python. /** * Created by rmiao on 4/21/20 ...

  7. 使用、支持、帮助Moon.Orm

    1.关于Moon.Orm的说明 1)任何人和组织都可以免费使用该框架;(赞助者提供长期的技术咨询)  微信微信: 2)5.0之前已经全部开源; 3)5.0标准版本目前对参与者开源(看看下面很简单的), ...

  8. VS2015+cordova+ionic安装配置

    VS2015已经出了正式版,想用来试一下cordova方面的开发.最近在看ionic这个框架,于是想能在VS2015里编辑js就好了. 下面说一下蛋疼的安装配置过程. 一.安装VS2015及Andro ...

  9. 基于Metronic的Bootstrap开发框架经验总结(12)--页面链接收藏夹功能的实现

    在一个系统里面,往往有很多菜单项目,每个菜单项对应一个页面,一般用户只需要用到一些常用的功能,如果每次都需要去各个层次的菜单里面去找对应的功能,那确实有点繁琐.特别是在菜单繁多,而客户又对系统整体不熟 ...

  10. EF架构~EF异步改造之路~仓储接口的改造

    回到目录 返回异步与并行目录 C#5.0带来了并行编程 {C#1.0托管代码→C#2.0泛型→C#3.0LINQ→C#4.0动态语言→C#5.0异步编程} 随着C#5.0在.net4.5出来之后,它们 ...