gpt4 book ai didi

grails - 常规上传文件

转载 作者:行者123 更新时间:2023-12-01 09:35:00 30 4
gpt4 key购买 nike

我正在尝试为 grails/groovy 中的文件和视频编写 uploader 。因此,每次用户填写新表单时, Controller 都会上传文件并将文件名与其他字段一起保存到数据库中。所以,这里是保存过程:

def save = {
def streamInstance = new Stream(params)
if(request){
MultipartHttpServletRequest mpr = (MultipartHttpServletRequest)request;
CommonsMultipartFile uploadedFile = (CommonsMultipartFile)mpr.getFile("myFile");
if(!uploadedFile.empty){
println "helloworld"
println "Class: ${uploadedFile.class}"
println "Name: ${uploadedFile.name}"
println "OriginalFileName: ${uploadedFile.originalFilename}"
println "Size: ${uploadedFile.size}"
println "ContentType: ${uploadedFile.contentType}"
/*
//def webRootDir = servletContext.getRealPath("/")
//def userDir = new File(webRootDir, "/files/${session.user.login}")
//userDir.mkdirs()
uploadedFile.transferTo(new File("/Users/philipperibeiro/ctv/ctv/web-app/files"))
streamInstance.file = uploadedFile.originalFilename
*/
}
else{
flash.message = "file cannot be empty"
}
}
if(!streamInstance.hasErrors() && streamInstance.save(flush : true)){
flash.message = "${message(code: 'default.created.message', args : [message(code: 'stream.label', default:'Stream'), streamInstance.id])}"
redirect(action : "show", id : streamInstance.id)
}
else{
render(view : "create", model : [streamInstance : streamInstance])
}
}

我收到此错误:错误 500:执行 Controller [ctv.StreamController] 的操作 [save] 导致异常:无法将具有类 'org.apache.catalina.core.ApplicationHttpRequest' 的对象 'org.apache.catalina.core.ApplicationHttpRequest@19f46c5d' 转换为类' org.springframework.web.multipart.MultipartHttpServletRequest'小服务程序:grailsURI:/ctv/grails/stream/save.dispatch异常消息:无法将具有类“org.apache.catalina.core.ApplicationHttpRequest”的对象“org.apache.catalina.core.ApplicationHttpRequest@19f46c5d”转换为类“org.springframework.web.multipart.MultipartHttpServletRequest”原因:无法将具有类 'org.apache.catalina.core.ApplicationHttpRequest' 的对象 'org.apache.catalina.core.ApplicationHttpRequest@19f46c5d' 转换为类 'org.springframework.web.multipart.MultipartHttpServletRequest'类:流 Controller 在线:[22]代码片段:

谁能告诉我修理它的线索?

<%@ page import="ctv.Stream" %>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<meta name="layout" content="main" />
<g:set var="entityName" value="${message(code: 'stream.label', default: 'Stream')}" />
<title><g:message code="default.create.label" args="[entityName]" /></title>
<jqfu:resources tmpl=”false” />
</head>
<body>
<div class="nav">
<span class="menuButton"><a class="home" href="${createLink(uri: '/')}"><g:message code="default.home.label"/></a></span>
<span class="menuButton"><g:link class="list" action="list"><g:message code="default.list.label" args="[entityName]" /></g:link></span>
</div>
<div class="body">
<h1><g:message code="default.create.label" args="[entityName]" /></h1>
<g:if test="${flash.message}">
<div class="message">${flash.message}</div>
</g:if>
<g:hasErrors bean="${streamInstance}">
<div class="errors">
<g:renderErrors bean="${streamInstance}" as="list" />
</div>
</g:hasErrors>
<g:form action="save" >
<div class="dialog">
<table>
<tbody>

<tr class="prop">
<td valign="top" class="name">
<label for="district"><g:message code="stream.district.label" default="District" /></label>
</td>
<td valign="top" class="value ${hasErrors(bean: streamInstance, field: 'district', 'errors')}">
<g:select name="district.id" from="${ctv.District.list()}" optionKey="id" value="${streamInstance?.district?.id}" />
</td>
</tr>

<tr class="prop">
<td valign="top" class="name">
<label for="dateAdded"><g:message code="stream.dateAdded.label" default="Date Added" /></label>
</td>
<td valign="top" class="value ${hasErrors(bean: streamInstance, field: 'dateAdded', 'errors')}">
<g:datePicker name="dateAdded" precision="day" value="${streamInstance?.dateAdded}" />
</td>
</tr>

<tr class="prop">
<td valign="top" class="name">
<label for="name"><g:message code="stream.name.label" default="Name" /></label>
</td>
<td valign="top" class="value ${hasErrors(bean: streamInstance, field: 'name', 'errors')}">
<g:textField name="name" maxlength="30" value="${streamInstance?.name}" />
</td>
</tr>

<tr class="prop">
<td valign="top" class="name">
<label for="description"><g:message code="stream.description.label" default="Description" /></label>
</td>
<td valign="top" class="value ${hasErrors(bean: streamInstance, field: 'description', 'errors')}">
<g:textField name="description" maxlength="100" value="${streamInstance?.description}" />
</td>
</tr>

<tr class="prop">
<td valign="top" class="name">
<label for="media"><g:message code="stream.media.label" default="Media" /></label>
</td>
<td valign="top" class="value ${hasErrors(bean: streamInstance, field: 'media', 'errors')}">
<g:textField name="media" maxlength="30" value="${streamInstance?.media}" />
</td>
</tr>

<tr class="prop">
<td valign="top" class="name">
<label for="file"><g:message code="stream.file.label" default="File" /></label>
</td>
<td valign="top" class="value ${hasErrors(bean: streamInstance, field: 'file', 'errors')}">
<!--g:textField name="file" maxlength="30" value="${streamInstance?.file}" />-->
<g:form action="save" enctype="multipart/form-data">
<input type="file" name="myFile" />
</g:form>
</td>
</tr>

<tr class="prop">
<td valign="top" class="name">
<label for="logo"><g:message code="stream.logo.label" default="Logo" /></label>
</td>
<td valign="top" class="value ${hasErrors(bean: streamInstance, field: 'logo', 'errors')}">
<g:textField name="logo" value="${streamInstance?.logo}" />
</td>
</tr>

<tr class="prop">
<td valign="top" class="name">
<label for="published"><g:message code="stream.published.label" default="Published" /></label>
</td>
<td valign="top" class="value ${hasErrors(bean: streamInstance, field: 'published', 'errors')}">
<g:checkBox name="published" value="${streamInstance?.published}" />
</td>
</tr>

</tbody>
</table>
</div>
<div class="buttons">
<span class="button"><g:submitButton name="create" class="save" value="${message(code: 'default.button.create.label', default: 'Create')}" /></span>
</div>
</g:form>
</div>
</body>
</html>

最佳答案

错误信息的原因

您的代码的问题是您将请求对象转换为错误的类。这是错误消息中告诉您的部分:

Cannot cast object 'org.apache.catalina.core.ApplicationHttpRequest@19f46c5d' with class 'org.apache.catalina.core.ApplicationHttpRequest' to class 'org.springframework.web.multipart.MultipartHttpServletRequest'

所以你有一个 org.apache.catalina.core.ApplicationHttpRequest 并且你试图将它转换为一个 org.springframework.web.multipart.MultipartHttpServletRequest做不到。

groovy(写在 grails 上)的美妙之处在于它是动态类型的。所以无论如何,大部分的选角都是多余的!

尝试替换这两行

MultipartHttpServletRequest mpr = (MultipartHttpServletRequest)request;
CommonsMultipartFile uploadedFile = (CommonsMultipartFile)mpr.getFile("myFile");

有了这个:

def uploadedFile = request.getFile( "myFile" )

但这并不能解决您的问题!它只会更改您收到的错误消息:'(

问题的根源,我们是如何得到错误的请求类的?

考虑一下为什么您的类型转换请求类型错误,您可能忘记在表单操作中包含 enctype="multipart/form-data"。它应该看起来像这样:

<g:form action="save" method="post" enctype="multipart/form-data"> ... </g:form>

只是改变这个可能会解决你的问题,但我肯定也会删除铸件。

更新:真实(?)答案

在 HTML(和 GSP 用于制作 HTML)中,您不能有嵌套表单。一种形式不能在另一种形式中。您的 GSP 有两种形式,第一种如下所示:

<g:form action="save">

第二个(里面的)是这样的

<g:form action="save" enctype="multipart/form-data">

所以你需要完全去掉里面的,并确保外面的(唯一剩下的)看起来像这样:

<g:form action="save" method="post" enctype="multipart/form-data">

关于grails - 常规上传文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9753905/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com