一,前言
我們在開發web項目時,大多數情況下要處理文件上傳的業務,如果將文件直接存在在項目路徑下的話,會造成很多問題,比如說,導致項目文件過大、部署更新的版本需要重新拷貝文件、文件不能再項目之間共享等,那麼我們怎麼將文件放在項目之外的位置呢?我們往下看。
二、配置Tomcat
如果我們將項目文件部署在tomcat中,我們可以通過配置tomcat的虛擬路徑來達到上傳文件與項目路徑相分離的目的。我們以上傳圖片文件爲例。我們打開conf文件夾下面的server.xml。在<Host>
標籤下面添加<Context path="/springStudy/image" docBase="G:\\tomcatupload ></Context>
,這個配置表示在瀏覽器上訪問域名/springStudy/image
時,實際訪問的路徑是G:\tomcatupload
。筆者在這裏將項目放在了非tomcat的webapp文件夾下。可以在增加一個<Context path="/springStudy" docBase="G:\\springStudy" ></Context>
。完整代碼如下所示:
<Host name="localhost" appBase="webapps"
unpackWARs="true" autoDeploy="true">
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="localhost_access_log" suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
<!--配置上傳圖片的虛擬路徑-->
<Context path="/springStudy/image" docBase="G:\\tomcatupload ></Context>
<!--配置項目的虛擬路徑-->
<Context path="/springStudy" docBase="G:\\springStudy" ></Context>
</Host>
三、代碼實現
controller層代碼如下
@Value("#{fileUpLoader.imgPath}")
String path;
@RequestMapping(value = "/multifiles")
public void receivefiles(HttpServletRequest request, HttpServletResponse response, @ModelAttribute UploadFile uploadFile, BindingResult bindingResult,Model model){
System.out.println("收到請求");
MultipartFile multipartFile=uploadFile.getMultipartFile();
String filename=multipartFile.getOriginalFilename();
try{
System.out.println(request.getServletContext().getRealPath("/image"));
// path="G:tomcatupload"
File file=new File(path,filename);
if(!file.exists()){
}
multipartFile.transferTo(file);
}catch (IOException e){
e.printStackTrace();
}
}
配置文件:
spring-mvc配置:
<bean id="fileUpLoader" class="org.springframework.beans.factory.config.PropertiesFactoryBean">
<property name="location" value="classpath:fileupload.properties"/>
</bean>
效果如圖:
四、IDEA配置
以上的方法是直接修改tomcat的配置文件,如果我們在IDEA中配置,又不想影響到tomcat的自身配置,我們可以配置一下服務器:
,
這樣在IDEA中啓動項目就可以了。