关于JSP画面上传Excel到服务器的问题

补充一下,用的框架是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。。没悬赏币急死了。。。

3个回答

是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对象
stoneofapp
stone_shigz 回复linweijianzero: 不是ajax哪有回调? 可以在response中放个 在页面取出来
2 年多之前 回复
linweijianzero
linweijianzero 您好,上传已经成功了,我想问您一下,表单提交方式有回掉函数吗?或者有啥办法回调一下吗?想打个结果出来
2 年多之前 回复

你这个是Struts2框架吗?

linweijianzero
linweijianzero SSM框架。
2 年多之前 回复

如果是Struts2的话我做的是 :

jsp:

   username:
file:
    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;
    }

}

linweijianzero
linweijianzero 先谢谢您,但是关系好像不大
2 年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问