spring mvc的文件上传之优化

我看了下很多楼主的文章,各有各的特色,但我觉得都不是我所想要的,所以我就自己写了个较完整的demo


我通过ajax+springmvc实现的文件上传 ajax的技术并没有使用自身携带的AjaxFileUpload(个人觉得代码量太多)


用ajax实现,网页里的很多表单数据也想获得怎么办呢 我是这样实现的:

先看我的xxx.jsp页面的实现代码:

<%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Insert title here</title>
<script src="<%=request.getContextPath()%>/js/jquery-3.0.0.min.js" type="text/javascript"></script>
<script type="text/javascript">
function Upload(){
var img=$("#myBlogImage").val();
//判断文件是否为空 我这里是图片的上传 做了个文件后缀筛选 如果是文件相关的上传,把筛选去掉即可,文件大小,后缀的判断最好    //在前台判断,这样可减少服务器的压力
if(img==""){alert("请选择文件内容!");return }
//判断文件后缀
var start=img.lastIndexOf(".");
        var end=img.substring(start+1,img.length).toUpperCase();
    if(!(end=='JPG'||end=='GIF'||end=='PNG'||end=='BMP')){  
        alert('上传图片格式仅限于.jpg .gif .png .bmp');  
    return;  
}

     //封装form标签里的相关数据 传给后台 这样form里所有的表单数据 后台也能获取得到
     var forData=new FormData($("#uploadForm")[0]);

    //通过ajax实现文件上传 async:是否同步请求 ,cache:是否缓存此页面,contentType发送信息至服务器时内容编     //码类型。默认值适 合大多数情况,processData:通过data选项传递进来的数据类型选择;想了解更多,去看看    //$ajax()参数的相关讲解;
     $.ajax({
              url:'upload/toUpload.do',
              type:'POST',
              data:forData,
              async:false,
              cache:false,
              contentType:false,
              processData:false,
              success:function(datas){
                 alert(datas);
               },
               error:function(datas){
                  alert("上传失败");
               }     
        });
}
</script>
</head>
<body>
 <div align="center">
  <form id="uploadForm">
    <p>资源名称:<input type="text" name="name"></p>
    <p>选择文件<input type="file" id="myBlogImage" name="myfiles"/></p>
    <input type="button" value="上传" οnclick="Upload()"/>
  </form>
 </div>
</body>
</html>

以上便是jsp里代码相关的设计

接下来便是controller里的设计编码啦(配置最后讲解)里面的相关注解我就不解释啦 会的,都应该知道什么意思

package com.azj.controllers;
import java.io.File;
import java.io.IOException;
import java.util.Iterator;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;
import org.springframework.web.multipart.commons.CommonsMultipartResolver;
@Controller
@RequestMapping("/upload")
public class uploadController {
@RequestMapping(value="/toUpload",method = RequestMethod.POST)
public void doUpload(@RequestParam("name")String name,HttpServletRequest request,HttpServletResponse response) throws IllegalStateException, IOException{

                //传统的都是通过io流来实现文件的上传,效率肯定是极低的!这里我们是通过springmvc自己及封装的文件                //上传方法;效率,比较快;感兴趣的可以测试下,大文件的上传速度,比较下;

               //获取前端表单属性name传来的数据  并设计文件发存放位置
File fs=new File("D:/"+name);
               if(!fs.exists())fs.mkdir();
//解析前端传过来的上下文
CommonsMultipartResolver cmr=new CommonsMultipartResolver(request.getSession().getServletContext());
//判断是传过来的上下文是否包含文件内容 如果有 执行文件处理及相关上传的操作
try{
if(cmr.isMultipart(request)){
//request强制转换为spring mvc自身携带的MultipartHttpServletRequest 文件处理
MultipartHttpServletRequest mr=(MultipartHttpServletRequest) request;
//迭代包含的文件
Iterator<String> iter=mr.getFileNames();
//获取文件
while(iter.hasNext()){
MultipartFile file = mr.getFile((String)iter.next());
if(file!=null){
String filename="demo"+file.getOriginalFilename();
String path="D:/"+name+"/"+filename;
File f=new File(path);
//传文件
file.transferTo(f);
response.getWriter().println("上传成功");
}
}
}}catch (Exception e) {
response.getWriter().println("上传失败");
}


}
}

以上便是controller里的代码内容

现在说下相关配置

web.xml的内容如下:


<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
  <display-name>spring-mvc</display-name>


   <!-- 配置springMVC启动DispatcherServlete入口 --> 
  <servlet>
    <servlet-name>springmvc</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>classpath*:config/applicationContext-mvc.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>springmvc</servlet-name>
    <url-pattern>*.do</url-pattern>
  </servlet-mapping>
</web-app>


接下来是spring mvc的配置内容:

<?xml version="1.0" encoding="UTF-8"?>  
<beans  
    xmlns="http://www.springframework.org/schema/beans"  
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
    xmlns:tx="http://www.springframework.org/schema/tx"  
    xmlns:context="http://www.springframework.org/schema/context"    
    xmlns:mvc="http://www.springframework.org/schema/mvc"    
    xsi:schemaLocation="http://www.springframework.org/schema/beans   
    http://www.springframework.org/schema/beans/spring-beans-3.2.xsd   
    http://www.springframework.org/schema/tx   
    http://www.springframework.org/schema/tx/spring-tx-3.2.xsd  
    http://www.springframework.org/schema/context  
    http://www.springframework.org/schema/context/spring-context-3.2.xsd  
    http://www.springframework.org/schema/mvc  
    http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd">  
  
    <!-- 自动扫描的包名   这里是你请求的controller类 我用的通配符代替-->  
     <context:component-scan base-package="com.**.controllers"/>
  
    <!-- 默认的注解映射的支持,自动注册DefaultAnnotationHandlerMapping和AnnotationMethodHandlerAdapter -->  
    <mvc:annotation-driven />  
  
    <!-- 视图解释类 -->  
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">  
        <property name="prefix" value="/"/>  
        <property name="suffix" value=".jsp"/>  
        <property name="viewClass" value="org.springframework.web.servlet.view.JstlView" />  
    </bean>
    
    <!-- SpringMVC上传文件时,需配置MultipartResolver处理器   这个判断最好能在前端加个插件进行判断,减少服务器的压力-->  
    <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">  
        <!-- 指定所上传文件的总大小不能超过10485760000......注意maxUploadSize属性的限制不是针对单个文件,而是所有文件的容量之和 -->  
          <property name="defaultEncoding" value="utf-8" />  
          <property name="maxUploadSize" value="10485760000" />  
          <property name="maxInMemorySize" value="40960" />  
    </bean>
   
</beans>

以上面试springmvc上传的代码编码设计!



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ctrl+C+V程序猿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值