我在 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/