Javascript 使用Spring将多个文件上载到数据库中

Javascript 使用Spring将多个文件上载到数据库中,javascript,spring,hibernate,Javascript,Spring,Hibernate,我一直在开发一个Spring应用程序,我在上传文件部分遇到了一些问题。 在第一个场景中,我只有一个文件输入类型,它工作得很好,但是我知道我已经添加了一个javascript来添加更多的输入,我真的不知道如何在控制器中处理它 我的JSP看起来像: <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> <%@ page session="false" %> <%@ taglib uri="http

我一直在开发一个Spring应用程序,我在上传文件部分遇到了一些问题。 在第一个场景中,我只有一个文件输入类型,它工作得很好,但是我知道我已经添加了一个javascript来添加更多的输入,我真的不知道如何在控制器中处理它

我的JSP看起来像:

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ page session="false" %>
<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %> 
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <link rel="stylesheet" type="text/css" href="<c:url value="/resources/css/form-upload.css" />" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
    <meta name="description" content="">
    <meta name="viewport" content="width=device-width">
    <link rel="stylesheet" href="http://blueimp.github.com/cdn/css/bootstrap.min.css" />
    <script type="text/javascript" src="<c:url value="/resources/js/css_browser_selector.js"/>"></script>
<script type="text/javascript">
/** 
  A lot of code that make the "magic" of adding one field
*/
</script> 
</head>
<body style="background: white;">
<c:url var="subeUrl" value="/process/doUpload" />
    <form name="file1" method="POST" action="${subeUrl}" enctype="multipart/form-data" class="formulario"> 
        <div id="titulo"><p>Adjuntar archivos</p></div></br>
        <fieldset id="upload-message">
            <table>
                <tbody id="color_contacts">
                     <tr valign="top">
                        <td colspan="5" id="ancho">
                            <div class="file-wrapper">
                                <input type="file" name="filename[0]" id="filename[0]" size="9" value="" />
                                <input name="id_solicitud" type="hidden" value="${id}" />
                                <div id="hideSpan"><span class="buttones">Choose a file</span></div>
                            </div>
                            <div class="for-same">
                                <div class="explorer">
                                    <button onclick="javascript:addColorControl();return false;" class="btn btn-success fileinput-button">
                                    <i class="icon-plus icon-white"></i>
                                    </button>
                                </div>
                            </div>
                        </td>
                     </tr>
                </tbody>
            </table>
            </br>
            <div class="post-form"><input type="submit" value="Subir" name="submit" class="post-form" /></div>
        </fieldset>
    </form>
</body>
</html>

/** 
许多代码使添加一个字段变得“神奇”
*/
副建筑师


选择一个文件
正如您所看到的,表单中的文件名是“filename[index]”

在我的控制器中,我尝试了这一点,但正如你所能想象的,它不起作用:

@RequestMapping(value="/doUpload", method=RequestMethod.POST)
    public String doUpload(HttpServletRequest req, HttpSession session, @RequestParam("filename[]") CommonsMultipartFile[] filename, Map<String, Object> map) throws Exception{

        String cod = (String) session.getAttribute("user");

        File folder = new File("C:/wamp/www/Uploads/"+ cod + "/");
        folder.mkdirs();

        Archivo arc = new Archivo();

        int a = 0;
        if (filename[a] != null && filename[a].getSize() > 0 && a < 4) {
            for (CommonsMultipartFile aFile : filename){
                arc.setId_archivo("0");
                arc.setId_solicitud(req.getParameter("id_solicitud"));

                System.out.println("Saving file: " + saveDirectory + cod + "/" + aFile.getOriginalFilename());

                if (!aFile.getOriginalFilename().equals("")) {
                    aFile.transferTo(new File(saveDirectory + cod + "/" + aFile.getOriginalFilename()));
                }
                    if (aFile.getOriginalFilename() != ""){
                    String nombreArch = "http://localhost/Uploads/direct_download.php?file=" +cod + "/" + aFile.getOriginalFilename();
                    System.out.println(nombreArch);
                    arc.setArchivo(nombreArch); 
                }
                else {
                    arc.setArchivo(null);
                }
                    a ++;
            }
            service.agregaFile(arc);        
        }

        return "cliente/successUp";
    }
@RequestMapping(value=“/doUpload”,method=RequestMethod.POST)
公共字符串doUpload(HttpServletRequest-req,HttpSession会话,@RequestParam(“filename[]))commonmultipartfile[]filename,Map-Map)引发异常{
字符串cod=(字符串)session.getAttribute(“用户”);
文件夹=新文件(“C:/wamp/www/Uploads/”+cod+“/”);
folder.mkdirs();
Archivo弧=新的Archivo();
int a=0;
如果(filename[a]!=null&&filename[a].getSize()>0&&a<4){
for(CommonsMultipartFile文件名:filename){
弧.setId_archivo(“0”);
弧设置id请求(请求获取参数(“id请求”);
System.out.println(“保存文件:“+saveDirectory+cod+”/“+aFile.getOriginalFilename());
如果(!aFile.getOriginalFilename().equals(“”){
aFile.transferTo(新文件(saveDirectory+cod+“/”+aFile.getOriginalFilename());
}
if(aFile.getOriginalFilename()!=“”){
字符串nombreArch=”http://localhost/Uploads/direct_download.php?file=“+cod+”/“+aFile.getOriginalFilename();
System.out.println(nombreArch);
塞塔奇沃弧(nombreArch);
}
否则{
arc.setArchivo(空);
}
a++;
}
服务.agregaFile(arc);
}
返回“客户/成功”;
}

我希望有人能帮助我,我在春天是个新手。提前感谢。:)

我不确定是否可以在handler方法参数上注入commonmultipartfile,请尝试使用org.springframework.web.multipart.MultipartFile

还要确保在spring容器上定义了CommonMultipartResolver,如下所示:

<beans:bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"/>


还有你的类路径中包含的commons fileupload jar(即:作为maven依赖项)

好吧,我在回答我自己的问题,最后非常简单。 我刚刚将输入的名称更改为
filename
,因此所有输入都具有相同的名称,在我的控制器中,我更改了以下内容:

@RequestMapping(value="/doUpload", method=RequestMethod.POST)
    public String doUpload(HttpServletRequest req, HttpSession session, @RequestParam CommonsMultipartFile[] filename, Map<String, Object> map) throws Exception{

    String cod = (String) session.getAttribute("user");

    File folder = new File("C:/wamp/www/Uploads/"+ cod + "/");
    folder.mkdirs();

    Archivo arc = new Archivo();


    if (filename != null && filename.getSize() > 0 ) {
        for (CommonsMultipartFile aFile : filename){
            arc.setId_archivo("0");
            arc.setId_solicitud(req.getParameter("id_solicitud"));

            System.out.println("Saving file: " + saveDirectory + cod + "/" + aFile.getOriginalFilename());

            if (!aFile.getOriginalFilename().equals("")) {
                aFile.transferTo(new File(saveDirectory + cod + "/" + aFile.getOriginalFilename()));
            }
                if (aFile.getOriginalFilename() != ""){
                String nombreArch = "http://localhost/Uploads/direct_download.php?file=" +cod + "/" + aFile.getOriginalFilename();
                System.out.println(nombreArch);
                arc.setArchivo(nombreArch); 
            }
            else {
                arc.setArchivo(null);
            }
               service.agregaFile(arc); 
        }

    }
@RequestMapping(value=“/doUpload”,method=RequestMethod.POST)
公共字符串doUpload(HttpServletRequest req,HttpSession session,@RequestParam commonmultipartfile[]filename,Map Map)引发异常{
字符串cod=(字符串)session.getAttribute(“用户”);
文件夹=新文件(“C:/wamp/www/Uploads/”+cod+“/”);
folder.mkdirs();
Archivo弧=新的Archivo();
if(filename!=null&&filename.getSize()>0){
for(CommonsMultipartFile文件名:filename){
弧.setId_archivo(“0”);
弧设置id请求(请求获取参数(“id请求”);
System.out.println(“保存文件:“+saveDirectory+cod+”/“+aFile.getOriginalFilename());
如果(!aFile.getOriginalFilename().equals(“”){
aFile.transferTo(新文件(saveDirectory+cod+“/”+aFile.getOriginalFilename());
}
if(aFile.getOriginalFilename()!=“”){
字符串nombreArch=”http://localhost/Uploads/direct_download.php?file=“+cod+”/“+aFile.getOriginalFilename();
System.out.println(nombreArch);
塞塔奇沃弧(nombreArch);
}
否则{
arc.setArchivo(空);
}
服务.agregaFile(arc);
}
}
只需删除CommonsMultiPartFile@RequestParam中的
filename[]
部分,并将
service.agregaFile(arc)
放入
for

现在一切正常!谢谢。

Hi@gerrytan感谢您的回复。正如我之前所说,我使用该方法处理一次上传,效果很好,但我会尝试您的建议。我已经在spring容器中定义了CommonsMultipartResolver,在maven中也有该库。