Hướng dẫn nodejs s3 check if file exists - nodejs s3 kiểm tra xem tệp có tồn tại không

AFAICT Cách chính xác để làm điều này kể từ tháng 2 năm 2022, với JavaScript V3 SDK là sử dụng HeadObjectCommand.

Lưu ý: Tôi đang sử dụng TypeScript ở đây với các kiểu đánh máy rõ ràng, nhưng bạn có thể xóa các kiểu đánh máy rõ ràng đó khi bạn tái cấu trúc mã ... chúng chỉ để hiển thị các loại AWS đang sử dụng.

import {
    S3Client,
    HeadObjectCommand, HeadObjectCommandInput, HeadObjectCommandOutput,
} from '@aws-sdk/client-s3';

function async existsInS3(
    client: S3Client,
    bucket: string,
    key: string,
): Promise {
    try {
        const bucketParams: HeadObjectCommandInput = {
            Bucket: bucket,
            Key: key,
        };
        const cmd = new HeadObjectCommand(bucketParams);
        const data: HeadObjectCommandOutput = await client.send(cmd);

        // I always get 200 for my testing if the object exists
        const exists = data.$metadata.httpStatusCode === 200;
        return exists;
    } catch (error) {
        if (error.$metadata?.httpStatusCode === 404) {
            // doesn't exist and permission policy includes s3:ListBucket
            return false;
        } else if (error.$metadata?.httpStatusCode === 403) {
            // doesn't exist, permission policy WITHOUT s3:ListBucket
            return false;
        } else {
            // some other error
            ...log and rethrow if you like
        }
    }
}

Nếu bạn nhìn vào phần quyền của tài liệu HeadObjectCommand được liên kết ở trên, bạn sẽ nhận thấy nó đề cập đến các phản hồi 403 và 404:

Bạn cần sự cho phép đối tượng đọc (hoặc phiên bản) có liên quan cho hoạt động này. Để biết thêm thông tin, xem chỉ định các quyền trong một chính sách. Nếu đối tượng bạn yêu cầu không tồn tại, lỗi mà Amazon S3 trả về phụ thuộc vào việc bạn cũng có quyền S3: listbucket.

Nếu bạn có quyền S3: listbucket trên xô, Amazon S3 sẽ trả về lỗi mã trạng thái HTTP 404 ("Không có khóa đó").

Nếu bạn không có quyền S3: listbucket, Amazon S3 sẽ trả lại lỗi mã trạng thái HTTP 403 ("Access bị từ chối").

Tôi không biết liệu các phản hồi lỗi này có thể xuất phát từ các lỗi khác ngoài sự không tồn tại của khóa hay không.

CORS

Tôi cũng đã phải thêm HEAD vào phần AllowedMethods của quyền CORS trên xô:

"AllowedMethods": [
    "GET",
    "PUT",
    "HEAD"
],

Hướng dẫn nodejs s3 check if file exists - nodejs s3 kiểm tra xem tệp có tồn tại không

Hướng dẫn nodejs s3 check if file exists - nodejs s3 kiểm tra xem tệp có tồn tại không

Điều kiện tiên quyết

  • "@AWS-SDK/Client-S3": "^3.38.0" Đã cài đặt
  • Bạn có một tệp có tên test.txt trong rễ xô của bạn
  • Chính sách xô cần thiết và chính sách IAM được cấu hình

Sử dụng HeadObjectCommand để lấy siêu dữ liệu

Có thể có những cách tốt hơn, nhưng dưới đây là một ví dụ chỉ để có được siêu dữ liệu của một tập tin được lưu trữ trong thùng S3. Nó hiệu quả hơn so với việc nhận đối tượng thực tế nếu bạn chỉ muốn biết sự tồn tại của tệp.
It's more efficient than getting actual object if you just want to know the file existence.

import { S3Client, HeadObjectCommand } from "@aws-sdk/client-s3"

// some codes...

const config = {}
const input = {
    Bucket: 'your-bucket',
    Key: 'test.txt'
}
const client = new S3Client(config)
const command = new HeadObjectCommand(input)
const response = await client.send(command)
console.log(response)

Nhập chế độ FullScreenen EXIT Mode FullScreen

phản ứng

Nếu bạn nhận được mã trạng thái 200, tất cả bạn đều được thiết lập. Bạn sẽ gặp lỗi Not Found với mã trạng thái 404 nếu tệp không tồn tại.
You will get Not Found error with status code 404 if file does not exist.

{
  '$metadata': {
    httpStatusCode: 200,
    ...

Nhập chế độ FullScreenen EXIT Mode FullScreen