加入两个jar包,commons-fileupload-1.3.jar、commons-io-1.2.jar
jsp:
<form id="test" enctype="multipart/form-data" method="post">
选择文件:<input data-role="none" type="file" name="file" width="120px">
<button data-role="none" onclick="testUpload();">测试</button>
</form>
js:
function testUpload(){
var form = new FormData(document.getElementById("test"));
var url = ctx + "/policy/saleIncentiveQuery/test.do"; //这里的“项目访问路径”要改为你自己的路径
$.ajax({
url : url,
data : form,
type : 'post',
processData:false,
contentType:false,
success : function(data){
alert("成功")
},
error : function(data){
}
});
}
方法一:用springMvc multipartResolver实现文件上传
1.在配置文件applicationContext.xml加上以下配置
<!-- 定义文件解释器(文件上传) -->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!-- 设置默认编码 -->
<property name="defaultEncoding" value="utf-8"></property>
<!-- 上传文件最大大小1M-->
<property name="maxUploadSize" value="1048576"></property>
</bean>
2、Controller层写java代码
import java.io.File;
import java.io.IOException;
import javax.servlet.http.HttpServletRequest;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;
@Controller
public class SaleIncentiveQueryController{
@RequestMapping("/policy/saleIncentiveQuery/test.do")
public String test(MultipartFile file,HttpServletRequest request) throws IOException{
//上传路径
String path = request.getSession().getServletContext().getRealPath("/upload");
//获取上传文件名
String fileName = file.getOriginalFilename();
System.out.println("fileName>>"+fileName);
File dirFile = new File(path, fileName);
System.out.println("dir.exists()>>"+dirFile.exists());
if(!dirFile.exists()){
dirFile.createNewFile();
}
//MultipartFile自带的解析方法,transferTo(File file)方法其实是封装了下面的这些代码,我习惯自己写缓存输入输出流来处理
//file.transferTo(dirFile);
InputStream input = file.getInputStream();
FileOutputStream output = new FileOutputStream(dirFile);
byte[] bt = new byte[1024*1024];
int len = 0;
while((len = input.read(bt)) != -1) {
output.write(bt, 0, len);
}
input.close();
output.flush();
output.close();
return "ok";
}
}
这样前台上传的文件就能上传到服务器指定目录下了,如果一次性上传多个,参数中就用MultipartFile[] 来接收,循环输入输出到指定路径就行了。
方法二:用ServletFileUpload实现文件上传
说明:上面的方法一springMVC其实是重新处理了HttpServletRequest request,源码中实际上就是用ServletFileUpload实现的文件上传
下面直接用ServletFileUpload实现文件上传
1.首先把上面在配置文件applicationContext.xml加上的配置删掉
2.Controller层写java代码
@RequestMapping("/policy/saleIncentiveQuery/test.do")
public String test( HttpServletRequest request){
try {
DiskFileItemFactory factory = new DiskFileItemFactory();
// 设置缓冲区大小,这里是4kb
factory.setSizeThreshold(4096);
ServletFileUpload upload = new ServletFileUpload(factory);
// 解决文件名称乱码
upload.setHeaderEncoding("utf-8");
// 设置最大文件尺寸,这里是10MB
upload.setSizeMax(10485760);
String path = request.getSession().getServletContext().getRealPath("/upload");
List<FileItem> itemsList = upload.parseRequest(request);
for(int i = 0; i < itemsList.size(); i++) {
FileItem fileItem = itemsList.get(i);
String fileName = fileItem.getFieldName();
File dirFile = new File(path, fileName);
System.out.println("dir.exists()>>"+dirFile.exists());
if(!dirFile.exists()){
dirFile.createNewFile();
}
System.out.println("dir.exists()>>"+dirFile.exists());
InputStream inputStream = fileItem.getInputStream();
FileOutputStream outputStream = new FileOutputStream(dirFile);
int len = 0;
byte[] bt = new byte[1024*1024];
while((len = inputStream.read(bt)) != -1) {
outputStream.write(bt, 0, len);
}
inputStream.close();
outputStream.flush();
outputStream.close();
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
网友评论