Amazon S3 изменить имя загрузки файла


У меня есть файлы, хранящиеся на S3 с GUID в качестве имени ключа.

Я использую предварительно подписанный URL для загрузки в соответствии с S3 REST API

Я храню исходное имя файла в моей собственной базе данных. Когда пользователь нажимает, чтобы загрузить файл из моего веб-приложения Я хочу вернуть их исходное имя файла, но в настоящее время все, что они получают-это GUID. Как я могу этого достичь?

мое веб-приложение находится в salesforce, поэтому у меня нет особого контроля ответ.перенаправляет все загрузки файла на веб-сервер, а затем переименовать его из-за ограничений губернатора.

есть ли перенаправление HTML, обновление мета, Javascript, который я могу использовать? Есть ли способ изменить имя файла загрузки для S3 (единственное, что я могу придумать, это справиться с объектом на новое имя, загрузить его, а затем удалить).

Я хочу избежать создания ведра для каждого пользователя, так как у нас будет много пользователей, и все равно нет гарантии, что каждый файл в каждом ведре будет иметь уникальное имя

любые другие решения?

3 58

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