`

SpringMVC:上传与下载

阅读更多
参照了网上相关代码
注意事项:
1 springmvc.xml必须配置:
Java代码 复制代码 收藏代码
  1. <bean id="multipartResolver"  
  2.         class="org.springframework.web.multipart.commons.CommonsMultipartResolver" p:defaultEncoding="utf-8"/>         
<bean id="multipartResolver"
		class="org.springframework.web.multipart.commons.CommonsMultipartResolver" p:defaultEncoding="utf-8"/>		

2 WEB-INF/lib下必加入:commons-fileupload.jar与commons-io-1.4.jar二个文件
3 表单属性为: enctype="multipart/form-data"
工程项目图片如下:

具体代码如下:
FileUploadBean.java
Java代码 复制代码 收藏代码
  1. public class FileUploadBean {      
  2.     private byte[] file;   
  3.   
  4.     public void setFile(byte[] file) {   
  5.         this.file = file;   
  6.     }   
  7.   
  8.     public byte[] getFile() {   
  9.         return file;   
  10.     }   
  11. }  
public class FileUploadBean {	
	private byte[] file;

	public void setFile(byte[] file) {
		this.file = file;
	}

	public byte[] getFile() {
		return file;
	}
}

Java代码 复制代码 收藏代码
  1. package net.liuzd.web;   
  2.   
  3. import java.io.BufferedInputStream;   
  4. import java.io.BufferedOutputStream;   
  5. import java.io.File;   
  6. import java.io.FileInputStream;   
  7. import java.io.IOException;   
  8. import java.net.BindException;   
  9. import java.util.ArrayList;   
  10.   
  11. import java.util.List;   
  12. import java.util.Map;   
  13.   
  14. import javax.servlet.http.HttpServletRequest;   
  15. import javax.servlet.http.HttpServletResponse;   
  16.   
  17. import org.springframework.stereotype.Controller;   
  18. import org.springframework.util.FileCopyUtils;   
  19. import org.springframework.web.bind.annotation.PathVariable;   
  20. import org.springframework.web.bind.annotation.RequestMapping;   
  21. import org.springframework.web.bind.annotation.RequestMethod;   
  22. import org.springframework.web.bind.annotation.RequestParam;   
  23. import org.springframework.web.multipart.MultipartFile;   
  24. import org.springframework.web.multipart.MultipartHttpServletRequest;   
  25. import org.springframework.web.multipart.commons.CommonsMultipartFile;   
  26. import org.springframework.web.servlet.ModelAndView;   
  27.   
  28. /**  
  29.  * Title: Description: Copyright: Copyright (c) 2011  
  30.  * Company:http://liuzidong.iteye.com/ Makedate:2011-5-27 下午01:52:17  
  31.  *   
  32.  * @author liuzidong  
  33.  * @version 1.0  
  34.  * @since 1.0  
  35.  *   
  36.  */  
  37. @Controller  
  38. public class FileUploadController {   
  39.   
  40.     @RequestMapping(value = "/upload", method = RequestMethod.POST)   
  41.     public ModelAndView onSubmit(HttpServletRequest request,   
  42.             HttpServletResponse response, BindException errors)   
  43.             throws Exception {   
  44.   
  45.         MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;   
  46.         CommonsMultipartFile file = (CommonsMultipartFile) multipartRequest   
  47.                 .getFile("file");   
  48.   
  49.         String name = multipartRequest.getParameter("name");   
  50.         System.out.println("name: " + name);   
  51.         // 获得文件名:   
  52.         String realFileName = file.getOriginalFilename();   
  53.         System.out.println("获得文件名:" + realFileName);   
  54.         // 获取路径   
  55.         String ctxPath = request.getSession().getServletContext().getRealPath(   
  56.                 "/")   
  57.                 + "images/";   
  58.         // 创建文件   
  59.         File dirPath = new File(ctxPath);   
  60.         if (!dirPath.exists()) {   
  61.             dirPath.mkdir();   
  62.         }   
  63.         File uploadFile = new File(ctxPath + realFileName);   
  64.         FileCopyUtils.copy(file.getBytes(), uploadFile);   
  65.         request.setAttribute("files", loadFiles(request));   
  66.         return new ModelAndView("success");   
  67.     }   
  68.   
  69.     @RequestMapping(value = "/upload2", method = RequestMethod.POST)   
  70.     public ModelAndView onSubmit2(HttpServletRequest request,   
  71.             HttpServletResponse response, BindException errors)   
  72.             throws Exception {   
  73.   
  74.         // 转型为MultipartHttpRequest   
  75.         MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;   
  76.         // 根据前台的name名称得到上传的文件   
  77.         MultipartFile file = multipartRequest.getFile("file");   
  78.         // 获得文件名:   
  79.         String realFileName = file.getOriginalFilename();   
  80.         // 获取路径   
  81.         String ctxPath = request.getSession().getServletContext().getRealPath(   
  82.                 "/")   
  83.                 + "\\" + "images\\";   
  84.         // 创建文件   
  85.         File dirPath = new File(ctxPath);   
  86.         if (!dirPath.exists()) {   
  87.             dirPath.mkdir();   
  88.         }   
  89.         File uploadFile = new File(ctxPath + realFileName);   
  90.         FileCopyUtils.copy(file.getBytes(), uploadFile);   
  91.         request.setAttribute("files", loadFiles(request));   
  92.         return new ModelAndView("success");   
  93.     }   
  94.   
  95.     @RequestMapping(value = "/upload3", method = RequestMethod.POST)   
  96.     public String upload(@RequestParam("file")   
  97.     MultipartFile image, HttpServletRequest request) throws IOException {   
  98.   
  99.         String ctxPath = request.getSession().getServletContext().getRealPath(   
  100.                 "/")   
  101.                 + "\\" + "images\\";   
  102.         System.out.println("路径:" + ctxPath);   
  103.         File file = new File(ctxPath + "/" + image.getOriginalFilename());   
  104.         // FileCopyUtils.copy(image.getBytes(),new   
  105.         // File(ctxPath+"/"+image.getOriginalFilename()));   
  106.         try {   
  107.             image.transferTo(file); // 保存上传的文件   
  108.         } catch (IllegalStateException e) {   
  109.             e.printStackTrace();   
  110.         } catch (IOException e) {   
  111.             e.printStackTrace();   
  112.         }   
  113.         request.setAttribute("files", loadFiles(request));   
  114.         return "success";   
  115.     }   
  116.   
  117.     // 多文件上传   
  118.     @RequestMapping(value = "/upload4", method = RequestMethod.POST)   
  119.     public ModelAndView fileUpload(HttpServletRequest request,   
  120.             HttpServletResponse response, BindException errors)   
  121.             throws Exception {   
  122.   
  123.         MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;   
  124.         Map<String, MultipartFile> fileMap = multipartRequest.getFileMap();   
  125.         String ctxPath = request.getSession().getServletContext().getRealPath(   
  126.                 "/")   
  127.                 + "\\" + "images\\";   
  128.   
  129.         File file = new File(ctxPath);   
  130.         if (!file.exists()) {   
  131.             file.mkdir();   
  132.         }   
  133.         String fileName = null;   
  134.         for (Map.Entry<String, MultipartFile> entity : fileMap.entrySet()) {   
  135.             // 上传文件名   
  136.             // System.out.println("key: " + entity.getKey());   
  137.             MultipartFile mf = entity.getValue();   
  138.             fileName = mf.getOriginalFilename();   
  139.             File uploadFile = new File(ctxPath + fileName);   
  140.             FileCopyUtils.copy(mf.getBytes(), uploadFile);   
  141.         }   
  142.         request.setAttribute("files", loadFiles(request));   
  143.         return new ModelAndView("success");   
  144.     }   
  145.   
  146.     // @ModelAttribute("files")//此属性用于初始类时调用,但上传文件后不能时时反应上传文件个数,不适合动态数据   
  147.     public List<String> loadFiles(HttpServletRequest request) {   
  148.         List<String> files = new ArrayList<String>();   
  149.         String ctxPath = request.getSession().getServletContext().getRealPath(   
  150.                 "/")   
  151.                 + "\\" + "images\\";   
  152.         File file = new File(ctxPath);   
  153.         if (file.exists()) {   
  154.             File[] fs = file.listFiles();   
  155.             String fname = null;   
  156.             for (File f : fs) {   
  157.                 fname = f.getName();   
  158.                 if (f.isFile()) {   
  159.                     files.add(fname);   
  160.                 }   
  161.             }   
  162.         }   
  163.         return files;   
  164.     }   
  165.   
  166.     @RequestMapping("/download/{fileName}")   
  167.     public ModelAndView download(@PathVariable("fileName")   
  168.     String fileName, HttpServletRequest request, HttpServletResponse response)   
  169.             throws Exception {   
  170.   
  171.         response.setContentType("text/html;charset=utf-8");   
  172.         request.setCharacterEncoding("UTF-8");   
  173.         java.io.BufferedInputStream bis = null;   
  174.         java.io.BufferedOutputStream bos = null;   
  175.   
  176.         String ctxPath = request.getSession().getServletContext().getRealPath(   
  177.                 "/")   
  178.                 + "\\" + "images\\";   
  179.         String downLoadPath = ctxPath + fileName;   
  180.         System.out.println(downLoadPath);   
  181.         try {   
  182.             long fileLength = new File(downLoadPath).length();   
  183.             response.setContentType("application/x-msdownload;");   
  184.             response.setHeader("Content-disposition""attachment; filename="  
  185.                     + new String(fileName.getBytes("utf-8"), "ISO8859-1"));   
  186.             response.setHeader("Content-Length", String.valueOf(fileLength));   
  187.             bis = new BufferedInputStream(new FileInputStream(downLoadPath));   
  188.             bos = new BufferedOutputStream(response.getOutputStream());   
  189.             byte[] buff = new byte[2048];   
  190.             int bytesRead;   
  191.             while (-1 != (bytesRead = bis.read(buff, 0, buff.length))) {   
  192.                 bos.write(buff, 0, bytesRead);   
  193.             }   
  194.         } catch (Exception e) {   
  195.             e.printStackTrace();   
  196.         } finally {   
  197.             if (bis != null)   
  198.                 bis.close();   
  199.             if (bos != null)   
  200.                 bos.close();   
  201.         }   
  202.         return null;   
  203.     }   
  204. }  
package net.liuzd.web;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.net.BindException;
import java.util.ArrayList;

import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.stereotype.Controller;
import org.springframework.util.FileCopyUtils;
import org.springframework.web.bind.annotation.PathVariable;
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.CommonsMultipartFile;
import org.springframework.web.servlet.ModelAndView;

/**
 * Title: Description: Copyright: Copyright (c) 2011
 * Company:http://liuzidong.iteye.com/ Makedate:2011-5-27 下午01:52:17
 * 
 * @author liuzidong
 * @version 1.0
 * @since 1.0
 * 
 */
@Controller
public class FileUploadController {

	@RequestMapping(value = "/upload", method = RequestMethod.POST)
	public ModelAndView onSubmit(HttpServletRequest request,
			HttpServletResponse response, BindException errors)
			throws Exception {

		MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
		CommonsMultipartFile file = (CommonsMultipartFile) multipartRequest
				.getFile("file");

		String name = multipartRequest.getParameter("name");
		System.out.println("name: " + name);
		// 获得文件名:
		String realFileName = file.getOriginalFilename();
		System.out.println("获得文件名:" + realFileName);
		// 获取路径
		String ctxPath = request.getSession().getServletContext().getRealPath(
				"/")
				+ "images/";
		// 创建文件
		File dirPath = new File(ctxPath);
		if (!dirPath.exists()) {
			dirPath.mkdir();
		}
		File uploadFile = new File(ctxPath + realFileName);
		FileCopyUtils.copy(file.getBytes(), uploadFile);
		request.setAttribute("files", loadFiles(request));
		return new ModelAndView("success");
	}

	@RequestMapping(value = "/upload2", method = RequestMethod.POST)
	public ModelAndView onSubmit2(HttpServletRequest request,
			HttpServletResponse response, BindException errors)
			throws Exception {

		// 转型为MultipartHttpRequest
		MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
		// 根据前台的name名称得到上传的文件
		MultipartFile file = multipartRequest.getFile("file");
		// 获得文件名:
		String realFileName = file.getOriginalFilename();
		// 获取路径
		String ctxPath = request.getSession().getServletContext().getRealPath(
				"/")
				+ "\\" + "images\\";
		// 创建文件
		File dirPath = new File(ctxPath);
		if (!dirPath.exists()) {
			dirPath.mkdir();
		}
		File uploadFile = new File(ctxPath + realFileName);
		FileCopyUtils.copy(file.getBytes(), uploadFile);
		request.setAttribute("files", loadFiles(request));
		return new ModelAndView("success");
	}

	@RequestMapping(value = "/upload3", method = RequestMethod.POST)
	public String upload(@RequestParam("file")
	MultipartFile image, HttpServletRequest request) throws IOException {

		String ctxPath = request.getSession().getServletContext().getRealPath(
				"/")
				+ "\\" + "images\\";
		System.out.println("路径:" + ctxPath);
		File file = new File(ctxPath + "/" + image.getOriginalFilename());
		// FileCopyUtils.copy(image.getBytes(),new
		// File(ctxPath+"/"+image.getOriginalFilename()));
		try {
			image.transferTo(file); // 保存上传的文件
		} catch (IllegalStateException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		request.setAttribute("files", loadFiles(request));
		return "success";
	}

	// 多文件上传
	@RequestMapping(value = "/upload4", method = RequestMethod.POST)
	public ModelAndView fileUpload(HttpServletRequest request,
			HttpServletResponse response, BindException errors)
			throws Exception {

		MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
		Map<String, MultipartFile> fileMap = multipartRequest.getFileMap();
		String ctxPath = request.getSession().getServletContext().getRealPath(
				"/")
				+ "\\" + "images\\";

		File file = new File(ctxPath);
		if (!file.exists()) {
			file.mkdir();
		}
		String fileName = null;
		for (Map.Entry<String, MultipartFile> entity : fileMap.entrySet()) {
			// 上传文件名
			// System.out.println("key: " + entity.getKey());
			MultipartFile mf = entity.getValue();
			fileName = mf.getOriginalFilename();
			File uploadFile = new File(ctxPath + fileName);
			FileCopyUtils.copy(mf.getBytes(), uploadFile);
		}
		request.setAttribute("files", loadFiles(request));
		return new ModelAndView("success");
	}

	// @ModelAttribute("files")//此属性用于初始类时调用,但上传文件后不能时时反应上传文件个数,不适合动态数据
	public List<String> loadFiles(HttpServletRequest request) {
		List<String> files = new ArrayList<String>();
		String ctxPath = request.getSession().getServletContext().getRealPath(
				"/")
				+ "\\" + "images\\";
		File file = new File(ctxPath);
		if (file.exists()) {
			File[] fs = file.listFiles();
			String fname = null;
			for (File f : fs) {
				fname = f.getName();
				if (f.isFile()) {
					files.add(fname);
				}
			}
		}
		return files;
	}

	@RequestMapping("/download/{fileName}")
	public ModelAndView download(@PathVariable("fileName")
	String fileName, HttpServletRequest request, HttpServletResponse response)
			throws Exception {

		response.setContentType("text/html;charset=utf-8");
		request.setCharacterEncoding("UTF-8");
		java.io.BufferedInputStream bis = null;
		java.io.BufferedOutputStream bos = null;

		String ctxPath = request.getSession().getServletContext().getRealPath(
				"/")
				+ "\\" + "images\\";
		String downLoadPath = ctxPath + fileName;
		System.out.println(downLoadPath);
		try {
			long fileLength = new File(downLoadPath).length();
			response.setContentType("application/x-msdownload;");
			response.setHeader("Content-disposition", "attachment; filename="
					+ new String(fileName.getBytes("utf-8"), "ISO8859-1"));
			response.setHeader("Content-Length", String.valueOf(fileLength));
			bis = new BufferedInputStream(new FileInputStream(downLoadPath));
			bos = new BufferedOutputStream(response.getOutputStream());
			byte[] buff = new byte[2048];
			int bytesRead;
			while (-1 != (bytesRead = bis.read(buff, 0, buff.length))) {
				bos.write(buff, 0, bytesRead);
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			if (bis != null)
				bis.close();
			if (bos != null)
				bos.close();
		}
		return null;
	}
}


spring.xml
Java代码 复制代码 收藏代码
  1. <?xml version="1.0" encoding="UTF-8" ?>   
  2. <beans xmlns="http://www.springframework.org/schema/beans"  
  3.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  4.     xmlns:p="http://www.springframework.org/schema/p"  
  5.     xmlns:context="http://www.springframework.org/schema/context"      
  6.     xsi:schemaLocation="   
  7.         http://www.springframework.org/schema/beans    
  8.         http://www.springframework.org/schema/beans/spring-beans-3.0.xsd   
  9.         http://www.springframework.org/schema/context    
  10.         http://www.springframework.org/schema/context/spring-context-3.0.xsd">   
  11.     <!--    
  12.         自动搜索@Controller标注的类   
  13.         用于指明系统从哪个路径下寻找controller,然后提前初始化这些对象。   
  14.     -->   
  15.     <context:component-scan base-package="net.liuzd.web" />   
  16.   
  17.     <!--  ③:对模型视图名称的解析,即在模型视图名称添加前后缀 -->   
  18.     <bean   
  19.         class="org.springframework.web.servlet.view.InternalResourceViewResolver"  
  20.         p:prefix="/WEB-INF/jsp/" p:suffix=".jsp" />   
  21.   
  22.       
  23.     <bean id="multipartResolver"  
  24.         class="org.springframework.web.multipart.commons.CommonsMultipartResolver" p:defaultEncoding="utf-8">   
  25.         <property name="maxUploadSize">   
  26.             <value>104857600</value>   
  27.         </property>   
  28.         <property name="maxInMemorySize">   
  29.             <value>4096</value>   
  30.         </property>   
  31.     </bean>   
  32. </beans>  
<?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:p="http://www.springframework.org/schema/p"
	xmlns:context="http://www.springframework.org/schema/context"	
	xsi:schemaLocation="
        http://www.springframework.org/schema/beans 
        http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
        http://www.springframework.org/schema/context 
        http://www.springframework.org/schema/context/spring-context-3.0.xsd">
	<!-- 
		自动搜索@Controller标注的类
		用于指明系统从哪个路径下寻找controller,然后提前初始化这些对象。
	-->
	<context:component-scan base-package="net.liuzd.web" />

	<!--  ③:对模型视图名称的解析,即在模型视图名称添加前后缀 -->
	<bean
		class="org.springframework.web.servlet.view.InternalResourceViewResolver"
		p:prefix="/WEB-INF/jsp/" p:suffix=".jsp" />

   
	<bean id="multipartResolver"
		class="org.springframework.web.multipart.commons.CommonsMultipartResolver" p:defaultEncoding="utf-8">
		<property name="maxUploadSize">
			<value>104857600</value>
		</property>
		<property name="maxInMemorySize">
			<value>4096</value>
		</property>
	</bean>
</beans>

success.jsp
Java代码 复制代码 收藏代码
  1. <%@ taglib  prefix="c" uri="/WEB-INF/c.tld"%>   
  2. <h1>Upload Successful</h1>   
  3.     <c:forEach var="month" items="${files}">   
  4.         <li><a href="${pageContext.request.contextPath}/download/${month}.do">${month}</a></li>   
  5.     </c:forEach>   
  6.   <hr><br>   
  7.   <a href="${pageContext.request.contextPath}/index.jsp">返回</a>  
<%@ taglib  prefix="c" uri="/WEB-INF/c.tld"%>
<h1>Upload Successful</h1>
	<c:forEach var="month" items="${files}">
    	<li><a href="${pageContext.request.contextPath}/download/${month}.do">${month}</a></li>
	</c:forEach>
  <hr><br>
  <a href="${pageContext.request.contextPath}/index.jsp">返回</a>


web.xml
Java代码 复制代码 收藏代码
  1. <?xml version="1.0" encoding="UTF-8"?>   
  2. <web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee"  
  3.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  4.     xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee    
  5.     http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">   
  6.        
  7.     <context-param>   
  8.         <param-name>log4jConfigLocation</param-name>   
  9.         <param-value>/WEB-INF/classes/log4j.properties</param-value>   
  10.     </context-param>   
  11.   
  12.     <context-param>   
  13.         <param-name>log4jRefreshInterval</param-name>   
  14.         <param-value>60000</param-value>   
  15.     </context-param>   
  16.     <context-param>   
  17.         <param-name>log4jExposeWebAppRoot</param-name>   
  18.         <param-value>false</param-value>   
  19.     </context-param>   
  20.   
  21.     <listener>   
  22.         <listener-class>   
  23.             org.springframework.web.util.Log4jConfigListener   
  24.         </listener-class>   
  25.     </listener>   
  26.   
  27.     <filter>   
  28.         <filter-name>encodingFilter</filter-name>   
  29.         <filter-class>   
  30.             org.springframework.web.filter.CharacterEncodingFilter   
  31.         </filter-class>   
  32.         <init-param>   
  33.             <param-name>encoding</param-name>   
  34.             <param-value>UTF-8</param-value>   
  35.         </init-param>   
  36.         <init-param>   
  37.             <param-name>forceEncoding</param-name>   
  38.             <param-value>false</param-value>   
  39.         </init-param>   
  40.     </filter>   
  41.   
  42.     <filter-mapping>   
  43.         <filter-name>encodingFilter</filter-name>   
  44.         <url-pattern>*.do</url-pattern>   
  45.     </filter-mapping>   
  46.   
  47.     <filter-mapping>   
  48.         <filter-name>encodingFilter</filter-name>   
  49.         <url-pattern>*.jsp</url-pattern>   
  50.     </filter-mapping>   
  51.   
  52.     <servlet>   
  53.         <servlet-name>springmvc</servlet-name>   
  54.         <servlet-class>   
  55.             org.springframework.web.servlet.DispatcherServlet   
  56.         </servlet-class>   
  57.         <init-param>   
  58.             <param-name>contextConfigLocation</param-name>   
  59.             <param-value>classpath:springmvc.xml</param-value>   
  60.         </init-param>   
  61.         <load-on-startup>1</load-on-startup>   
  62.     </servlet>   
  63.   
  64.     <servlet-mapping>   
  65.         <servlet-name>springmvc</servlet-name>   
  66.         <url-pattern>*.do</url-pattern>   
  67.     </servlet-mapping>   
  68.     <welcome-file-list>   
  69.         <welcome-file>index.jsp</welcome-file>   
  70.     </welcome-file-list>   
  71. </web-app>  
分享到:
评论
5 楼 2047699523 2015-05-19  
spring mvc demo教程源代码下载:http://www.zuidaima.com/share/kspringmvc-p1-s1.htm
4 楼 yuechen323 2015-03-15  
代码写了2次,而且还这么啰嗦
3 楼 lemoCC 2015-02-03  
  • [list]
  • [*][list]
  • [*][*][list]
  • [*][*][*]
  • [*][*]
  • [*][/list]
  • [/list]
  • [/list]
    2 楼 lemoCC 2015-02-03  
    [flash=200,200][flash=200,200][url][img][list]
    [*]
    引用
    [/list][/img][/url][/flash][/flash]
             
    1 楼 tonyyouwei 2013-11-30  
    写的真好!

    相关推荐

    Global site tag (gtag.js) - Google Analytics