在 Cloud Storage 中移动对象包含两个操作。首先,将对象复制到目标存储分区,并重命名移动的对象。接着,删除原始对象。仅当旧目的地与新目的地不同时,才能删除对象。
深入探索
如需查看包含此代码示例的详细文档,请参阅以下内容:
代码示例
C++
如需了解详情,请参阅 Cloud Storage C++ API 参考文档。
如需向 Cloud Storage 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为本地开发环境设置身份验证。
namespace gcs = ::google::cloud::storage;
using ::google::cloud::StatusOr;
[](gcs::Client client, std::string const& bucket_name,
std::string const& old_object_name, std::string const& new_object_name) {
StatusOr<gcs::ObjectMetadata> metadata = client.RewriteObjectBlocking(
bucket_name, old_object_name, bucket_name, new_object_name);
if (!metadata) throw std::move(metadata).status();
google::cloud::Status status =
client.DeleteObject(bucket_name, old_object_name);
if (!status.ok()) throw std::runtime_error(status.message());
std::cout << "Renamed " << old_object_name << " to " << new_object_name
<< " in bucket " << bucket_name << "\n";
}
C#
如需了解详情,请参阅 Cloud Storage C# API 参考文档。
如需向 Cloud Storage 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为本地开发环境设置身份验证。
using Google.Cloud.Storage.V1;
using System;
public class MoveFileSample
{
public void MoveFile(
string sourceBucketName = "your-unique-bucket-name",
string sourceObjectName = "your-object-name",
string targetBucketName = "target-object-bucket",
string targetObjectName = "target-object-name")
{
var storage = StorageClient.Create();
storage.CopyObject(sourceBucketName, sourceObjectName, targetBucketName, targetObjectName);
storage.DeleteObject(sourceBucketName, sourceObjectName);
Console.WriteLine($"Moved {sourceObjectName} to {targetObjectName}.");
}
}
Go
如需了解详情,请参阅 Cloud Storage Go API 参考文档。
如需向 Cloud Storage 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为本地开发环境设置身份验证。
import (
"context"
"fmt"
"io"
"time"
"cloud.google.com/go/storage"
)
// moveFile moves an object into another location.
func moveFile(w io.Writer, bucket, object string) error {
// bucket := "bucket-name"
// object := "object-name"
ctx := context.Background()
client, err := storage.NewClient(ctx)
if err != nil {
return fmt.Errorf("storage.NewClient: %w", err)
}
defer client.Close()
ctx, cancel := context.WithTimeout(ctx, time.Second*10)
defer cancel()
dstName := object + "-rename"
src := client.Bucket(bucket).Object(object)
dst := client.Bucket(bucket).Object(dstName)
// Optional: set a generation-match precondition to avoid potential race
// conditions and data corruptions. The request to copy the file is aborted
// if the object's generation number does not match your precondition.
// For a dst object that does not yet exist, set the DoesNotExist precondition.
dst = dst.If(storage.Conditions{DoesNotExist: true})
// If the destination object already exists in your bucket, set instead a
// generation-match precondition using its generation number.
// attrs, err := dst.Attrs(ctx)
// if err != nil {
// return fmt.Errorf("object.Attrs: %w", err)
// }
// dst = dst.If(storage.Conditions{GenerationMatch: attrs.Generation})
if _, err := dst.CopierFrom(src).Run(ctx); err != nil {
return fmt.Errorf("Object(%q).CopierFrom(%q).Run: %w", dstName, object, err)
}
if err := src.Delete(ctx); err != nil {
return fmt.Errorf("Object(%q).Delete: %w", object, err)
}
fmt.Fprintf(w, "Blob %v moved to %v.\n", object, dstName)
return nil
}
Java
如需了解详情,请参阅 Cloud Storage Java API 参考文档。
如需向 Cloud Storage 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为本地开发环境设置身份验证。
import com.google.cloud.storage.Blob;
import com.google.cloud.storage.BlobId;
import com.google.cloud.storage.Storage;
import com.google.cloud.storage.StorageOptions;
public class MoveObject {
public static void moveObject(
String projectId,
String sourceBucketName,
String sourceObjectName,
String targetBucketName,
String targetObjectName) {
// The ID of your GCP project
// String projectId = "your-project-id";
// The ID of your GCS bucket
// String bucketName = "your-unique-bucket-name";
// The ID of your GCS object
// String sourceObjectName = "your-object-name";
// The ID of the bucket to move the object objectName to
// String targetBucketName = "target-object-bucket"
// The ID of your GCS object
// String targetObjectName = "your-new-object-name";
Storage storage = StorageOptions.newBuilder().setProjectId(projectId).build().getService();
BlobId source = BlobId.of(sourceBucketName, sourceObjectName);
BlobId target = BlobId.of(targetBucketName, targetObjectName);
// Optional: set a generation-match precondition to avoid potential race
// conditions and data corruptions. The request returns a 412 error if the
// preconditions are not met.
Storage.BlobTargetOption precondition;
if (storage.get(targetBucketName, targetObjectName) == null) {
// For a target object that does not yet exist, set the DoesNotExist precondition.
// This will cause the request to fail if the object is created before the request runs.
precondition = Storage.BlobTargetOption.doesNotExist();
} else {
// If the destination already exists in your bucket, instead set a generation-match
// precondition. This will cause the request to fail if the existing object's generation
// changes before the request runs.
precondition =
Storage.BlobTargetOption.generationMatch(
storage.get(targetBucketName, targetObjectName).getGeneration());
}
// Copy source object to target object
storage.copy(
Storage.CopyRequest.newBuilder().setSource(source).setTarget(target, precondition).build());
Blob copiedObject = storage.get(target);
// Delete the original blob now that we've copied to where we want it, finishing the "move"
// operation
storage.get(source).delete();
System.out.println(
"Moved object "
+ sourceObjectName
+ " from bucket "
+ sourceBucketName
+ " to "
+ targetObjectName
+ " in bucket "
+ copiedObject.getBucket());
}
}
Node.js
如需了解详情,请参阅 Cloud Storage Node.js API 参考文档。
如需向 Cloud Storage 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为本地开发环境设置身份验证。
/**
* TODO(developer): Uncomment the following lines before running the sample.
*/
// The ID of your GCS bucket
// const bucketName = 'your-source-bucket';
// The ID of your GCS file
// const srcFileName = 'your-file-name';
// The new ID for your GCS file
// const destFileName = 'your-new-file-name';
// Imports the Google Cloud client library
const {Storage} = require('@google-cloud/storage');
// Creates a client
const storage = new Storage();
async function moveFile() {
// Optional:
// Set a generation-match precondition to avoid potential race conditions
// and data corruptions. The request to copy is aborted if the object's
// generation number does not match your precondition. For a destination
// object that does not yet exist, set the ifGenerationMatch precondition to 0
// If the destination object already exists in your bucket, set instead a
// generation-match precondition using its generation number.
const moveOptions = {
preconditionOpts: {
ifGenerationMatch: destinationGenerationMatchPrecondition,
},
};
// Moves the file within the bucket
await storage
.bucket(bucketName)
.file(srcFileName)
.move(destFileName, moveOptions);
console.log(
`gs://${bucketName}/${srcFileName} moved to gs://${bucketName}/${destFileName}`
);
}
moveFile().catch(console.error);
PHP
如需了解详情,请参阅 Cloud Storage PHP API 参考文档。
如需向 Cloud Storage 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为本地开发环境设置身份验证。
use Google\Cloud\Storage\StorageClient;
/**
* Move an object to a new name and/or bucket.
*
* @param string $bucketName The name of your Cloud Storage bucket.
* (e.g. 'my-bucket')
* @param string $objectName The name of your Cloud Storage object.
* (e.g. 'my-object')
* @param string $newBucketName the destination bucket name.
* (e.g. 'my-other-bucket')
* @param string $newObjectName the destination object name.
* (e.g. 'my-other-object')
*/
function move_object(string $bucketName, string $objectName, string $newBucketName, string $newObjectName): void
{
$storage = new StorageClient();
$bucket = $storage->bucket($bucketName);
$object = $bucket->object($objectName);
$object->copy($newBucketName, ['name' => $newObjectName]);
$object->delete();
printf('Moved gs://%s/%s to gs://%s/%s' . PHP_EOL,
$bucketName,
$objectName,
$newBucketName,
$newObjectName);
}
Python
如需了解详情,请参阅 Cloud Storage Python API 参考文档。
如需向 Cloud Storage 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为本地开发环境设置身份验证。
from google.cloud import storage
def move_blob(bucket_name, blob_name, destination_bucket_name, destination_blob_name,):
"""Moves a blob from one bucket to another with a new name."""
# The ID of your GCS bucket
# bucket_name = "your-bucket-name"
# The ID of your GCS object
# blob_name = "your-object-name"
# The ID of the bucket to move the object to
# destination_bucket_name = "destination-bucket-name"
# The ID of your new GCS object (optional)
# destination_blob_name = "destination-object-name"
storage_client = storage.Client()
source_bucket = storage_client.bucket(bucket_name)
source_blob = source_bucket.blob(blob_name)
destination_bucket = storage_client.bucket(destination_bucket_name)
# Optional: set a generation-match precondition to avoid potential race conditions
# and data corruptions. The request is aborted if the object's
# generation number does not match your precondition. For a destination
# object that does not yet exist, set the if_generation_match precondition to 0.
# If the destination object already exists in your bucket, set instead a
# generation-match precondition using its generation number.
# There is also an `if_source_generation_match` parameter, which is not used in this example.
destination_generation_match_precondition = 0
blob_copy = source_bucket.copy_blob(
source_blob, destination_bucket, destination_blob_name, if_generation_match=destination_generation_match_precondition,
)
source_bucket.delete_blob(blob_name)
print(
"Blob {} in bucket {} moved to blob {} in bucket {}.".format(
source_blob.name,
source_bucket.name,
blob_copy.name,
destination_bucket.name,
)
)
Ruby
如需了解详情,请参阅 Cloud Storage Ruby API 参考文档。
如需向 Cloud Storage 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为本地开发环境设置身份验证。
def move_file bucket_name:, file_name:, new_name:
# The ID of your GCS bucket
# bucket_name = "your-unique-bucket-name"
# The ID of your GCS object
# file_name = "your-file-name"
# The ID of your new GCS object
# new_name = "your-new-file-name"
require "google/cloud/storage"
storage = Google::Cloud::Storage.new
bucket = storage.bucket bucket_name, skip_lookup: true
file = bucket.file file_name
renamed_file = file.copy new_name
file.delete
puts "#{file_name} has been renamed to #{renamed_file.name}"
end
后续步骤
如需搜索和过滤其他 Google Cloud 产品的代码示例,请参阅 Google Cloud 示例浏览器。