ssm框架下的SpringMVC上傳檔案的三種方式
commonsmultipartresolver 的原始碼,可以研究一下 點我
前端程式碼:
<%@ 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>
</head>
<body>
<form name="serForm" action="/SpringMVC006/fileUpload" method="post" enctype="multipart/form-data">
<h1>採用流的方式上傳檔案</h1>
<input type="file" name="file">
<input type="submit" value="upload"/>
</form>
<form name="Form2" action="/SpringMVC006/fileUpload2" method="post" enctype="multipart/form-data">
<h1>採用multipart提供的file.transfer方法上傳檔案</h1>
<input type="file" name="file">
<input type="submit" value="upload"/>
</form>
<form name="Form2" action="/SpringMVC006/springUpload" method="post" enctype="multipart/form-data">
<h1>使用spring mvc提供的類的方法上傳檔案</h1>
<input type="file" name="file">
<input type="submit" value="upload"/>
</form>
</body>
</html>
配置程式碼:
<!-- 多部分檔案上傳 -->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!-- 上傳圖片最大大小100M(5M 5242440)-->
<property name="maxUploadSize" value="104857600" />
<property name="maxInMemorySize" value="4096" />
<!-- 設定預設編碼 -->
<property name="defaultEncoding" value="UTF-8"></property>
</bean>
pom新增依賴:
<!-- 檔案上傳 -->
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3</version>
</dependency>
後臺程式碼:
方式一:
/*
* 通過流的方式上傳檔案
* @RequestParam("file") 將name=file控制元件得到的檔案封裝成CommonsMultipartFile 物件
*/
@RequestMapping("fileUpload")
public String fileUpload(@RequestParam("file") CommonsMultipartFile file) throws IOException {
//用來檢測程式執行時間
long startTime=System.currentTimeMillis();
System.out.println("fileName:"+file.getOriginalFilename());
try {
//獲取輸出流
OutputStream os=new FileOutputStream("E:/"+new Date().getTime()+file.getOriginalFilename());
//獲取輸入流 CommonsMultipartFile 中可以直接得到檔案的流
InputStream is=file.getInputStream();
int temp;
//一個一個位元組的讀取並寫入
while((temp=is.read())!=(-1))
{
os.write(temp);
}
os.flush();
os.close();
is.close();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
long endTime=System.currentTimeMillis();
System.out.println("方法一的執行時間:"+String.valueOf(endTime-startTime)+"ms");
return "/success";
}
方式二:
/*
* 採用file.Transto 來儲存上傳的檔案
*/
@RequestMapping("fileUpload2")
public String fileUpload2(@RequestParam("file") CommonsMultipartFile file) throws IOException {
long startTime=System.currentTimeMillis();
System.out.println("fileName:"+file.getOriginalFilename());
String path="E:/"+new Date().getTime()+file.getOriginalFilename();
File newFile=new File(path);
//通過CommonsMultipartFile的方法直接寫檔案(注意這個時候)
file.transferTo(newFile);
long endTime=System.currentTimeMillis();
System.out.println("方法二的執行時間:"+String.valueOf(endTime-startTime)+"ms");
return "/success";
}
方式三:
/*
*採用spring提供的上傳檔案的方法
*/
@RequestMapping("springUpload")
public String springUpload(HttpServletRequest request) throws IllegalStateException, IOException
{
long startTime=System.currentTimeMillis();
//將當前上下文初始化給 CommonsMutipartResolver (多部分解析器)
CommonsMultipartResolver multipartResolver=new CommonsMultipartResolver(
request.getSession().getServletContext());
//檢查form中是否有enctype="multipart/form-data"
if(multipartResolver.isMultipart(request))
{
//將request變成多部分request
MultipartHttpServletRequest multiRequest=(MultipartHttpServletRequest)request;
//獲取multiRequest 中所有的檔名
Iterator iter=multiRequest.getFileNames();
while(iter.hasNext())
{
//一次遍歷所有檔案
MultipartFile file=multiRequest.getFile(iter.next().toString());
if(file!=null)
{
String path="E:/springUpload"+file.getOriginalFilename();
//上傳
file.transferTo(new File(path));
}
}
}
long endTime=System.currentTimeMillis();
System.out.println("方法三的執行時間:"+String.valueOf(endTime-startTime)+"ms");
return "/success";
}
我們看看測試上傳的時間:
第一次我用一個4M的檔案:
fileName:test.rar
方法一的執行時間:14712ms
方法二的執行時間:5ms
方法三的執行時間:4ms
第二次:我用一個50M的檔案
方式一進度很慢,估計得要個5分鐘
方法二的執行時間:67ms
方法三的執行時間:80ms
從測試結果我們可以看到:用springMVC自帶的上傳檔案的方法要快的多!
對於測試二的結果:可能是方法三得挨個搜尋,所以要慢點。不過一般情況下我們是方法三,因為他能提供給我們更多的方法。
附檔案:
package com.datebook.web;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.apache.commons.io.FileUtils;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
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.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;
import org.springframework.web.servlet.ModelAndView;
import com.datebook.common.JsonResult;
import com.datebook.common.ResultCode;
@RestController
@RequestMapping("/file")
public class FileController {
// 上傳新的影象,刪除原來的影象
/* UserInfoBean item = userService.loadUserInfoByUid(tmpuser.getUid());
* File df = new File(rootPath + item.getImgpath());
if (df.exists()) {
df.delete();
}*/
/**
* 單檔案上傳
*/
@RequestMapping("/oneFileUpload")
public JsonResult singleFileUpload(@RequestParam("file1")MultipartFile file1,HttpServletRequest request) throws Exception, IOException {
String filePath = request.getServletContext().getRealPath("upload");
String filename = file1.getOriginalFilename();
System.out.println("----------------------"+filePath+"------------------------");
File targetFile = new File(filePath,filename);
if (!targetFile.exists()) {
targetFile.mkdirs();
}
// 儲存
try {
file1.transferTo(targetFile);
} catch (Exception e) {
e.printStackTrace();
}
//檔案路徑
String fullPath = targetFile.getPath();
String path = "upload/" + filename;
Map<String, Object> map = new HashMap<>();
map.put("filePath", path);
map.put("fullPath", fullPath);
return new JsonResult(ResultCode.SUCCESS,"success",map);
}
/**
* 多檔案上傳
*/
@RequestMapping("/multipleFileUpload")
public JsonResult multipleFileUpload(@RequestParam("files")MultipartFile[] files,HttpServletRequest request) throws Exception, IOException {
String filePath = request.getServletContext().getRealPath("upload");
System.out.println("----------------------"+filePath+"------------------------");
List<String> path = new ArrayList<>();
List<String> fullPath = new ArrayList<>();
for(MultipartFile file:files){
String filename = file.getOriginalFilename();
File targetFile = new File(filePath,filename);
if (!targetFile.exists()) {
targetFile.mkdirs();
}
// 儲存
try {
file.transferTo(targetFile);
} catch (Exception e) {
e.printStackTrace();
}
/* String path1 = "upload/" + filename;
String path2 = targetFile.getPath();*/
path.add("upload/" + filename);
fullPath.add(targetFile.getPath());
}
Map<String, Object> map = new HashMap<>();
map.put("filePath", path);
map.put("fullPath", fullPath);
return new JsonResult(ResultCode.SUCCESS,"success",map);
}
/**
* 流上傳
*/
@RequestMapping(value = "requestFile", method = RequestMethod.POST)
public ModelAndView handleRequest(HttpServletRequest request,HttpServletResponse response) throws Exception {
// 轉型為MultipartHttpRequest:
MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
// 獲得檔案:
MultipartFile file = multipartRequest.getFile("file");
// 獲得檔名:
String filename = file.getOriginalFilename();
// 獲得輸入流:
InputStream input = file.getInputStream();
// 寫入檔案
file.transferTo(new File("E://"+filename));
System.out.println(filename);
return null;
}
@RequestMapping("/fileDownload1")
public ResponseEntity<byte[]> filedDownload1() throws IOException {
//下載檔案路徑
String path="E:\\xiaomao.jpg";
File file=new File(path);
HttpHeaders headers = new HttpHeaders();
//下載顯示的檔名,解決中文名稱亂碼問題
String fileName=new String("小貓.jpg".getBytes("UTF-8"),"iso-8859-1");
//通知瀏覽器以attachment(下載方式)開啟圖片
headers.setContentDispositionFormData("attachment", fileName);
//application/octet-stream : 二進位制流資料(最常見的檔案下載)
headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
return new ResponseEntity<byte[]>(FileUtils.readFileToByteArray(file),headers, HttpStatus.CREATED);
}
@RequestMapping("/fileDownload2")
public void fileDownload2(HttpServletRequest request,HttpServletResponse response) throws Exception{
//模擬檔案,xiaomao.jpg為需要下載的檔案
String fileName = request.getSession().getServletContext().getRealPath("upload")+"/xiaomao.jpg";
//獲取輸入流
InputStream bis = new BufferedInputStream(new FileInputStream(new File(fileName)));
//假如以中文名下載的話
String filename = "xiaomao.jpg";
//轉碼,免得檔名中文亂碼
filename = URLEncoder.encode(filename,"UTF-8");
//設定檔案下載頭
response.addHeader("Content-Disposition", "attachment;filename=" + filename);
//1.設定檔案ContentType型別,這樣設定,會自動判斷下載檔案型別
response.setContentType("multipart/form-data");
BufferedOutputStream out = new BufferedOutputStream(response.getOutputStream());
int len = 0;
while((len = bis.read()) != -1){
out.write(len);
out.flush();
}
out.close();
}
}
相關推薦
ssm 框架下的上傳文件功能
quest let mail body ring upload gem 擴展 stream 這兩天在弄上傳文件(圖片或視頻)的功能 ,特記錄於此,其核心是字符串的拼接路徑。要求是:服務器上(Tomcat為例)保存上傳的圖片或視頻,數據庫中插入相對路徑。數據庫中的A表設置一個
python檔案上傳的三種方式
def upload(request): return render(request, 'upload.html') def upload_file(request): username = request.POST.get('username') fafafa
ssm框架下的SpringMVC上傳檔案的三種方式
commonsmultipartresolver 的原始碼,可以研究一下 點我 前端程式碼: <%@ page language="java" contentType="text/html; charset=utf-8" pageEncodin
SpringMVC上傳檔案的三種方法
直接上程式碼吧,大夥一看便知 這時:commonsmultipartresolver 的原始碼,可以研究一下 http://www.verysource.com/code/2337329_1/commonsmultipartresolver.java.html 前臺:
SpringMVC上傳檔案的三種方式
直接上程式碼吧,大夥一看便知 前臺: <%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%> <!DOCTYPE html
springMVC上傳檔案,MultipartHttpServletRequest、MultipartFile進行檔案上傳
這裡使用apache的開源jar包完成上傳功能,使用jar包分別是:common-fileupload.jar和common-io.jar 先編寫上傳檔案幫助類,如果需要區分檔案型別,可以將檔案字尾擷取進行判斷; springmvc-mvc.xml配置,這裡主要配置spri
springmvc 上傳檔案的時候.The request sent by the client was syntactically incorrect
出現這個問題的原因,下面這篇文章已經講得很清楚的。 http://blog.csdn.net/kunkun378263/article/details/41863101 我遇到的場景是:MultipartFile上傳檔案,提交表單的時候除了上傳檔案還有幾個數字。我們知
springboot/springmvc上傳檔案(CommonsMultipartResolver)
上一篇博文講到了(Servlet3.0支援)的檔案上傳:https://blog.csdn.net/frozenpower/article/details/81141297 這篇我們來看可配置的檔案上傳解析器CommonsMultipartResolver CommonsMultipartR
在windows下如何上傳檔案到linux
和把大象放進冰箱需要的步數一樣:) 1.工具和材料 xshell 上傳檔案的壓縮包(我使用的是壓縮包,其它型別沒試過) 2.使用命令 用xshell連線linux 在xshell中輸入 rz 命令,彈出一個對話方塊,選擇上傳檔案
SpringMVC上傳檔案(圖片)並儲存到本地
SpringMVC上傳檔案(圖片)並儲存到本地 小記一波~ 基本的MVC配置就不展示了,這裡給出核心程式碼 在spring-mvc的配置檔案中寫入如下配置 <bean id="multipartResolver" class="org.springframewor
Springmvc上傳檔案
SpringMVC上傳檔案 <!-- 頁面檔案上傳三要素 --> <form action="/uploadFile.do" method="post" enctype="multipart/form-data"> <input
利用SpringMVC上傳檔案的Demo
前言: 檔案的上傳功能也在網站中發揮著不可替代的作用,這裡我就來講講簡單利用SpringMVC實現檔案的上傳。 這裡我的配置是這樣的: idea+maven+tomcat9+jdk8 我也將該專案的D
SpringMVC上傳檔案出現400 Bad Request錯誤
1.起因 寫了上傳檔案程式碼,用postman測試一下報400 Dad Request。 2.原因 看了下資料瞭解到使用SpringMVC上傳檔案需要在form表單中新增enctype="mult
記錄一個解決了一個晚上加一個白天的問題,關於springMVC上傳檔案的功能
在做檔案上傳功能,用到了springMVC的這個類 import org.springframework.web.multipart.MultipartFile; 但是不管前臺怎麼傳檔案的值都過不去,查了下需要在wen.xml 建立bean <bean
springmvc上傳檔案出現400錯誤
1.程式碼如下:在上傳的時候出現400錯誤。 public AjaxJson saveSchoolProfile( SchoolProfileBean schoolProfileBean, @RequestParam(required = false) MultipartFile logo, @
springboot框架下的上傳下載
專案接觸到新的框架技術:springboot+angularjs+bootstrap 其中稍微有點難度的就屬於上傳下載了 1,上傳檔案 前端樣式如上所示,點選"匯入模板檔案",瀏覽選擇檔案,點選“匯入”則上傳檔案資訊到伺服器,當上傳成功後,在右側顯示檔名,並且提供下載功
檔案上傳時報如下錯誤springmvc上傳檔案報錯org.springframework.beans.BeanInstantiationException
在用springmvc+mybatis進行專案開發時,上傳檔案拋異常.. org.springframework.beans.BeanInstantiationException: Could not instantiate bean class [org.springframework.web
ssm框架實現圖片上傳並顯示(myeclips)
ssm框架實現圖片上傳並顯示 第一步:匯入common-io以及common-fileupload兩個jar包,儘量新一點,老的有可能出錯 第二步:配置圖片上傳儲存的位置,針對myeclips來說,開啟檔案D:\Java\MyEclipse.metadata.me_tcat\co
Error creating bean with name 'multipartResolver' SpringMVC 上傳檔案異常
HTTP Status 500 - Servlet.init() for servlet springmvc threw exception type Exception report message Servlet.init() for servlet springmvc threw exce
Python下ftp上傳檔案linux伺服器
模組介紹: 1 from ftplib import FTP 2 ftp = FTP() #設定變數 3 ftp.set_debuglevel(2) #開啟除錯級別2 顯示詳細資訊 4 ftp.connect("IP", "port") #連線ftp, IP和埠