【问题标题】:how to upload file into server directory with grails?如何使用grails将文件上传到服务器目录?
【发布时间】:2014-02-03 03:12:31
【问题描述】:

如何将文件上传到服务器目录.. 如果我在 D:\myapp 的项目并且我使用 cmd d:\myapp grails run-app 运行 当我运行这个应用程序和其他计算机运行它并上传文件..它将ini计算机服务器保存在目录D:\ myapp \upload?

我试试这个 ini gsp。

<g:form action="list" enctype="multipart/form-data" useToken="true">
    <span class="button">
        <input type="file" name="filecsv"/>
        <input type="button" class="upload" value="Upload"
               onclick='location.href = "${createLink(url: [action: 'upload'])}"'/>
    </span>
</g:form>

def upload = {

    def f = request.getFile('filecsv')
    if (f.empty) {
        flash.message = 'file cannot be empty'
        render(view: 'list')
        return
    }

    f.transferTo(new File('C:\Users\meta\Documents\workspace-sts-2.5.2.RELEASE\wawet\wallet\uploads\file_name.csv'))
    response.sendError(200, 'Done')
}

这是错误:

2014-02-03 10:43:02,706 [http-8080-2] ERROR errors.GrailsExceptionResolver  - No signature of method: org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestWrapper.getFile() is applicable for argument types: (java.lang.String) values: [filecsv]
Possible solutions: getXML(), getAt(java.lang.String), getAt(java.lang.String), getLocale(), getJSON(), getHeader(java.lang.String)
groovy.lang.MissingMethodException: No signature of method: org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestWrapper.getFile() is applicable for argument types: (java.lang.String) values: [filecsv]
Possible solutions: getXML(), getAt(java.lang.String), getAt(java.lang.String), getLocale(), getJSON(), getHeader(java.lang.String)
        at com.teravin.wallet.LoanAccountController$_closure12.doCall(com.teravin.wallet.LoanAccountController:308)
        at com.teravin.wallet.LoanAccountController$_closure12.doCall(com.teravin.wallet.LoanAccountController)
        at java.lang.Thread.run(Thread.java:744)

【问题讨论】:

    标签: grails


    【解决方案1】:

    目标只是Java中的文件。

    def f = request.getFile('some_file')
    
    //validate file or do something crazy hehehe
    
    //now transfer file
    File fileDest = new File("Path to some destination and file name")
    f.transferTo(fileDest)
    

    如果您想将其存储在相对于用户主目录的某个路径:

    def homeDir = new File(System.getProperty("user.home")) //user home e.g /home/username for unix
    File fileDest = new File(homeDir,"path/to/some_folder")
    f.transferTo(fileDest)
    

    更新 根据您的getFile 不起作用的原因,您没有提交表单:

    <g:form action="list" enctype="multipart/form-data" useToken="true">
    
    <span class="button">                   
                        <input type="file" name="filecsv"/>
                        <input type="button" class="upload"
                                            value="Upload"
                                            onclick='location.href = "${createLink(url: [action: 'upload'])}"'/>
    
                </span>
    
    </g:form>
    

    应该是:

    <g:form action="upload" enctype="multipart/form-data" useToken="true">
    
    <span class="button">                   
                        <input type="file" name="filecsv"/>
                        <input type="submit" class="upload" value="upload"/>
    
                </span>
    
    </g:form>
    

    如果您需要使用 javascript,您应该提交表单而不是添加到另一个页面的链接。

    【讨论】:

    • groovy.lang.MissingMethodException:没有方法签名:org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestWrapper.getFile() 适用于参数类型:(java.lang.String) 值:[ filecsv] 可能的解决方案:getXML()、getAt(java.lang.String)、getAt(java.lang.String)、getLocale()、getJSON()、getHeader(java.lang.String)
    • @unekwu 将上传的文件放入 webroot 是非常糟糕的主意,它将在应用程序重新启动时完全删除。无论如何,问题是关于getFile
    • @unekwu 它实际上取决于容器,但是例如 Tomcat,会在每次 WAR 解包时删除 app 目录(当然,如果您使用的是 WAR)
    • @unekwu 2014-02-03 14:11:11,034 [http-8080-1] ERROR errors.GrailsExceptionResolver - 没有这样的属性:类的参数:com.teravin.wallet.LoanAccountController org.codehaus .groovy.runtime.metaclass.MissingPropertyExceptionNoStack:没有这样的属性:类的参数:com.teravin.wallet.LoanAccountController
    • 为什么会这样?images/some_folder" 我必须先创建这个文件夹,否则它会自动创建它?对不起,我是初学者,也感谢你和@IgorArtamonov ..
    【解决方案2】:

    Grails 应用程序的位置无关紧要。您必须在控制器中指定完整的目标路径。这是一个例子

    def upload() {
        def f = request.getFile('filecsv')
        if (f.empty) {
            flash.message = 'file cannot be empty'
            render(view: 'uploadForm')
            return
        }
    
        f.transferTo(new File('D:\myapp\upload\file_name.txt')) 
        response.sendError(200, 'Done') 
    }
    

    【讨论】:

    • 'D:\myapp\upload\file_name.txt' 这是绝对路径?如果 myapp 在 E:\myapp 中怎么办?
    【解决方案3】:

    最终字符串 IMAGE_DIR = "${servletContext.getRealPath('/images')}/";

        def employeeId = "dablu_photo";
    
        def employeePicture = request.getFile("cv_");
    
        String photoUrl  ="";
        if (employeePicture && !employeePicture.empty) {
            if (new java.io.File(IMAGE_DIR+"/employee_photo/"+employeeId+".png")?.exists()){
                FileUtils.deleteQuietly(new java.io.File(IMAGE_DIR+"/employee_photo/"+employeeId+".png"));
            }
            employeePicture.transferTo(new java.io.File(IMAGE_DIR+"/employee_photo/"+employeeId+".png"))
    
        }
    

    【讨论】:

    • 虽然此代码可能会解决问题,including an explanation 关于如何以及为什么解决问题将真正有助于提高您的帖子质量,并可能导致更多的赞成票。请记住,您正在为将来的读者回答问题,而不仅仅是现在提问的人。请edit您的回答添加解释并说明适用的限制和假设。
    猜你喜欢
    • 2011-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-07
    • 1970-01-01
    相关资源
    最近更新 更多