amazon-s3 - 使用 IHP 上传/访问 S3 上传时出现问题

标签 amazon-s3 ihp

我在 IHP 中的 S3 或其 IHP 插件方面遇到问题。

我正在将文件保存到 AWS 存储,我收到一个返回的 URL 以保存在数据库中,但 S3 中没有保存任何内容。 IHP 没有错误消息。

我已仔细检查存储桶名称和区域,并且访问 key 已连接到具有 AmazonS3FullAccess 权限的 IAM。

尝试访问签名网址时收到 403 禁止。

有什么想法可能会出错吗?

目前我的 Controller 看起来像这样,因为我按照文档指示保存整个链接,使用 createTemporaryDownloadUrlFromPath 不起作用,因此文档中目前存在一些漏洞。

    action CreateDriverAction = do
        let driver = newRecord @Driver
        driver
            |> buildDriver
            |> validateNewDriver
            >>= uploadToStorage #licenceBackUrl
            >>= pure . validateField #licenceFrontUrl (nonEmpty |> withCustomErrorMessage "Bilde av forsiden på førerkortet er obligatorisk")
            >>= pure . validateField #licenceBackUrl (nonEmpty |> withCustomErrorMessage "Bilde av baksiden på førerkortet er obligatorisk")
            >>= ifValid \case
                Left driver -> do
                    render NewView{..}
                Right driver -> do
                    hashed <- hashPassword (get #passwordHash driver)
                    driver <- driver |> set #passwordHash hashed |> createRecord
                    login driver
                    redirectToPath "/driver/"

最佳答案

当访问未公开允许的文件时,需要执行一些额外的步骤,并且

您必须使用 fileOrNothing 访问文件并执行更多手动步骤。

我的行动结束了opp,看起来像这样:

    action CreateDriverAction = do
        let driver = newRecord @Driver
        let licenceFrontFile = fileOrNothing "licenceFrontUrl"
        let licenceBackFile = fileOrNothing "licenceBackUrl"

        driver
            |> buildDriver
            |> set #licenceBackPath (maybe "" (cs . get #fileContent) licenceBackFile)
            |> set #licenceFrontPath (maybe "" (cs . get #fileContent) licenceBackFile)
            |> validateField #licenceFrontPath (nonEmpty |> withCustomErrorMessage "Bilde av forsiden på førerkortet er obligatorisk")
            |> validateField #licenceBackPath (nonEmpty |> withCustomErrorMessage "Bilde av baksiden på førerkortet er obligatorisk")
            |> validateNewDriver
            >>= ifValid \case
                Left driver -> do
                    setErrorMessage "Noe gikk galt med fører-registrering. Sjekk at skjemafeltene er korrekte og send inn på nytt"
                    render NewView{..}
                Right driver ->
                    do
                        storedLicenceFront <-
                            storeFileWithOptions
                                (licenceFrontFile |> fromMaybe (error "No file"))
                                ( def
                                    { directory = "drivers/licenceFront"
                                    , contentDisposition = contentDispositionAttachmentAndFileName
                                    }
                                )

                        storedLicenceBack <-
                            storeFileWithOptions
                                (licenceBackFile |> fromMaybe (error "No file"))
                                ( def
                                    { directory = "drivers/licenceBack"
                                    , contentDisposition = contentDispositionAttachmentAndFileName
                                    }
                                )

                        licenceBackSigned <- createTemporaryDownloadUrlFromPath (get #path storedLicenceBack)
                        licenceFrontSigned <- createTemporaryDownloadUrlFromPath (get #path storedLicenceFront)
                        hashed <- hashPassword (get #passwordHash driver)
                        driver <-
                            driver |> set #passwordHash hashed
                                |> set #licenceFrontPath (get #path storedLicenceFront)
                                |> set #licenceBackPath (get #path storedLicenceBack)
                                |> set #licenceBackUrl (get #url licenceBackSigned)
                                |> set #licenceFrontUrl (get #url licenceFrontSigned)
                                |> set #licenceFrontUrlExpiresAt (get #expiredAt licenceFrontSigned)
                                |> set #licenceBackUrlExpiresAt (get #expiredAt licenceBackSigned)
                                |> createRecord
                        setSuccessMessage "Din førerprofil er opprettet! Vi behandler søknaden din snarest."
                        login driver
                        redirectToPath "/driver/"

关于amazon-s3 - 使用 IHP 上传/访问 S3 上传时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70624324/

相关文章:

haskell - 分解出 Controller Action

ihp - 是否可以打开 IHP shell?

sql - 使用换行符将数据卸载到 s3 redshift

ruby - 访问页面 :backups from Heroku Scheduler

javascript - 使用 Promisify 从回调转换为 Async-Await 格式后,AWS S3 上传不起作用

ihp - 突出显示具有任意数量查询参数的事件链接

haskell - 如何在 IHP 中处理日期?有没有 'default'的方法?

java - Amazon S3 文件上传不起作用 - 公共(public)读取权限

amazon-s3 - Hive外部表: what if the table is accessed during the underlying directory is being updated