標籤: 銷售文案

  • SpringMVC之文件上傳

    SpringMVC之文件上傳

    一、環境搭建

    1、新建項目

    (1)在” main”目錄下新建” java”與” resources”目錄

    (2)將” java”設置為”Sources Root”

    (3)將” resources”設置為”Resources Root”

    (4)在”java”目錄下新建”StudyProject.Controller”包

    (5)在”StudyProject.Controller”包下新建”TestController”類

    (6)在”resources”目錄下新建”Spring.xml”

    (7)在”WEB-INF”目錄下新建文件夾”Pages”

    (8)在“Pages”目錄下新建”success.jsp”

    2、整體框架

    3、TestController類和success.jsp

    (1)TestController類

    原代碼

    1 package StudyProject.Controller;
    2 
    3 public class TestController {
    4 }

    編寫前端控制器及路徑

    修改后

    1 package StudyProject.Controller;
    2 
    3 import org.springframework.stereotype.Controller;
    4 import org.springframework.web.bind.annotation.RequestMapping;
    5 
    6 @Controller
    7 @RequestMapping(path="/testController")
    8 public class TestController {
    9 }

    (2)success.jsp

    原代碼

    1 <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    2 <html>
    3 <head>
    4     <title>Title</title>
    5 </head>
    6 <body>
    7 
    8 </body>
    9 </html>

    添加一個跳轉成功提示

    修改后

     1 <%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
     2 <html>
     3 <head>
     4     <title>Title</title>
     5 </head>
     6 <body>
     7 
     8     <h3>跳轉成功</h3>
     9 
    10 </body>
    11 </html>

    4、配置文件

    (1)pom.xml

    原代碼

    1   <properties>
    2     <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    3     <maven.compiler.source>1.7</maven.compiler.source>
    4     <maven.compiler.target>1.7</maven.compiler.target>
    5   </properties>

    修改版本,並且加上spring.version

    修改后

    1   <properties>
    2     <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    3     <maven.compiler.source>14.0.1</maven.compiler.source>
    4     <maven.compiler.target>14.0.1</maven.compiler.target>
    5     <spring.version>5.0.2.RELEASE</spring.version>
    6   </properties>

    原代碼

    1   <dependencies>
    2     <dependency>
    3       <groupId>junit</groupId>
    4       <artifactId>junit</artifactId>
    5       <version>4.11</version>
    6       <scope>test</scope>
    7     </dependency>
    8   </dependencies>

    在<dependencies></dependency>里加入坐標依賴,原有的可以刪去

    修改后

     1   <!-- 導入坐標依賴 -->
     2   <dependencies>
     3     <dependency>
     4       <groupId>org.springframework</groupId>
     5       <artifactId>spring-context</artifactId>
     6       <version>${spring.version}</version>
     7     </dependency>
     8     <dependency>
     9       <groupId>org.springframework</groupId>
    10       <artifactId>spring-web</artifactId>
    11       <version>${spring.version}</version>
    12     </dependency>
    13     <dependency>
    14       <groupId>org.springframework</groupId>
    15       <artifactId>spring-webmvc</artifactId>
    16       <version>${spring.version}</version>
    17     </dependency>
    18     <dependency>
    19       <groupId>javax.servlet</groupId>
    20       <artifactId>servlet-api</artifactId>
    21       <version>2.5</version>
    22       <scope>provided</scope>
    23     </dependency>
    24     <dependency>
    25       <groupId>javax.servlet.jsp</groupId>
    26       <artifactId>jsp-api</artifactId>
    27       <version>2.0</version>
    28       <scope>provided</scope>
    29     </dependency>
    30   </dependencies>

    (2)web.xml

    原代碼

    1 <!DOCTYPE web-app PUBLIC
    2  "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
    3  "http://java.sun.com/dtd/web-app_2_3.dtd" >
    4 
    5 <web-app>
    6   <display-name>Archetype Created Web Application</display-name>
    7 </web-app>

    配置前段控制器與解決中文亂碼的過濾器

    修改后

     1 <!DOCTYPE web-app PUBLIC
     2  "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
     3  "http://java.sun.com/dtd/web-app_2_3.dtd" >
     4 
     5 <web-app>
     6   <display-name>Archetype Created Web Application</display-name>
     7 
     8   <!--配置解決中文亂碼的過濾器-->
     9   <filter>
    10     <filter-name>characterEncodingFilter</filter-name>
    11     <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
    12     <init-param>
    13       <param-name>encoding</param-name>
    14       <param-value>UTF-8</param-value>
    15     </init-param>
    16   </filter>
    17   <filter-mapping>
    18   <filter-name>characterEncodingFilter</filter-name>
    19   <url-pattern>/*</url-pattern>
    20   </filter-mapping>
    21 
    22   <!-- 配置前端控制器 -->
    23   <servlet>
    24     <servlet-name>dispatcherServlet</servlet-name>
    25     <!-- 創建前端控制器DispatcherServlet對象 -->
    26     <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    27     <!-- 使前端控制器初始化時讀取Spring.xml文件創建Spring核心容器 -->
    28     <init-param>
    29       <param-name>contextConfigLocation</param-name>
    30       <param-value>classpath*:Spring.xml</param-value>
    31     </init-param>
    32     <!-- 設置該Servlet的優先級別為最高,使之最早創建(在應用啟動時就加載並初始化這個servlet -->
    33     <load-on-startup>1</load-on-startup>
    34   </servlet>
    35   <servlet-mapping>
    36     <servlet-name>dispatcherServlet</servlet-name>
    37     <url-pattern>/</url-pattern>
    38   </servlet-mapping>
    39 
    40 </web-app>

    (3)Spring.xml

    原代碼

    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        xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
    5 
    6 </beans>

    配置spring創建容器時掃描的包、視圖解析器、開啟spring註解支持等

    修改后

     1 <?xml version="1.0" encoding="UTF-8"?>
     2 <beans xmlns="http://www.springframework.org/schema/beans"
     3        xmlns:mvc="http://www.springframework.org/schema/mvc"
     4        xmlns:context="http://www.springframework.org/schema/context"
     5        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     6        xsi:schemaLocation="
     7         http://www.springframework.org/schema/beans
     8         http://www.springframework.org/schema/beans/spring-beans.xsd
     9         http://www.springframework.org/schema/mvc
    10         http://www.springframework.org/schema/mvc/spring-mvc.xsd
    11         http://www.springframework.org/schema/context
    12         http://www.springframework.org/schema/context/spring-context.xsd">
    13 
    14     <!-- 配置spring創建容器時掃描的包 -->
    15     <context:component-scan base-package="StudyProject.Controller"></context:component-scan>
    16 
    17     <!-- 配置視圖解析器,用於解析項目跳轉到的文件的位置 -->
    18     <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    19         <!-- 尋找包的路徑 -->
    20         <property name="prefix" value="/WEB-INF/pages/"></property>
    21         <!-- 尋找文件的後綴名 -->
    22         <property name="suffix" value=".jsp"></property>
    23     </bean>
    24 
    25     <!-- 配置spring開啟註解mvc的支持 -->
    26     <mvc:annotation-driven></mvc:annotation-driven>
    27 </beans>

    5、Tomcat服務器(本地已建SpringMVC項目,Spring_MVC項目僅做示範)

    點擊”Add Configurations”配置Tomcat服務器

    二、文件上傳

    1、傳統方式上傳文件

    (1)TestController類

    在控制器內部新增”testMethod_Traditional”方法

     1 @Controller
     2 @RequestMapping(path="/testController")
     3 public class TestController {
     4 
     5     @RequestMapping(path="/testMethod_Traditional")
     6     public String testMethod_Traditional(HttpServletRequest request) throws Exception {
     7         System.out.println("執行了testMethod_Traditional方法");
     8 
     9         //獲取文件上傳目錄
    10         String path = request.getSession().getServletContext().getRealPath("/uploads");
    11         //創建file對象
    12         File file = new File(path);
    13         //判斷路徑是否存在,若不存在,創建該路徑
    14         if (!file.exists()) {
    15             file.mkdir();
    16         }
    17 
    18         //創建磁盤文件項工廠
    19         DiskFileItemFactory factory = new DiskFileItemFactory();
    20         ServletFileUpload fileUpload = new ServletFileUpload(factory);
    21         //解析request對象
    22         List<FileItem> list = fileUpload.parseRequest(request);
    23         //遍歷
    24         for (FileItem fileItem:list) {
    25             // 判斷文件項是普通字段,還是上傳的文件
    26             if (fileItem.isFormField()) {
    27                 //普通字段
    28             } else {
    29                 //上傳文件項
    30                 //獲取上傳文件項的名稱
    31                 String filename = fileItem.getName();
    32                 String uuid = UUID.randomUUID().toString().replaceAll("-","").toUpperCase();
    33                 filename = uuid+"_"+filename;
    34                 //上傳文件
    35                 fileItem.write(new File(file,filename));
    36                 //刪除臨時文件
    37                 fileItem.delete();
    38             }
    39         }
    40 
    41         System.out.println("上傳路徑:"+path);
    42         System.out.println("上傳成功");
    43         return "success";
    44     }
    45 
    46 }

    (2)index.jsp

    添加form表單

    1     <form action="testController/testMethod_Traditional" method="post" enctype="multipart/form-data">
    2         圖片 <input type="file" name="uploadfile_Traditional"> <br>
    3         <input type="submit" value="傳統方式上傳文件">
    4     </form>

    (3)結果演示

    點擊服務器”SpringMVC”右側的運行按鈕

    選擇文件然後進行上傳

    點擊上傳按鈕后,執行成功,跳到”success.jsp”界面显示跳轉成功

    在IDEA輸出台查看文件路徑

    按照路徑查看文件是否上傳成功

    2、SpringMVC方式上傳文件

    (1)pom.xml添加文件上傳坐標依賴

    在pom.xml文件<dependencies></dependencies>內添加文件上傳坐標依賴

     1     <!-- 文件上傳 -->
     2     <dependency>
     3       <groupId>commons-fileupload</groupId>
     4       <artifactId>commons-fileupload</artifactId>
     5       <version>1.3.1</version>
     6     </dependency>
     7     <dependency>
     8       <groupId>commons-io</groupId>
     9       <artifactId>commons-io</artifactId>
    10       <version>2.4</version>
    11     </dependency>

    (2)Spring.xml配置文件解析器對象

    在Spring.xml文件<beans></beans>內配置文件解析器對象

    1     <!-- 配置文件解析器對象 -->
    2     <bean id="multipartResolver"
    3           class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
    4         <property name="defaultEncoding" value="utf-8"></property>
    5         <property name="maxUploadSize" value="10485760"></property>
    6     </bean>

    (3)TestController類

    在控制器內部新增”testMethod_SpringMVC”方法

     1 @Controller
     2 @RequestMapping(path="/testController")
     3 public class TestController {
     4 
     5     @RequestMapping(path="/testMethod_SpringMVC")
     6     public String testMethod_SpringMVC(HttpServletRequest request,MultipartFile uploadfile_SpringMVC) throws Exception {
     7         System.out.println("執行了testMethod_SpringMVC方法");
     8 
     9         //獲取文件上傳目錄
    10         String path = request.getSession().getServletContext().getRealPath("/uploads");
    11         //創建file對象
    12         File file = new File(path);
    13         //判斷路徑是否存在,若不存在,創建該路徑
    14         if (!file.exists()) {
    15             file.mkdir();
    16         }
    17 
    18         //獲取到上傳文件的名稱
    19         String filename = uploadfile_SpringMVC.getOriginalFilename();
    20         String uuid = UUID.randomUUID().toString().replaceAll("-","").toUpperCase();
    21         filename = uuid+"_"+filename;
    22         //上傳文件
    23         uploadfile_SpringMVC.transferTo(new File(file,filename));
    24 
    25         System.out.println("上傳路徑:"+path);
    26         System.out.println("上傳成功");
    27         return "success";
    28     }
    29 
    30 }

    (4)index.jsp

    添加form表單

    1     <form action="testController/testMethod_SpringMVC" method="post" enctype="multipart/form-data">
    2         圖片 <input type="file" name="uploadfile_SpringMVC"> <br>
    3         <input type="submit" value="SpringMVC上傳文件">
    4     </form>

    (5)結果演示

    點擊服務器”SpringMVC”右側的運行按鈕

    選擇文件然後進行上傳

    點擊上傳按鈕后,執行成功,跳到”success.jsp”界面显示跳轉成功

    在IDEA輸出台查看文件路徑

    按照路徑查看文件是否上傳成功

    3、跨服務器上傳文件

    (1)新建”FileuploadServer”項目(過程不再演示)

    不需要建立”java””resources”等文件夾,只需要”index.jsp”显示界面即可

    “index.jsp”代碼

    1 <html>
    2 <body>
    3 <h2>Hello! FileuploadServer</h2>
    4 </body>
    5 </html>

    (2)配置服務器

    點擊”Edit Configurations”配置Tomcat服務器

    為與”SpringMVC”服務器區分,修改”HTTP port”為”9090”,修改”JMX port”為”1090”

    (3)pom.xml添加跨服務器文件上傳坐標依賴

     1     <!-- 跨服務器文件上傳 -->
     2     <dependency>
     3       <groupId>com.sun.jersey</groupId>
     4       <artifactId>jersey-core</artifactId>
     5       <version>1.18.1</version>
     6     </dependency>
     7     <dependency>
     8       <groupId>com.sun.jersey</groupId>
     9       <artifactId>jersey-client</artifactId>
    10       <version>1.18.1</version>
    11     </dependency>

    (4)TestController類

    在控制器內部新增”testMethod_AcrossServer”方法

     1 @Controller
     2 @RequestMapping(path="/testController")
     3 public class TestController {
     4 
     5     @RequestMapping(path="/testMethod_AcrossServer")
     6     public String testMethod_AcrossServer(MultipartFile uploadfile_AcrossServer) throws Exception {
     7         System.out.println("執行了testMethod_AcrossServer方法");
     8 
     9         //定義上傳文件服務器路徑
    10         String path = "http://localhost:9090/FileuploadServer_war_exploded/uploads/";
    11 
    12         //獲取到上傳文件的名稱
    13         String filename = uploadfile_AcrossServer.getOriginalFilename();
    14         String uuid = UUID.randomUUID().toString().replaceAll("-","").toUpperCase();
    15         filename = uuid+"_"+filename;
    16 
    17         //創建客戶端對象
    18         Client client = Client.create();
    19         //連接圖片服務器
    20         WebResource webResourcer = client.resource(path+filename);
    21         //向圖片服務器上傳文件
    22         webResourcer.put(uploadfile_AcrossServer.getBytes());
    23 
    24         System.out.println("上傳路徑:"+path);
    25         System.out.println("上傳成功");
    26         return "success";
    27     }
    28 
    29 }

    (5)index.jsp

    添加form表單

    1     <form action="testController/testMethod_AcrossServer" method="post" enctype="multipart/form-data">
    2         圖片 <input type="file" name="uploadfile_AcrossServer"> <br>
    3         <input type="submit" value="跨服務器上傳文件">
    4     </form>

    (6)結果演示

    運行”FileuploadServer”服務器

    運行”SpringMVC”服務器

    在”FileuploadServer”項目的”target/FileuploadServer/”目錄下新建文件夾”uploads”

    選擇文件並進行上傳,上傳成功跳轉到”success.jsp”

    查看IDEA輸出信息

    此時路徑應為”FileuploadServer/target/FileuploadServer/uploads”,在路徑下查看文件是否上傳成功

    三、注意事項

    1、傳統方式上傳文件

    傳統方式上傳時不需要在Spring.xml內配置文件解析器對象使用該方法時需要註釋掉該對象,否則會造成運行成功但上傳文件為空。

    1     <!-- 配置文件解析器對象 -->
    2     <bean id="multipartResolver"
    3           class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
    4         <property name="defaultEncoding" value="utf-8"></property>
    5         <property name="maxUploadSize" value="10485760"></property>
    6     </bean>

    即使用傳統方式上傳文件時,應當註釋掉該段代碼

    2、跨服務器上傳文件

    (1)需要修改Tomcat服務器的web.xml配置文件的權限,增加可以寫入的權限,否則會出現405的錯誤。如我所下載的Tomcat-9.0.36的web.xml路徑為”apache-tomcat-9.0.36/conf/web.xml”

    此時IEDA輸出為

    web.xml文件修改處原內容

    應修改為

    修改后的代碼

     1     <servlet>
     2         <servlet-name>default</servlet-name>
     3         <servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
     4         <init-param>
     5             <param-name>debug</param-name>
     6             <param-value>0</param-value>
     7         </init-param>
     8         <init-param>
     9             <param-name>listings</param-name>
    10             <param-value>false</param-value>
    11         </init-param>
    12         <init-param>
    13             <param-name>readonly</param-name>
    14             <param-value>false</param-value>
    15         </init-param>
    16         <load-on-startup>1</load-on-startup>
    17     </servlet>

    (2)在跨服務器上傳文件時,需要在”FileuploadServer”項目的”target/FileuploadServer/”目錄下新建文件夾”uploads”,否則會出現409的錯誤

    四、完整代碼

    1、pom.xml(SpringMVC)

      1 <?xml version="1.0" encoding="UTF-8"?>
      2 
      3 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      4   xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
      5   <modelVersion>4.0.0</modelVersion>
      6 
      7   <groupId>org.example</groupId>
      8   <artifactId>SpringMVC</artifactId>
      9   <version>1.0-SNAPSHOT</version>
     10   <packaging>war</packaging>
     11 
     12   <name>SpringMVC Maven Webapp</name>
     13   <!-- FIXME change it to the project's website -->
     14   <url>http://www.example.com</url>
     15 
     16   <properties>
     17     <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
     18     <maven.compiler.source>14.0.1</maven.compiler.source>
     19     <maven.compiler.target>14.0.1</maven.compiler.target>
     20     <spring.version>5.0.2.RELEASE</spring.version>
     21   </properties>
     22 
     23   <!-- 導入坐標依賴 -->
     24   <dependencies>
     25     <dependency>
     26       <groupId>org.springframework</groupId>
     27       <artifactId>spring-context</artifactId>
     28       <version>${spring.version}</version>
     29     </dependency>
     30     <dependency>
     31       <groupId>org.springframework</groupId>
     32       <artifactId>spring-web</artifactId>
     33       <version>${spring.version}</version>
     34     </dependency>
     35     <dependency>
     36       <groupId>org.springframework</groupId>
     37       <artifactId>spring-webmvc</artifactId>
     38       <version>${spring.version}</version>
     39     </dependency>
     40     <dependency>
     41       <groupId>javax.servlet</groupId>
     42       <artifactId>servlet-api</artifactId>
     43       <version>2.5</version>
     44       <scope>provided</scope>
     45     </dependency>
     46     <dependency>
     47       <groupId>javax.servlet.jsp</groupId>
     48       <artifactId>jsp-api</artifactId>
     49       <version>2.0</version>
     50       <scope>provided</scope>
     51     </dependency>
     52 
     53     <!-- 文件上傳(採用傳統方式上傳時需註釋掉該部分) -->
     54     <dependency>
     55       <groupId>commons-fileupload</groupId>
     56       <artifactId>commons-fileupload</artifactId>
     57       <version>1.3.1</version>
     58     </dependency>
     59     <dependency>
     60       <groupId>commons-io</groupId>
     61       <artifactId>commons-io</artifactId>
     62       <version>2.4</version>
     63     </dependency>
     64 
     65     <!-- 跨服務器文件上傳 -->
     66     <dependency>
     67       <groupId>com.sun.jersey</groupId>
     68       <artifactId>jersey-core</artifactId>
     69       <version>1.18.1</version>
     70     </dependency>
     71     <dependency>
     72       <groupId>com.sun.jersey</groupId>
     73       <artifactId>jersey-client</artifactId>
     74       <version>1.18.1</version>
     75     </dependency>
     76 
     77   </dependencies>
     78 
     79   <build>
     80     <finalName>SpringMVC</finalName>
     81     <pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
     82       <plugins>
     83         <plugin>
     84           <artifactId>maven-clean-plugin</artifactId>
     85           <version>3.1.0</version>
     86         </plugin>
     87         <!-- see http://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_war_packaging -->
     88         <plugin>
     89           <artifactId>maven-resources-plugin</artifactId>
     90           <version>3.0.2</version>
     91         </plugin>
     92         <plugin>
     93           <artifactId>maven-compiler-plugin</artifactId>
     94           <version>3.8.0</version>
     95         </plugin>
     96         <plugin>
     97           <artifactId>maven-surefire-plugin</artifactId>
     98           <version>2.22.1</version>
     99         </plugin>
    100         <plugin>
    101           <artifactId>maven-war-plugin</artifactId>
    102           <version>3.2.2</version>
    103         </plugin>
    104         <plugin>
    105           <artifactId>maven-install-plugin</artifactId>
    106           <version>2.5.2</version>
    107         </plugin>
    108         <plugin>
    109           <artifactId>maven-deploy-plugin</artifactId>
    110           <version>2.8.2</version>
    111         </plugin>
    112       </plugins>
    113     </pluginManagement>
    114   </build>
    115 </project>

    2、web.xml(SpringMVC)

     1 <!DOCTYPE web-app PUBLIC
     2  "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
     3  "http://java.sun.com/dtd/web-app_2_3.dtd" >
     4 
     5 <web-app>
     6   <display-name>Archetype Created Web Application</display-name>
     7 
     8   <!--配置解決中文亂碼的過濾器-->
     9   <filter>
    10     <filter-name>characterEncodingFilter</filter-name>
    11     <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
    12     <init-param>
    13       <param-name>encoding</param-name>
    14       <param-value>UTF-8</param-value>
    15     </init-param>
    16   </filter>
    17   <filter-mapping>
    18   <filter-name>characterEncodingFilter</filter-name>
    19   <url-pattern>/*</url-pattern>
    20   </filter-mapping>
    21 
    22   <!-- 配置前端控制器 -->
    23   <servlet>
    24     <servlet-name>dispatcherServlet</servlet-name>
    25     <!-- 創建前端控制器DispatcherServlet對象 -->
    26     <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    27     <!-- 使前端控制器初始化時讀取Spring.xml文件創建Spring核心容器 -->
    28     <init-param>
    29       <param-name>contextConfigLocation</param-name>
    30       <param-value>classpath*:Spring.xml</param-value>
    31     </init-param>
    32     <!-- 設置該Servlet的優先級別為最高,使之最早創建(在應用啟動時就加載並初始化這個servlet -->
    33     <load-on-startup>1</load-on-startup>
    34   </servlet>
    35   <servlet-mapping>
    36     <servlet-name>dispatcherServlet</servlet-name>
    37     <url-pattern>/</url-pattern>
    38   </servlet-mapping>
    39 
    40 </web-app>

    3、Spring.xml(SpringMVC)

     1 <?xml version="1.0" encoding="UTF-8"?>
     2 <beans xmlns="http://www.springframework.org/schema/beans"
     3        xmlns:mvc="http://www.springframework.org/schema/mvc"
     4        xmlns:context="http://www.springframework.org/schema/context"
     5        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     6        xsi:schemaLocation="
     7         http://www.springframework.org/schema/beans
     8         http://www.springframework.org/schema/beans/spring-beans.xsd
     9         http://www.springframework.org/schema/mvc
    10         http://www.springframework.org/schema/mvc/spring-mvc.xsd
    11         http://www.springframework.org/schema/context
    12         http://www.springframework.org/schema/context/spring-context.xsd">
    13 
    14     <!-- 配置spring創建容器時掃描的包 -->
    15     <context:component-scan base-package="StudyProject.Controller"></context:component-scan>
    16 
    17     <!-- 配置視圖解析器,用於解析項目跳轉到的文件的位置 -->
    18     <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    19         <!-- 尋找包的路徑 -->
    20         <property name="prefix" value="/WEB-INF/pages/"></property>
    21         <!-- 尋找文件的後綴名 -->
    22         <property name="suffix" value=".jsp"></property>
    23     </bean>
    24 
    25     <!-- 配置文件解析器對象 -->
    26     <bean id="multipartResolver"
    27           class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
    28         <property name="defaultEncoding" value="utf-8"></property>
    29         <property name="maxUploadSize" value="10485760"></property>
    30     </bean>
    31     
    32     <!-- 配置spring開啟註解mvc的支持 -->
    33     <mvc:annotation-driven></mvc:annotation-driven>
    34 </beans>

    4、TestController類(SpringMVC)

      1 package StudyProject.Controller;
      2 
      3 import com.sun.jersey.api.client.Client;
      4 import com.sun.jersey.api.client.WebResource;
      5 import org.apache.commons.fileupload.FileItem;
      6 import org.apache.commons.fileupload.disk.DiskFileItemFactory;
      7 import org.apache.commons.fileupload.servlet.ServletFileUpload;
      8 import org.springframework.stereotype.Controller;
      9 import org.springframework.web.bind.annotation.RequestMapping;
     10 import org.springframework.web.multipart.MultipartFile;
     11 import javax.servlet.http.HttpServletRequest;
     12 import java.io.File;
     13 import java.util.List;
     14 import java.util.UUID;
     15 
     16 @Controller
     17 @RequestMapping(path="/testController")
     18 public class TestController {
     19 
     20     @RequestMapping(path="/testMethod_Traditional")
     21     public String testMethod_Traditional(HttpServletRequest request) throws Exception {
     22         System.out.println("執行了testMethod_Traditional方法");
     23 
     24         //獲取文件上傳目錄
     25         String path = request.getSession().getServletContext().getRealPath("/uploads");
     26         //創建file對象
     27         File file = new File(path);
     28         //判斷路徑是否存在,若不存在,創建該路徑
     29         if (!file.exists()) {
     30             file.mkdir();
     31         }
     32 
     33         //創建磁盤文件項工廠
     34         DiskFileItemFactory factory = new DiskFileItemFactory();
     35         ServletFileUpload fileUpload = new ServletFileUpload(factory);
     36         //解析request對象
     37         List<FileItem> list = fileUpload.parseRequest(request);
     38         //遍歷
     39         for (FileItem fileItem:list) {
     40             // 判斷文件項是普通字段,還是上傳的文件
     41             if (fileItem.isFormField()) {
     42                 //普通字段
     43             } else {
     44                 //上傳文件項
     45                 //獲取上傳文件項的名稱
     46                 String filename = fileItem.getName();
     47                 String uuid = UUID.randomUUID().toString().replaceAll("-","").toUpperCase();
     48                 filename = uuid+"_"+filename;
     49                 //上傳文件
     50                 fileItem.write(new File(file,filename));
     51                 //刪除臨時文件
     52                 fileItem.delete();
     53             }
     54         }
     55 
     56         System.out.println("上傳路徑:"+path);
     57         System.out.println("上傳成功");
     58         return "success";
     59     }
     60 
     61     @RequestMapping(path="/testMethod_SpringMVC")
     62     public String testMethod_SpringMVC(HttpServletRequest request,MultipartFile uploadfile_SpringMVC) throws Exception {
     63         System.out.println("執行了testMethod_SpringMVC方法");
     64 
     65         //獲取文件上傳目錄
     66         String path = request.getSession().getServletContext().getRealPath("/uploads");
     67         //創建file對象
     68         File file = new File(path);
     69         //判斷路徑是否存在,若不存在,創建該路徑
     70         if (!file.exists()) {
     71             file.mkdir();
     72         }
     73 
     74         //獲取到上傳文件的名稱
     75         String filename = uploadfile_SpringMVC.getOriginalFilename();
     76         String uuid = UUID.randomUUID().toString().replaceAll("-","").toUpperCase();
     77         filename = uuid+"_"+filename;
     78         //上傳文件
     79         uploadfile_SpringMVC.transferTo(new File(file,filename));
     80 
     81         System.out.println("上傳路徑:"+path);
     82         System.out.println("上傳成功");
     83         return "success";
     84     }
     85 
     86     @RequestMapping(path="/testMethod_AcrossServer")
     87     public String testMethod_AcrossServer(MultipartFile uploadfile_AcrossServer) throws Exception {
     88         System.out.println("執行了testMethod_AcrossServer方法");
     89 
     90         //定義上傳文件服務器路徑
     91         String path = "http://localhost:9090/FileuploadServer_war_exploded/uploads/";
     92 
     93         //獲取到上傳文件的名稱
     94         String filename = uploadfile_AcrossServer.getOriginalFilename();
     95         String uuid = UUID.randomUUID().toString().replaceAll("-","").toUpperCase();
     96         filename = uuid+"_"+filename;
     97 
     98         //創建客戶端對象
     99         Client client = Client.create();
    100         //連接圖片服務器
    101         WebResource webResourcer = client.resource(path+filename);
    102         //向圖片服務器上傳文件
    103         webResourcer.put(uploadfile_AcrossServer.getBytes());
    104 
    105         System.out.println("上傳路徑:"+path);
    106         System.out.println("上傳成功");
    107         return "success";
    108     }
    109 
    110 }

    5、index.jsp(SpringMVC)

     1 <%@ page contentType="text/html;charset=UTF-8" language="java" %>
     2 <html>
     3 <head>
     4     <title>Title</title>
     5 </head>
     6 <body>
     7 
     8     <form action="testController/testMethod_Traditional" method="post" enctype="multipart/form-data">
     9         圖片 <input type="file" name="uploadfile_Traditional"> <br>
    10         <input type="submit" value="傳統方式上傳文件">
    11     </form>
    12 
    13     <br><br><br>
    14 
    15     <form action="testController/testMethod_SpringMVC" method="post" enctype="multipart/form-data">
    16         圖片 <input type="file" name="uploadfile_SpringMVC"> <br>
    17         <input type="submit" value="SpringMVC上傳文件">
    18     </form>
    19 
    20     <br><br><br>
    21 
    22     <form action="testController/testMethod_AcrossServer" method="post" enctype="multipart/form-data">
    23         圖片 <input type="file" name="uploadfile_AcrossServer"> <br>
    24         <input type="submit" value="跨服務器上傳文件">
    25     </form>
    26 
    27 </body>
    28 </html>

    6、success.jsp(SpringMVC)

     1 <%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
     2 <html>
     3 <head>
     4     <title>Title</title>
     5 </head>
     6 <body>
     7 
     8     <h3>跳轉成功</h3>
     9 
    10 </body>
    11 </html>

    7、index.jsp(FileuploadServer)

    1 <html>
    2 <body>
    3 <h2>Hello! FileuploadServer</h2>
    4 </body>
    5 </html>

    學習資料來源:黑馬程序員

    本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

    【其他文章推薦】

    網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

    網頁設計公司推薦不同的風格,搶佔消費者視覺第一線

    ※想知道購買電動車哪裡補助最多?台中電動車補助資訊懶人包彙整

    南投搬家公司費用,距離,噸數怎麼算?達人教你簡易估價知識!

    ※教你寫出一流的銷售文案?

    ※超省錢租車方案

  • Gogoro 2上市,支援指紋解鎖

    Gogoro 2上市,支援指紋解鎖

    Gogoro 5月25日在台發表第二代車款「Gogoro 2」,主打更低廉的售價,加大的車身,同時也承諾將採用更多機車行業的公規零件。

    此次Gogoro 2 共有兩個版本,包括入門的Gogoro 2,以及具有更多智慧功能的Gogoro 2 Plus。入門款訂價為73,800 元,Plus 版則為79,800 元,但符合先前的傳聞,如果經由各縣市電動車補助,以及汰換二行程新購補助,將能以5 萬有找的售價入手,比如補助最大的桃園,就可以用台幣38,800 元購入。

    ▲Gogoro 2 原廠提供超過50 種不同配件。(Source:科技新報攝)

    Gogoro 2 也預計會搭載新的智慧系統iQ 4.0,最大特色是讓手機能讀取更多機車的動力資訊、能耗狀況,同時也支援以手機密碼或指紋「解鎖」機車。加大一些、更貼近目前主流125 車型的雙載座位可能也是賣點。由於車身加大,即使扣除電池部份,車廂也擺得下兩頂3/4 帽。

    ▲(Source:科技新報攝)

    採用更多機車工業的主流零件也是Gogoro 2 的特色,增加了車主自行改裝、或是修繕的空間。儘管代價之一是先前以一體成型合金車沖出來的車身不再,外型也變得比較貼近一般國產油車,但一方面除了能減輕車主的保固成本,Gogoro 也得以公布新的「Go Partner 計劃」,內容類似現行的機車行營銷模式,讓第三方小廠能加入維修保固、甚至銷售機車的服務。

    至於性能方面的改進,則包括續航提高10 公里。機車的儀表板也有重新設計。配色則包括黑、白、紅、橘、黃、藍。

    Gogoro 2 將從即日起開始預購,至6/30 為止,交車日期則將從7 月開始。如果是學生,則會有分期優惠。

    (合作媒體:。圖片出處:TechNews;首圖來源:Gogoro)

    本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理

    【其他文章推薦】

    ※帶您來了解什麼是 USB CONNECTOR  ?

    ※自行創業缺乏曝光? 網頁設計幫您第一時間規劃公司的形象門面

    ※如何讓商品強力曝光呢? 網頁設計公司幫您建置最吸引人的網站,提高曝光率!

    ※綠能、環保無空污,成為電動車最新代名詞,目前市場使用率逐漸普及化

    ※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

    ※教你寫出一流的銷售文案?

  • 印度抗霾害,2030年全面改賣電動車

    印度抗霾害,2030年全面改賣電動車

    在川普總統發出豪語,宣布美國將退出「巴黎氣候協議」的同時,印度能源部門卻宣布,為了對抗日益嚴重的空氣污染,預計在2030 年後印度將只賣電動車。

    CNNMoney 報導,做為開發中國家之一,印度的經濟以驚人速度成長中,但在產業與交通持續發展的情況下,嚴重的空氣污染也隨之而來,根據研究估計,空污每年約造成印度120 萬人因喪命,甚至有醫師如此形容,「在首都新德里呼吸,就像是每天抽10 根菸」。

    不僅是空氣污染,蓬勃發展的經濟也讓印度成為全球第三大石油進口國,每年在石油上花費將近1,500 億美元,電動車發展將能使石油需求大幅下降,因此印度政府宣布,在2030 年後,在印度銷售的每輛汽車都必須仰賴電力,而非石油。

    為了達到目標,印度開始推行「全國電動車計畫」(National Electric Mobility Mission Plan),希望至2020 年時,電動車和混合動力車的年銷量能達到600-700 萬輛,能源部長Piyush Goyal 表示,在電動車市場起步階段,政府會透過經費補助來協助成長,但在那之後,車商就得仰賴市場需求去推動產能上升。

    對於電動車大廠特斯拉(Tesla)來說,這當然是非常好的消息,儘管特斯拉還並未進入印度市場,但馬斯克(Elon Musk)也隨即在新聞出現後發布了一條推特,稱讚印度政府對於太陽能、電動車等環保能源產業的支持。

    在馬斯克發文後,印度當地最大的電動車商馬璽達(Mahindra)執行長也在推特表示,歡迎特斯拉這個強力的競爭對手盡快加入,「馬斯克你該來了,你不會希望把整個市場都拱手讓給馬璽達吧?人多才熱鬧,也會更加環保。」

    為了改善空污情況,印度政府一直有在嘗試相關措施,在2016 年1 月時,新德里政府就宣布,男子開車必須「做一休一」,允許開車的日數以車牌尾數的奇偶來決定,單身婦女則每日都允許被開車。

    這項規定對減少空污取得了很大成功,但一但市場轉向純電動車,對於環境將會造成更正面的影響,根據世界經濟論壇報導指出,在採取這項計畫後,至2030 年前,印度將有望將碳排放量減少37%。

    (本文由《報》授權提供。照片來源: shared by CC 2.0)

     

    本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理

    【其他文章推薦】

    網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

    網頁設計公司推薦不同的風格,搶佔消費者視覺第一線

    ※想知道購買電動車哪裡補助最多?台中電動車補助資訊懶人包彙整

    南投搬家公司費用,距離,噸數怎麼算?達人教你簡易估價知識!

    ※教你寫出一流的銷售文案?

    ※超省錢租車方案

  • 全長 1,000 公里!澳洲昆士蘭將建可供充電的電動車高速公路

    澳洲昆士蘭 (Queensland) 將在長 1,600 公里的高速公路沿線設置「電動車充電站」,充電時間只需花費 15 至 30 分鐘,預計將成為澳洲第一個運用太陽能提供電動車快速充電站的省。   此項計畫的第一個充電站會座落在湯斯維爾,後續其他地點則將沿著全長 1,600 公里長的布魯斯高速公路(Bruce Highway)興建。昆士蘭政府表示,「此項計畫目標是為了「電動高速公路」(electric super highway)揭開序幕,希望能夠提供來往昆士蘭的用路人快速充電服務。 」 這項計畫雖然將會啟用太陽能為主的快速充電站,但沿線依舊會保有傳統的加油站,傳統汽油汽車的用路權益不會受損,而電動車的車主也無需因為路途遙遠而擔心電力問題。    

    本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理

    【其他文章推薦】

    網頁設計公司推薦不同的風格,搶佔消費者視覺第一線

    ※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

    ※自行創業缺乏曝光? 網頁設計幫您第一時間規劃公司的形象門面

    南投搬家公司費用需注意的眉眉角角,別等搬了再說!

    新北清潔公司,居家、辦公、裝潢細清專業服務

    ※教你寫出一流的銷售文案?

  • 寶馬計畫從2013年開始投產i子品牌電動車

    寶馬集團計畫從2013年開始將i子品牌車型投入生產,該品牌為專屬品牌。

    寶馬集團董事長諾伯特·雷瑟夫(Norbert Reithofer)日前表示,公司將集中精力準備i系列新款電動車的生產工作,按照計畫i子品牌將在2013年下半年投放到市場,而投產時間則早於該節點。此前有消息稱該子品牌旗下的i3車型明年將在德國萊比錫(Leipzig)工廠投產,初步產能3萬輛/年。

    2011年2月21日,寶馬正式宣佈發佈i子品牌。根據寶馬注冊商標透露的資訊,車型覆蓋從i1到i9。寶馬官方正式公佈了i3純電動車和i8插電式混動車兩款車型,分別以Megacity Vehicle概念車和Vision EfficientDynamics概念技術為藍本。另外,據悉i1為小型城市電動車,i4為兩座酷派,i5為帶有酷派風格的四門Sedan轎車。i4將在今年11月底洛杉磯車展上亮相。

    此前有傳聞指出,寶馬i專案工程浩大,耗費成本甚巨,導致集團考慮放棄該子品牌。不過寶馬方面否認了該說法。

    本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理

    【其他文章推薦】

    ※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

    新北清潔公司,居家、辦公、裝潢細清專業服務

    ※別再煩惱如何寫文案,掌握八大原則!

    ※教你寫出一流的銷售文案?

    ※超省錢租車方案

    FB行銷專家,教你從零開始的技巧

  • 雷諾計畫批量投產電動汽車Zoe 2013年投放

    法國汽車製造商雷諾最近宣佈計畫將Zoe批量投產,2013年投入市場。

    雷諾最近抱怨其銷售緩慢,人們對Twizy毫無熱情,Zoe也許會是雷諾在電動汽車市場上最後的嘗試。雷諾近日宣佈將Zoe批量投產,於2013年開售。Zoe電動馬達輸出功率可達88馬力(65千瓦),扭矩220牛米(163英尺磅),最大速度可達84 英里/小時。此款車在英國定價為14444英鎊(約合人民幣144296元)。

    Zoe是雷諾最新推出的電動汽車,車上將裝配R-Link多媒體平板電腦、電動氣候控制系統和電池充電器等裝置。雷諾R-Link多媒體平板電腦將配置7英寸的觸屏顯示幕,具有語音辨識系統,可以控制一些主要功能,如,音訊系統、電動汽車駕駛指導系統和Carminat TomTom即時導航系統。

    本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理

    【其他文章推薦】

    新北清潔公司,居家、辦公、裝潢細清專業服務

    ※別再煩惱如何寫文案,掌握八大原則!

    網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

    ※超省錢租車方案

    ※教你寫出一流的銷售文案?

    網頁設計最專業,超強功能平台可客製化

  • 聆風全球銷量42700輛 日產高管稱令人感到“失望”

    日產公司近日發佈了2012財年第二季度報告,日產首席運營官賀俊之稱,目前,日產聆風的全球銷量為42700輛。他同時表示,整體銷量不佳令人感到“失望”。

    截至目前為止,日產聆風在日本的銷量為19000輛,約占全球銷量的一半。日產公司此前制定了2012年在美國銷售2萬輛聆風的目標,雖然現狀與之相距甚遠,但賀俊之堅稱,日產將繼續電動汽車的開發,拓展電動汽車市場。

    賀俊之指出,日產聆風上市兩周年將至,兩年的經驗讓日產公司瞭解了阻礙消費者購買電動汽車的原因、消費者的使用和充電習慣等,這些資訊有利於未來日產團隊採取措施應對相關問題。

    值得一提的是,今年10月份,日產聆風共售出1579輛,較9月份的984輛大幅增加,並遠高於8月份685輛的銷量。正如賀俊之所說,作為第一批大規模生產電動汽車的企業,日產將致力於“零排放”工作,希望民眾能理解日產肩負的重任。

    本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理

    【其他文章推薦】

    ※教你寫出一流的銷售文案?

    ※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

    ※回頭車貨運收費標準

    ※別再煩惱如何寫文案,掌握八大原則!

    ※超省錢租車方案

    ※產品缺大量曝光嗎?你需要的是一流包裝設計!

  • 中國汽車技術研究中心正在制定新能源車碰撞安全標準

    中國汽車技術研究中心副主任高和生日前指出,最大的隱患在於電池,在受到撞擊之後電池會變形、起火甚至爆炸,這對汽車的安全帶來了巨大的隱患,因此中心目前也正在考慮制定新能源汽車的相關安全標準。但並沒有透露具體的出臺時間。

    隨著國家的大力宣導,目前新能源汽車的發展正在逐步提速,雖然私人購車數量不多,但越來越多的新能源汽車已經逐步進入到如計程車等服務領域,而近一段時間頻頻出現的安全問題,也讓人們對新能源汽車產生了擔憂。

    同時高和生透露,C-NCAP未來將把進口車碰撞作為工作重點之一,儘管廠家會很反對,但是本著對消費者負責的態度,我們還是會做這個事情,我們將從當前熱銷的進口車中選擇車型進行碰撞試驗,而銷量很小的車型則不在考慮範圍。

    本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理

    【其他文章推薦】

    ※超省錢租車方案

    ※別再煩惱如何寫文案,掌握八大原則!

    ※回頭車貨運收費標準

    ※教你寫出一流的銷售文案?

    FB行銷專家,教你從零開始的技巧

  • 巴西海岸漏油原因仍是謎 成千上萬志工「挖黑泥」

    巴西海岸漏油原因仍是謎 成千上萬志工「挖黑泥」

    摘錄自2019年10月21日自由時報報導

    巴西日前發生大規模漏油事件後,對當地北部約2100公里、橫跨數州的海岸線造成嚴重破壞,雖已進入調查,但至今漏油原因尚未查明,而當地政府因未積極採取行動,遭當地環保團體抨擊;所幸,已有成千上萬的志工在受污染區域「挖黑泥」,將遍布海灘的「油污」慢慢除去,而這些志工僅在伯南布哥州(Pernambuco)就已經清出30噸油污。

    油污從9月2日開始出現,而這些污染物質經檢驗,已證實為石油原油。海洋學家阿勞霍(Maria Christina Araujo)指出,「此次漏油對受污染區域當地生物的破壞可能將無法彌補,需要數年才能逐漸恢復當地生態系統。」而巴西環境與可再生資源研究所(Ibama)也證實,有15隻海龜和2隻鳥被油污殺死,且有照片佐證這些生物遭黑色油污覆蓋致死,而巴西享譽世界的的珊瑚礁也受到油污的破壞。

    照片來源:Kleber from Burgos / WWF-Brasil

    本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

    【其他文章推薦】

    ※帶您來了解什麼是 USB CONNECTOR  ?

    ※自行創業缺乏曝光? 網頁設計幫您第一時間規劃公司的形象門面

    ※如何讓商品強力曝光呢? 網頁設計公司幫您建置最吸引人的網站,提高曝光率!

    ※綠能、環保無空污,成為電動車最新代名詞,目前市場使用率逐漸普及化

    ※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

    ※教你寫出一流的銷售文案?

  • 上海兩萬張純電動車牌照已開始免費發放

    上海已開始免費發放兩萬張牌照,這是繼廣州之後,又一地方性新能源汽車扶持政策出臺。

    據瞭解,今年8月起廣州開始實行車牌拍賣,但針對新能源車開闢“綠色通道”,可直接申請增量配置指標,不受汽車限牌政策影響。然而,在近期出臺的新能源購車細則中,上海市可謂是最積極的,此次補貼力度非常可觀:上海市本身補貼每輛4萬元,加上中央政府對地方私人購買新能源汽車補貼每輛最高6萬元,以及一塊價值約6萬元的免費汽車“滬”牌,合計相當於一次性補貼16萬元。

    近期全國很多城市都會出臺政策支援新能源汽車,側重點也各不相同。上海補貼力度相對較大,這對新能源汽車及電池類相關企業等上市公司都是利好。據不完全統計,今明兩年預計有40款新能源車密集上市,即將推出新能源車的自主品牌廠家包括上海汽車、比亞迪、吉利、長城等。

    本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理

    【其他文章推薦】

    網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

    網頁設計公司推薦不同的風格,搶佔消費者視覺第一線

    ※想知道購買電動車哪裡補助最多?台中電動車補助資訊懶人包彙整

    南投搬家公司費用,距離,噸數怎麼算?達人教你簡易估價知識!

    ※教你寫出一流的銷售文案?

    ※超省錢租車方案