项目开发记录 August 20, 2018

头像文件上传服务器的功能实现

Words count 7.6k Reading time 7 mins. Read count 0

在此项目中,用户注册时,需要上传头像,这里简单的利用了几个插件,实现了头像上传服务器的功能。前端利用了一个upload的插件,后端引用了Spring 的上传文件的jar包,下面整理贴出了项目中的相关代码:

JSP页面

需要引入js以及css文件:
bootstrap.css
ui.css
form.css
font-awesome.css

引入css

<link rel="stylesheet" type="text/css" href="<%=request.getContextPath()%>/skins/css/bootstrap.css">
<link rel="stylesheet" type="text/css" href="<%=request.getContextPath()%>/skins/css/ui.css">
<link rel="stylesheet" type="text/css" href="<%=request.getContextPath()%>/skins/css/form.css">
<link rel="stylesheet" type="text/css" href="<%=request.getContextPath()%>/skins/css/font-awesome.css">

引入js

jquery.js
form.js

<script type="text/javascript" src="<%=request.getContextPath()%>/skins/js/jquery.js"></script>
    <script type="text/javascript" src="<%=request.getContextPath()%>/skins/js/form.js"></script>

提示:所需的js、css文件以及必要的jar包我会在本文的下面贴出连接

HTML代码

<div class="form-group">
    <label class="col-sm-3 control-label">头像</label>
    <div class="col-sm-8">
        <div class="input-group" style="width: 60%" >
            <input type="text" class="form-control ue-form" name="avatar" id="filelist"  placeholder="选择上传头像">
            <span class="input-group-addon ue-form-btn " id="inputfiles">
            <i class="fa  fa-upload"></i></span>
        </div>
        <div class="progress" style="display:none;margin-top: 10px;width: 60%">
            <div class="progress-bar" id="inputpro">
                <span></span>
            </div>
        </div>
    </div>
</div>

效果图:
enter image description here

js代码

$(function() {
    var uploader = new plupload.Uploader({
        //用来指定上传方式,指定多个上传方式请使用逗号隔开,默认即为此,可不写
        runtimes: 'html5,flash,silverlight,html4',
        //点击上传html标签的id,可以是a,button等
        browse_button: 'inputfiles',
        //服务器端的页面上传地址
        url : context + '/service/uploadImg',
        //文件的最大上传大小,不写该参数则上传文件大小无限制
        max_file_size: '50mb',
        //设置多项选择,默认为true,即可多选文件,功能为单选时需将此设为false
        multi_selection: false,
        //上传的文件生成一个唯一的文件名,默认为false,false时上传文件为本身的名字,true时自动生成其他名字
        unique_names: true,
        //可以使用该参数来限制上传文件的类型,大小等,该参数以对象的形式传入
        filters: [
            {title: "Image files", extensions: "jpg,gif,png"},
            {title: "Zip files", extensions: "zip"}
        ],
        //flash地址,swf文件,当需要使用swf方式进行上传时需要配置该参数
        flash_swf_url: '../../dist/js/Moxie.swf',
        //silverlight文件,当需要使用silverlight方式进行上传时需要配置该参数
        silverlight_xap_url: '../../dist/js/Moxie.xap',
        //当Plupload初始化完成后触发
        init: {
            //当文件添加到上传队列后触发(up为当前的plupload实例对象,files为一个数组,里面的元素为本次添加到上传队列里的文件对象)
            FilesAdded: function(up, files) {
                plupload.each(files, function(file) {
                    document.getElementById('filelist').value += file.name;
                });
                //开始上传队列中的文件
                uploader.start();
            },
            //会在文件上传过程中不断触发,可以用此事件来显示上传进度(up当前的plupload实例对象,file为触发此事件的文件对象)
            UploadProgress: function(up, file) {
                $("#inputpro").parent().show();
                $("#inputpro")[0].style.width = $("#inputpro")[0].innerText = file.percent + "%";
            },
            FileUploaded:function (up,file,responseObject) {
                //将json字符串转换成json对象
                console.log(responseObject);
               var data =  JSON.parse(responseObject.response);
               $("#filelist").val(data.fileName)

            }

        }
    });
//初始化Plupload实例
    uploader.init();
});

注意这个方法FileUploaded,这是一个服务器完成上传后返回的信息,在这里可以调用服务器返回的信息。

到这里前端的东西就写完了,下面贴一下后端的代码。

后端

配置jar包

这里需要用到两个jar包:
commons-fileupload-1.3.3.jar
commons-io-1.4.jar
我这里使用的idea写的项目,所以这两个jar包复制到lib目录下之后,需要把它引进库里。
打开项目结构-在library里将jar添加进去

配置xml文件添加bean

在spring-servlet.xml文件中添加bean,如下图所示:

<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
    <property name="maxUploadSize" value="104857600"/>
    <property name="maxInMemorySize" value="4096"/>
</bean>

controller层

//上传用户头像
@RequestMapping("uploadImg")
@ResponseBody
public Map<String,String> uploadImg(HttpServletRequest request,HttpSession httpSession)throws IllegalStateException,IOException
{
    Map<String,String> map = new HashMap<String,String>();
    long  startTime=System.currentTimeMillis();
    String thisTime = String.valueOf(startTime);
    //获取当前路径
    String thisPath = request.getServletContext().getRealPath("uploadFile");
    System.out.println(thisPath);
    //将当前上下文初始化给  CommonsMutipartResolver (多部分解析器)
    CommonsMultipartResolver multipartResolver=new CommonsMultipartResolver(
            request.getSession().getServletContext());
    //检查form中是否有enctype="multipart/form-data"
    if(multipartResolver.isMultipart(request))
    {
        //将request变成多部分request
        MultipartHttpServletRequest multiRequest=(MultipartHttpServletRequest)request;
        //获取multiRequest 中所有的文件名
        Iterator iter=multiRequest.getFileNames();

        while(iter.hasNext())
        {
            //一次遍历所有文件
            MultipartFile file=multiRequest.getFile(iter.next().toString());
            if(file!=null)
            {
                String path=thisPath+"\\"+thisTime+file.getOriginalFilename();
                //上传
                file.transferTo(new File(path));
                String fileName =thisTime+file.getOriginalFilename();
                String fileUrl = "<%=request.getContextPath()%>/uploadFile/"+fileName;
                map.put("fileName",fileName);
                map.put("fileUrl",fileUrl);
            }
        }

    }
    return map;
}

这里只是做了个简单的上传,上传后得到一个路径还有文件名,然后返回给前端,等用户提交注册之后,将信息一起保存到数据库里。

0%