Использование версии Leigh S3Wrapper.cfc Не удается пройти через Init

Я новичок в S3, и мне нужно использовать его для хранения изображений. Я нашел полдюжины версий s2wrapper для cf, но похоже, что единственный набор для v4 - это модифицированный Ли

https://gist.github.com/Leigh-/26993ed79c956c9309a9dfe40f1fce29

Бросил в каталог com и создал "тестовую" страницу, которая содержит следующий код:

s3 = createObject('component','com.S3Wrapper').init(application.s3.AccessKeyId,application.s3.SecretAccessKey);

но получил следующую ошибку:

Таким образом, я изменил строку 37 из

variables.Sv4Util = createObject('component', 'Sv4').init(arguments.S3AccessKey, arguments.S3SecretAccessKey);

в

variables.Sv4Util = createObject('component', 'Sv4Util').init(arguments.S3AccessKey, arguments.S3SecretAccessKey);

Теперь я получаю:

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

Кто-нибудь знает, есть ли примеры, как использовать это где-нибудь? Если не то, что я делаю не так. Если это имеет значение, я использую Lucee 5, а не движок Adobe от CF.

ОБНОВИТЬ:

Я следовал указаниям Ли, и теперь ошибка исчезла. Я добавил еще немного кода на мою тестовую страницу, которая теперь выглядит следующим образом:

<cfscript>
    s3 = createObject('component','com.S3v4').init(application.s3.AccessKeyId,application.s3.SecretAccessKey);

    bucket = "imgbkt.domain.com";
    obj = "fake.ping";
    region = "s3-us-west-1"

    test = s3.getObject(bucket,obj,region);
    writeDump(test);
    test2 = s3.getObjectLink(bucket,obj,region);
    writeDump(test2);

    writeDump(s3);
</cfscript>

Независимо от того, что я вставляю для ведра, объекта или региона, я получаю:

JIC Я пошел в AWS и получил новые ключи:

Ли, если вы все еще рядом или кто-нибудь, как использовал один из s3Wrappers, какие-либо предложения или рекомендации?

ОБНОВЛЕНИЕ № 2: Даже после помощи Алекса я не могу заставить это работать. Ссылка, которую я получаю от getObjectLink, недействительна, и getObject никогда не загружает объект. Я думал, что попробую метод putObject

test3 = s3.putObject(bucketName=bucket,regionName=region,keyName="favicon.ico");
writeDump(test3);

чтобы узнать, есть ли какая-либо дополнительная информация, я получил это:

Я нашел эту статью https://shlomoswidler.com/2009/08/amazon-s3-gotcha-using-virtual-host.html но она довольно старая и, поскольку S3 специально предлагает использовать точки в именах сегментов, я этого не делаю актуально больше. Очевидно, что-то я делаю неправильно, но я потратил часы, пытаясь решить эту проблему, и я не могу понять, что это может быть.

1 ответ

Я дам вам краткое изложение того, что делает код:

getObjectLink возвращает HTTP-URL для файла fake.ping что найдено, глядя в ведро imgbkt.domain.com области s3-us-west-1, Эта ссылка является временной и истекает через 60 секунд по умолчанию.

getObject Запускает getObjectLink и немедленно запрашивает URL, используя HTTP GET. Затем ответ сохраняется в каталоге S3v4.cfc с именем файла fake.ping по умолчанию. Наконец, функция возвращает полный путь к загруженному файлу: E:\wwwDevRoot\taa\fake.ping

Чтобы сохранить файл в другом месте, вы должны вызвать:

downloadPath = 'E:\';
test = s3.getObject(bucket,obj,region,downloadPath);
writeDump(test);

HTTP-запрос является синхронным, то есть файл будет загружен полностью, когда функции вернут путь к файлу.

Если вы хотите получить доступ к фактическому содержимому файла, вы можете сделать это:

test = s3.getObject(bucket,obj,region);

contentAsString = fileRead(test); // returns the file content as string
// or
contentAsBinary = fileReadBinary(test); // returns the content as binary (byte array)

writeDump(contentAsString);
writeDump(contentAsBinary);

(Возможно, вы захотите потоковое содержимое, если файл большой, так как fileRead / fileReadBinary читает весь файл в буфер. использование fileOpen для потоковой передачи контента.

Это тебе помогает?

Другие вопросы по тегам