javamvc附件上傳
㈠ spring mvc 怎麼大小上傳文件控制
1、SpringMVC的配置文件裡面可以配置限制上傳文件的大小,比如40MB,但是,如果在頁面上上傳超過40MB ,則他都不進入到Action,則直接就報錯了。被攔截了。
2、客戶端判斷的話,IE8、IE9、火狐好像支持都不一樣,有說用Flash的,有說用HTML5的,
個人感覺HTML5不太靠譜,畢竟現在的應用肯定是要支持IE8、IE9的。
㈡ java實現文件上傳,代碼盡量簡潔~~~~~·
你說的2種方法都是很簡單的,參考網上的資料都不難做出,用io流做更是基礎中的基礎,我說下smartupload好了,有的人是直接寫在jsp上面,感覺比較亂,我一般都是寫在action裡面,打好jar包和配置後
SmartUpload mySmartUpload = new SmartUpload();
//如果是struts2.0或者webwork 則是mySmartUpload.initialize(ServletActionContext.getServletConfig(),ServletActionContext.getRequest(),ServletActionContext.getResponse());
mySmartUpload.initialize(servlet.getServletConfig(), request,response);
mySmartUpload.setTotalMaxFileSize(500000);
//如果上傳任意文件不設置mySmartUpload.setAllowedFilesList(文件後綴名)就可以了
mySmartUpload.upload();
for (int i = 0; i < mySmartUpload.getFiles().getCount(); i++) {
com.jspsmart.upload.File file = mySmartUpload.getFiles().getFile(i);
if (file.isMissing()) continue;
file.saveAs(保存的地址 + file.getFileName(),
su.SAVE_PHYSICAL);
㈢ SpringMVC使用commons fileupload 上傳文件,parseRequest(request)得到的集合為空,急等大神指點。
既然你已經用了Spring MVC,就沒有必要自己寫上傳的代碼了,這樣做
下一個這樣的方法,把MultipartFile傳進去
public String upload(@RequestParam(value = "image") MultipartFile image)
然後就可以這樣做了
image.transferTo(new File("想要保存到哪裡"));
image還有其他的方法,自己看一下就可以了
XML配置一個bean
<bean id="multipartResolver"
class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="maxUploadSize" value="104857600" />
<property name="maxInMemorySize" value="4096" />
<property name="defaultEncoding" value="utf-8" />
</bean>
㈣ spring mvc 多文件上傳時報錯MultipartHttpServletRequest
1、確認<form name="contractForm" id="contractForm" action="" method="post" enctype ="multipart/form-data">;
2、確認commons-fileupload.jar 和 org.springframework.web.jar 存在環境
3、MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest)request;
這一句會報錯:ApplicationHttpRequest cannot be cast to MultipartHttpServletRequest
解決辦法是通過這種方式:
MultipartResolver resolver = new CommonsMultipartResolver(request.getSession().getServletContext());
MultipartHttpServletRequest multipartRequest = resolver.resolveMultipart(request);
㈤ 求SpringMVC大文件上傳詳解及實例代碼
SpringMVC的文件上傳非常簡便,首先導入文件上傳依賴的jar:
<!-- 文件上傳所依賴的jar包 -->
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.1</version>
</dependency>
在springMVC-servlet.xml配置文件中配置文件解析器:
<!--1*1024*1024即1M resolveLazily屬性啟用是為了推遲文件解析,以便捕獲文件大小異常 -->
<!--文件上傳解析器-->
<bean id="multipartResolver"
class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="maxUploadSize" value="1048576"/>
<property name="defaultEncoding" value="UTF-8"/>
<property name="resolveLazily" value="true"/>
</bean>
注意解析器的id必須等於multipartResolver,否則上傳會出現異常
import org.apache.commons.io.FileUtils;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.commons.CommonsMultipartFile;
import java.io.File;
@Controller
public class FileController {
/**
* 上傳單個文件操作
* MultipartFile file就是上傳的文件
* @return
*/
@RequestMapping(value = "/upload1.html")
public String fileUpload1(@RequestParam("file") MultipartFile file) {
try {
//將上傳的文件存在E:/upload/下
FileUtils.InputStreamToFile(file.getInputStream(), new File("E:/upload/",
file.getOriginalFilename()));
} catch (Exception e) {
e.printStackTrace();
}
//上傳成功返回原來頁面
return "/file.jsp";
}}
上傳文件時,Controller的方法中參數類型是MultipartFile即可將文件映射到參數上。
頁面:
file.jsp:
<form method="post" action="/upload1.html" enctype="multipart/form-data">
<input type="file" name="file"/>
<button type="submit" >提交</button>
</form>
㈥ ueditor 怎麼自定義上傳文件的路徑啊求指導,,最好是有源碼
UEditor是由網路WEB前端研發部開發的所見即所得的開源富文本編輯器,具有輕量、可定製、用戶體驗優秀等特點。
開源基於BSD協議,所有源代碼在協議允許范圍內可自由修改和使用。
網路UEditor的推出,可以幫助不少網站開發者在開發富文本編輯器所遇到的難題,節約開發者因開發富文本編輯器所需要的大量時間,有效降低了企業的開發成本。
優點
1、體積小巧,性能優良,使用簡單
2、分層架構,方便定製與擴展
3、滿足不同層次用戶需求,更加適合團隊開發
4、豐富完善的中文文檔
5、多個瀏覽器支持:Mozilla, MSIE, FireFox, Maxthon,Safari 和Chrome
6、更好的使用體驗
7、擁有專業QA團隊持續支持,已應用在網路各大產品線上
使用步驟
1.添加jar包 jar包位置:文件根目錄下jsp的lib文件夾下,把jar包復制到web-inf下的lib文件夾下buildpath
2.修改config.js中的URL路徑,修改為UEidtor插件在自己工程中的正確根路徑
3.在jsp文件中先引入配置文件config.js然後再源碼文件all.js(注意順序)
4.載入容器和實例化容器
1.修改config.js配置文件URL為插件根目錄,一般是絕對路徑。
2.修改config.json中上傳圖片配置項中的訪問路徑前綴為項目名稱,根據情況修改上傳文件路徑和訪問路徑。
配置正確之後UEditor有上傳功能幫助我們上傳圖片。
但是上傳路徑會在項目部署的臨時文件夾下。 tomcat取消部署後,上傳文件就會和項目部署文件一起被刪除
3.實現把圖片上傳到自定義路徑
在處理上傳後的文件名稱的時候注意不要出現中文
要不然還需要做處理才能正確讀取文件!
4.(1)首先在jsp中覆蓋UEidtor獲取路徑的方法
//覆蓋UEditor中獲取路徑的方法
UE.Editor.prototype._bkGetActionUrl = UE.Editor.prototype.getActionUrl;
UE.Editor.prototype.getActionUrl = function(action) {
//判斷路徑 這里是config.json 中設置執行上傳的action名稱
if (action == 'uploadimage') {
return 'http://localhost:8080/maven-web/uploadImage.do';
} else if (action == 'uploadvideo') {
return '';
} else {
return this._bkGetActionUrl.call(this, action);
}
}
(2)首先在springmvc配置文件中配置
<!-- 上傳配置 -->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="defaultEncoding" value="UTF-8"></property>
</bean>
在controller中定義上傳和讀取文件的方法
/**
* SpringMVC 用的是 的MultipartFile來進行文件上傳
* 這里用@RequestParam()來指定上傳文件為MultipartFile
* @throws IOException
*/
@RequestMapping("uploadImage")
@ResponseBody//這里upfile是config.json中圖片提交的表單名稱
public Map<String,String> uploadImage(@RequestParam("upfile") CommonsMultipartFile upfile,HttpServletRequest request) throws IOException{
//文件原名稱
String fileName=upfile.getOriginalFilename();
//為了避免重復簡單處理
String nowName=new Date().getTime()+"_" + fileName;
if(!upimage.isEmpty()){
//上傳位置路徑
String path0 = "D:\\eclipseworkspace\\maven-web\\src\\main\\webapp\\upload\\"+nowName;
//按照路徑新建文件
File newFile = new File(path0);
//復制
FileCopyUtils.(upimage.getBytes(), newFile);
}
//返回結果信息(UEditor需要)
Map<String,String> map = new HashMap<String,String >();
//是否上傳成功
map.put("state", "SUCCESS");
//現在文件名稱
map.put("title", nowName);
//文件原名稱
map.put("original", fileName);
//文件類型 .+後綴名
map.put("type", fileName.substring(upfile.getOriginalFilename().lastIndexOf(".")));
//文件路徑
map.put("url", "/"+nowName+"/getImage.do");
//文件大小(位元組數)
map.put("size", upfile.getSize()+"");
return map;
}
/**
* 讀取文件
*/
@RequestMapping("{imgName}/getImage")
public void readImg(@PathVariable("imgName") String imgName, HttpServletResponse response)
throws Exception {
//設置文件的返回類型
response.setContentType("image/*");
//文件路徑(windows下是\\,linux下是//,都必須是絕對路徑)
String imgPath="D:\\eclipseworkspace\\maven-web\\src\\main\\webapp\\upload\\"+imgName;
//java中用File類來表示一個文件
File image = new File(imgPath);
//測試這個文件路徑是否存在(也就是這個文件是否存在)
if (!image.exists()) {
return;
}
//FileUtils.readFileToByteArray(File file)把一個文件轉換成位元組數組返回
response.getOutputStream().write(FileUtils.readFileToByteArray(image));
//java在使用流時,都會有一個緩沖區,按一種它認為比較高效的方法來發數據:
//把要發的數據先放到緩沖區,緩沖區放滿以後再一次性發過去,而不是分開一次一次地發.
//而flush()表示強制將緩沖區中的數據發送出去,不必等到緩沖區滿.
response.getOutputStream().flush();
response.getOutputStream().close();
}
㈦ Java SpringBoot本地上傳文件到resources目錄永久保存下載的最佳實踐
在Java SpringBoot項目中,為了實現本地文件上傳並永久保存以便前端下載,最佳實踐是將文件存儲在resources目錄下,並結合target/classes目錄。以下是具體步驟:首先,通過ResourceUtils.getURL("classpath:").getPath()獲取target/classes目錄的絕對路徑,前端上傳的文件應保存在此目錄下的子目錄,如upload/logo.jpg,返回的下載地址格式為http://localhost:8080/upload/logo.jpg。
然而,target目錄的變動性和不提交到代碼倉庫會導致文件丟失。這時,將文件保存在resources/upload目錄下更為合適,因為這個目錄通常會被提交到版本控制。每次上傳後,文件會自動同步到target/classes目錄,以實現實時訪問,但手動編譯運行會較為繁瑣。
為解決這個問題,可以結合target和resources目錄。使用System.getProperty("user.dir")獲取項目工作目錄,然後拼接資源目錄路徑。同時,需要檢查application.yml、pom.xml和WebMvcConfiguration中的相關配置,確保靜態資源正確映射和訪問。
當接收前端上傳的File對象時,直接保存到第一個目錄(如resources/upload),然後使用Spring的FileCopyUtils.方法復制到target/classes目錄,以實現文件的持久保存和實時訪問。
以下是一些關鍵代碼和配置示例:
- UploadFileUtil.java
- application.yml
- WebMvcConfiguration
在實際操作中,Controller層需要處理文件上傳的邏輯,包括接收到File對象,保存到資源目錄,並確保配置正確,以便前端能夠順利訪問。
㈧ 如何深入 spring mvc
SpringMVC是一個輕量級的MVC框架,SpringMVC由於其輕量級的實現以及與Spring框架的無縫整合等諸多優勢,近年來在MVC框架中脫穎而出,受到諸多開發人員的青睞,學習SpringMVC勢在必行。
Web環境中使用SpringMVC:SpringMVC提供了可插拔式的框架嵌入形式,將SpirngMVC插入或者從Web項目中卸載只需要簡單的修改配置文件即可。
配置前端控制器,SpringMVC的入口程序為一個全局的Servlet,該Servlet攔截指定的一組請求交給SpringMVC框架執行後續的處理操作,在Web.xml中配置如下欄位。
<!--SpingMVC的前端控制器-->
<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!--配置SpringMVC的IOC容器-->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/root-context.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<!--配置攔截所有的請求-->
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping></span></span>
創建SpringMVC IOC容器的配置文件root-context.xml並定義視圖解析器,位置/WEB-INF/
<!--配置自動掃面的包-->
<context:component-scanbase-package="cn.com.xiaofen"/>
<!--定義視圖解析器-->
<bean
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<propertyname="prefix"value="/WEB-INF/view/"></property>
<propertyname="suffix"value=".jsp"></property>
</bean>
<!--<mvc:default-servlet-handler/><mvc:annotation-driven/>--></span></span>
定義控制器,SpringMVC中定義方法來響應客戶端請求,內存開銷更小效率更高。
@Controller
@RequestMapping("/T")
publicclassT{
@RequestMapping("/t_1")
publicStringt_1(){
System.out.println("t_1");
return"index";
}
}
定義視圖,根據實際的視圖解析器完成相關視圖的配置,當前配置視圖應該在/WEB-INF/view/下且文件類型為JSP文件,具體的應該在該目錄下新建一個名稱為index的jsp文件名稱。
[java]view plain
[java]view plain
[java]view plain
SpringMVC處理請求的工作流:DispatcherServlet作為SpringMVC框架的入口程序,負責調度SpringMVC框架響應用戶的請求,如下圖為宏觀上SpingMVC處理一次請求大概需要經過以下調度過程。
請求進入由前端控制器(DispatcherServlet )攔截。
前端控制器分析請求將請求委託至具體的控制器來處理。
控制器處理請求返回邏輯視圖(Model)。
前端控制器得到邏輯視圖對象,調度視圖解析器,解析視圖模版給用戶響應。
返回前端控制器。
DispatcherServlet調用doDispatch處理請求。
try{
/*邏輯視圖及上文提到的Model*/
ModelAndViewmv=null;
ExceptiondispatchException=null;
try{
/*文件上傳預處理*/
processedRequest=checkMultipart(request);
multipartRequestParsed=(processedRequest!=request);
/*確定當前請求的處理者*/
mappedHandler=getHandler(processedRequest);
/*請求資源未發現*/
if(mappedHandler==null||mappedHandler.getHandler()==null){
noHandlerFound(processedRequest,response);
return;
}
/*確定當前請求的處理者適配器*/
HandlerAdapterha=getHandlerAdapter(mappedHandler.getHandler());
//...............
/*請求調度前應用的攔截器*/
if(!mappedHandler.applyPreHandle(processedRequest,response)){
return;
}
/*調用處理程序*/
mv=ha.handle(processedRequest,response,mappedHandler.getHandler());
//......
/*請求調度後應用的攔截器*/
mappedHandler.applyPostHandle(processedRequest,response,mv);
}
catch(Exceptionex){
dispatchException=ex;
}
/*解析視圖給用戶響應*/
processDispatchResult(processedRequest,response,mappedHandler,mv,dispatchException);
}
理解HandlerMapper,一個HandlerMapper代表一個請求到到處理對象的映射,該對象的創建依據是請求響應關系。getHandler方法部分源碼分析如下。
(HttpServletRequestrequest)throwsException{
遍歷查找滿足條件的HandlerMapping
for(HandlerMappinghm:this.handlerMappings){
if(logger.isTraceEnabled()){
logger.trace(
"Testinghandlermap["+hm+"]inDispatcherServletwithname'"+getServletName()+"'");
}
HandlerExecutionChainhandler=hm.getHandler(request);
if(handler!=null){
存在
returnhandler;
}
}
不存在
returnnull;
}
理解HandlerAapter,SpringMVC 中通過HandlerAdapter的handler方法來調用實際的處理請求的函數。getHandlerAapter 部分源碼如下。
(Objecthandler)throwsServletException{
for(HandlerAdapterha:this.handlerAdapters){
if(logger.isTraceEnabled()){
logger.trace("Testinghandleradapter["+ha+"]");
}
是否支持處理當前的HandlerMapper
if(ha.supports(handler)){
returnha;
}
}
當前的HandlerMapper不能被處理報異常
thrownewServletException("Noadapterforhandler["+handler+
"]:ortsthishandler");
}
Model到視圖,SpringMVC 中ModelAndView保存了邏輯視圖與真實視圖的關系,確定了當前請求為用戶返回的View,processDispatchResult 源碼分析如下。
(HttpServletRequestrequest,HttpServletResponseresponse,
,ModelAndViewmv,Exceptionexception)throwsException{
booleanerrorView=false;
/*處理異常信息*/
if(exception!=null){
if(){
logger.debug("",exception);
mv=((ModelAndViewDefiningException)exception).getModelAndView();
}
else{
Objecthandler=(mappedHandler!=null?mappedHandler.getHandler():null);
mv=processHandlerException(request,response,handler,exception);
errorView=(mv!=null);
}
}
/*渲染視圖,返回響應*/
if(mv!=null&&!mv.wasCleared()){
render(mv,request,response);
if(errorView){
WebUtils.clearErrorRequestAttributes(request);
}
}
else{
if(logger.isDebugEnabled()){
logger.debug("'"+getServletName()+
"':");
}
}
}
SpringMVC請求流程(部分源碼分析):由DispatcherServlet的doService()方法入手,篇幅關系,下文僅列出核心的代碼,下文的代碼並並保證時間上的順序性。
[java]view plain
[java]view plain
[java]view plain
[java]view plain