【问题标题】:How to get bytes (byte[]) from an uploaded file in Grails如何从 Grails 中上传的文件中获取字节 (byte[])
【发布时间】:2012-01-24 08:37:35
【问题描述】:

我有一个这样的上传表单 (form.gsp):

<html>
<head>
    <title>Upload Image</title>
    <meta name="layout" content="main" />
</head>
    <body>  
        <g:uploadForm action ="upload">
            Photo: <input name="photos" type="file" />
            <g:submitButton name="upload" value="Upload" />
        </g:uploadForm>
    </body>
</html>

我希望用户上传任何图片,当他点击upload 按钮时,我需要一些方法在我的控制器操作中获取图片并将其传递给视图:

def upload = { 
        byte[] photo = params.photos
            //other code goes here . . . .
    }

这会引发错误:

Cannot cast object 'org.springframework.web.multipart.commons.CommonsMultipartFile@1b40272' with class 'org.springframework.web.multipart.commons.CommonsMultipartFile' to class 'byte'

请注意,我不希望这些照片保存在我的数据库中。实际上,一旦upload 操作完成,我将处理该图像并在upload 视图本身中显示输出。所以如果我有解决方案就好了。

提前致谢。

【问题讨论】:

    标签: grails file-upload groovy


    【解决方案1】:
    def reqFile = request.getFile("photos")
    InputStream file = reqFile.inputStream
    byte[] bytes = file.bytes
    

    编辑:按照建议将 getBytes 更改为字节,这是一种更好的常规方式 :)

    【讨论】:

    • 一切正常!但是如果我想在视图上显示用户上传的图像,我该怎么做呢?
    • 您可以将字节写入 response.outputStream
    【解决方案2】:

    如果您想上传文件而不是存储它,并在下一个请求中将其显示在另一个视图上的&lt;img&gt; 中,您可以将其临时存储在会话中:

    grails-app/controllers/UploadController.groovy:

    def upload = {
        def file = request.getFile('file')
    
        session.file = [
            bytes: file.inputStream.bytes,
            contentType: file.contentType
        ]
    
        redirect action: 'elsewhere'
    }
    
    def elsewhere = { }
    
    def image = {
        if (!session.file) {
            response.sendError(404)
            return
        }
    
        def file = session.file
        session.removeAttribute 'file'
    
        response.setHeader('Cache-Control', 'no-cache')
        response.contentType = file.contentType
        response.outputStream << file.bytes
        response.outputStream.flush()
    
    }
    

    grails-app/views/upload/form.gsp:

    <g:uploadForm action="upload">
      <input type="file" name="file"/>
      <g:submitButton name="Upload"/>
    </g:uploadForm>
    

    grails-app/views/upload/elsewhere.gsp:

    <img src="${createLink(controller: 'upload', action: 'image')}"/>
    

    该文件将可用于单个请求(因为我们会在它显示时将其删除)。您可能需要针对错误情况实施一些额外的会话清理。

    您可以轻松调整它以保存多个文件(如果您尝试上传一堆照片),但请记住每个文件都会占用内存。

    使用会话的替代方法是使用MultipartFile#transferTo(File) 将文件传输到磁盘上的临时位置并从那里显示它们。

    【讨论】:

    • 这看起来很棒,但是当我查看elsewhere.gsp 时,我看不到任何图像!
    • 嗯,很有趣。上面的代码对我有用,一字不差。页面上说图像的来源是什么?也许您可以添加一些日志记录来帮助调试它。
    • 对不起,它工作正常,我在控制器名称中打错了:谢谢你的东西:)
    【解决方案3】:
    byte[] photo=request.getFile("photos").bytes
    

    如果您想以图片形式返回,请执行以下操作:

    response.contentType="image/png" //or whatever the format is...
    response.outputStream << photo
    

    【讨论】:

      猜你喜欢
      • 2013-04-03
      • 2016-03-07
      • 2011-01-29
      • 1970-01-01
      • 1970-01-01
      • 2013-11-23
      • 1970-01-01
      • 1970-01-01
      • 2019-09-23
      相关资源
      最近更新 更多