Amazon S3 изменить имя загрузки файла
У меня есть файлы, хранящиеся на S3 с GUID в качестве имени ключа.
Я использую предварительно подписанный URL для загрузки в соответствии с S3 REST API
Я храню исходное имя файла в моей собственной базе данных. Когда пользователь нажимает, чтобы загрузить файл из моего веб-приложения Я хочу вернуть их исходное имя файла, но в настоящее время все, что они получают-это GUID. Как я могу этого достичь?
мое веб-приложение находится в salesforce, поэтому у меня нет особого контроля ответ.перенаправляет все загрузки файла на веб-сервер, а затем переименовать его из-за ограничений губернатора.
есть ли перенаправление HTML, обновление мета, Javascript, который я могу использовать? Есть ли способ изменить имя файла загрузки для S3 (единственное, что я могу придумать, это справиться с объектом на новое имя, загрузить его, а затем удалить).
Я хочу избежать создания ведра для каждого пользователя, так как у нас будет много пользователей, и все равно нет гарантии, что каждый файл в каждом ведре будет иметь уникальное имя
любые другие решения?
3 ответа:
Я думаю, ваш крест отправил эти вопросы форум Amazon S3, но ради других я хотел бы разместить ответ здесь:
если есть только один "имя пользователя" для каждого объекта S3, то вы можете установить заголовок Content-Disposition в файле s3, чтобы установить имя файла загрузки: Content-Disposition: attachment; filename=foo.бар
справедливости ради я хотел бы отметить, что это был не я, чтобы обеспечить правильный ответ на форуме Amazon и все кредиты должны идти Колину Родосу; -)
в начале января 2011 года S3 добавила переопределения заголовка запроса. Эта функция позволяет "динамически" изменять заголовок Content-Disposition для отдельных запросов.
смотрите S3 документация на все объекты для более подробной информации.
хотя принятый ответ правильный, я нахожу его очень абстрактным и трудным в использовании.
вот кусок узла.JS код, который решает задачи. Я советую выполнить его как AWS Lambda для создания предварительно подписанного Url.
var AWS = require('aws-sdk'); var s3 = new AWS.S3({ signatureVersion: 'v4' }); const s3Url = process.env.BUCKET; module.exports.main = (event, context, callback) => { var s3key = event.s3key var originalFilename = event.originalFilename var url = s3.getSignedUrl('getObject', { Bucket: s3Url, Key: s3key, Expires: 600, ResponseContentDisposition: 'attachment; filename ="' + originalFilename + '"' }); [... rest of Lambda stuff...] }
обратите внимание .
более подробную информацию по функции getobject DOC на http://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/S3.html#getObject-property