补充一下,用的框架是SSM框架
画面代码:
<form id="file_form" action="../whiteList/uploadFile" enctype="multipart/form-data" method="post" style="display:none">
<input type="file" id="fileHiden" name="fileHiden" style="display:none" onchange="fileChange()" accept="application/vnd.ms-excel,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"/>
</form>
前台代码:
function fileChange(){
$('#file_form').submit();
}
后台代码:
@RequestMapping("/uploadFile")
@ResponseBody
public String uploadFile(HttpServletRequest request,HttpServletResponse response){
// TODO
request.getParameter("fileHiden");// 拿不到上传文件
}
问题描述:
又查了一天了,由于从来没做过上传,如果有人愿意回答我,可否讲得详细点,给个方向查,已经浪费两天了。
原本的需求是,用户填好数据后,上传一个固定格式的Excel,我要做的是,读取这个EXCEL,再遍历行,到数据库中做个追加。但是查了好多,还是没有头绪。还请大神给个方向,愿意的话,教教我,真的很重要。
现在最先的问题是,我得拿到这个文件,再读取EXCEL。。没悬赏币急死了。。。
是SpringMVC ?
利用spring中提供的MultipartFile接口实现上传功能
MultipartFile类中两个方法区别:
getName : 获取表单中文件组件的名字
getOriginalFilename : 获取上传文件的原名
transferTo(File newFile);把上传的文件转存到指定文件中
spring配置文件中加入以下配置:
<!-- SpringMVC上传文件时,需要配置MultipartResolver处理器 -->
<!-- 注意:bean的名字不要改,一定要叫multipartResolver -->
<bean name="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="defaultEncoding" value="UTF-8"/>
<!-- 指定所上传文件的总大小不能超过指定字节大小 -->
<property name="maxUploadSize" value="20000000"/>
</bean>
jsp页面代码:
<form action="upload/test" method="post" enctype="multipart/form-data">
<input type="file" name="file"><br>
<input type="file" name="file"><br>
<input type="submit" value="上传">
</form>
Controller中的代码:
@Controller
@RequestMapping("/upload")
public class UploadController {
@RequestMapping("/show")
public String showUploadPage(){
return "upload";
}
@RequestMapping("/test")
public String upload(@RequestParam("file") MultipartFile[] files, HttpServletRequest request) {
if (files != null && files.length > 0) {
for (MultipartFile file : files) {
// 保存文件
saveFile(request, file);
}
}
// 重定向
return "redirect:/upload/show";
}
private void saveFile(HttpServletRequest request, MultipartFile file) {
// 判断文件是否为空
if (!file.isEmpty()) {
try {
//保存的文件路径
//需要的话可以给文件名上加时间戳
String filePath = request.getServletContext().getRealPath("/") + "upload/"
+ file.getOriginalFilename();
File newFile = new File(filePath);
//文件所在目录不存在就创建
if (!newFile.getParentFile().exists()){
newFile.getParentFile().mkdirs();
}
// 转存文件
file.transferTo(newFile);
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
注意:在上传文件的同时,还可以接收其他正常的单个的值,例如username、age等,同时也可以把这些单个的值自动封装成User对象
你这个是Struts2框架吗?
如果是Struts2的话我做的是 :
jsp:
username: Struts.xml:
<action name="fileDownload" class="com.niit.zsh.actions.UpLoadAction">
<result name="success" type="stream">
<param name="contentDisposition">attachment;filename="通讯录2012年9月4日.xls"</param>
<param name="inputName">downloadFile</param>
</result>
</action>
action:
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionSupport;
public class UpLoadAction extends ActionSupport{
private String username;
//注意,file并不是指前端jsp上传过来的文件本身,而是文件上传过来存放在临时文件夹下面的文件
private File file;
//提交过来的file的名字
private String fileFileName;
//提交过来的file的MIME类型
private String fileContentType;
public String getUsername()
{
return username;
}
public void setUsername(String username)
{
this.username = username;
}
public File getFile()
{
return file;
}
public void setFile(File file)
{
this.file = file;
}
public String getFileFileName()
{
return fileFileName;
}
public void setFileFileName(String fileFileName)
{
this.fileFileName = fileFileName;
}
public String getFileContentType()
{
return fileContentType;
}
public void setFileContentType(String fileContentType)
{
this.fileContentType = fileContentType;
}
@Override
public String execute() throws Exception
{
String root = ServletActionContext.getServletContext().getRealPath("/upload");
InputStream is = new FileInputStream(file);
OutputStream os = new FileOutputStream(new File(root, fileFileName));
System.out.println("fileFileName: " + fileFileName);
// 因为file是存放在临时文件夹的文件,我们可以将其文件名和文件路径打印出来,看和之前的fileFileName是否相同
System.out.println("file: " + file.getName());
System.out.println("file: " + file.getPath());
byte[] buffer = new byte[500];
int length = 0;
while(-1 != (length = is.read(buffer, 0, buffer.length)))
{
os.write(buffer);
}
os.close();
is.close();
return SUCCESS;
}
}