code: func (d *driver) PutContent(ctx context.Context, path string, contents []byte) error {
  	// max size for block blobs uploaded via single "Put Blob" for version after "2016-05-31"
  	// https://docs.microsoft.com/en-us/rest/api/storageservices/put-blob#remarks
  	const limit = 256 * 1024 * 1024
  	if len(contents) > limit {
  		return fmt.Errorf("uploading %d bytes with PutContent is not supported; limit: %d bytes", len(contents), limit)
  	}
  
  	// Historically, blobs uploaded via PutContent used to be of type AppendBlob
  	// (https://github.com/docker/distribution/pull/1438). We can't replace
  	// these blobs atomically via a single "Put Blob" operation without
  	// deleting them first. Once we detect they are BlockBlob type, we can
  	// overwrite them with an atomically "Put Blob" operation.
  	//
  	// While we delete the blob and create a new one, there will be a small
  	// window of inconsistency and if the Put Blob fails, we may end up with
  	// losing the existing data while migrating it to BlockBlob type. However,
  	// expectation is the clients pushing will be retrying when they get an error
  	// response.
  	blobRef := d.client.GetContainerReference(d.container).GetBlobReference(path)
  	err := blobRef.GetProperties(nil)
  	if err != nil && !is404(err) {
  		return fmt.Errorf("failed to get blob properties: %v", err)
  	}
  	if err == nil && blobRef.Properties.BlobType != azure.BlobTypeBlock {
  		if err := blobRef.Delete(nil); err != nil {
  			return fmt.Errorf("failed to delete legacy blob (%s): %v", blobRef.Properties.BlobType, err)
  		}
  	}
  
  	r := bytes.NewReader(contents)
  	// reset properties to empty before doing overwrite
  	blobRef.Properties = azure.BlobProperties{}
  	return blobRef.CreateBlockBlobFromReader(r, nil)
  }
docs: // PutContent stores the []byte content at a location designated by "path".