> For the complete documentation index, see [llms.txt](https://docs.roboflow.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.roboflow.com/roboflow/roboflow-hi/datasets/adding-data/upload-data-from-aws-gcp-and-azure/azure-blob-storage.md).

# Azure Blob Storage

{% hint style="info" %}
यह पेज signed URL और local download workflows को कवर करता है। अगर आपका source data Azure में है, तो उपयोग करें [Datasources](/roboflow/roboflow-hi/datasets/adding-data/datasources.md) और इस पैटर्न को adapt करने के बजाय Bucket Mirror का उपयोग करें।
{% endhint %}

Azure Blob Storage में image data storage और Roboflow पर uploading के मामले में, आपके पास आम तौर पर दो विकल्प होते हैं: signed URLs का उपयोग करना या images को locally manually download करना (Azure CLI के माध्यम से) ताकि उन्हें locally upload किया जा सके। इन तरीकों के बीच चुनाव आपकी data processing और management की विशिष्ट जरूरतों पर निर्भर करता है।

* **Signed URLs**: यह तरीका विशेष रूप से तब फायदेमंद है जब आप अपनी local machine पर images download करने से जुड़ी अतिरिक्त step और समय-खपत से बचना चाहते हैं। signed URL के साथ, आप image data को सीधे Azure Blob Storage से Roboflow API पर upload कर सकते हैं, बिना इसे कभी locally store किए। इससे processing तेज़ होती है और आपकी local system पर load कम पड़ता है।
* **स्थानीय रूप से CLI**: ऐसी परिस्थितियाँ हो सकती हैं जहाँ आप पहले images को अपने local environment में download करना पसंद करें। उदाहरण के लिए, यदि आपको Roboflow पर upload करने से पहले images को preprocess करना है या उन्हें manually check करना है, तो local copies होना लाभदायक होगा।

सही method चुनना आपकी विशिष्ट use-case requirements पर निर्भर करेगा, जैसे data transfer की speed, preprocessing की ज़रूरत, या images की manual inspection।

## Azure Connection String

Storage Account बनाने के बाद, आप Azure portal में "Security + networking" के अंतर्गत "Access keys" सेक्शन में access keys या connection string पा सकते हैं। इन credentials का उपयोग आपके application को authenticate करने के लिए किया जाता है।

## विकल्प 1: Signed URL के माध्यम से Upload करें

आप Python में Azure SDK द्वारा Azure Blob Storage में अपनी images के लिए signed URLs generate कर सकते हैं।

```python
def get_blob_sas_url(blob_service_client, container_name: str, blob_name: str) -> str:
    """एक Azure Blob के लिए SAS URL जनरेट करें."""
    from azure.storage.blob import generate_blob_sas, BlobSasPermissions
    from datetime import datetime, timedelta

    sas_token = generate_blob_sas(
        blob_service_client.account_name,
        container_name,
        blob_name,
        account_key=blob_service_client.credential.account_key,
        permission=BlobSasPermissions(read=True),
        expiry=datetime.utcnow() + timedelta(hours=1)
    )
    
    blob_url = f"https://{blob_service_client.account_name}.blob.core.windows.net/{container_name}/{blob_name}?{sas_token}"
    return blob_url
```

ऊपर दिए गए code snippet में, आपको blob service client, container name, और blob name की आवश्यकता होती है। image का signed URL जनरेट करके वापस किया जाता है।

इसके आधार पर, हम एक complete solution बना सकते हैं जो Azure Blob Storage में उपलब्ध सभी objects को pull करता है, और फिर उन्हें API के माध्यम से Roboflow पर upload करता है। इस solution का एक outline नीचे देखा जा सकता है:

```python
from azure.storage.blob import BlobServiceClient
import requests
import urllib.parse

# ************* ये variables सेट करें *************
AZURE_CONNECTION_STRING = "YOUR_AZURE_CONNECTION_STRING"
AZURE_CONTAINER_NAME = "YOUR_AZURE_CONTAINER_NAME"
ROBOFLOW_API_KEY = "YOUR_ROBOFLOW_API_KEY"
ROBOFLOW_PROJECT_NAME = "YOUR_ROBOFLOW_PROJECT_NAME"
# ***********************************************

def get_blob_sas_url(blob_service_client, container_name: str, blob_name: str) -> str:
    """एक Azure Blob के लिए SAS URL जनरेट करें."""
    from azure.storage.blob import generate_blob_sas, BlobSasPermissions
    from datetime import datetime, timedelta

    sas_token = generate_blob_sas(
        blob_service_client.account_name,
        container_name,
        blob_name,
        account_key=blob_service_client.credential.account_key,
        permission=BlobSasPermissions(read=True),
        expiry=datetime.utcnow() + timedelta(hours=1)
    )
    
    blob_url = f"https://{blob_service_client.account_name}.blob.core.windows.net/{container_name}/{blob_name}?{sas_token}"
    return blob_url

def get_azure_blob_objects(container_name: str) -> list:
    """दिए गए Azure Blob container में blob names की सूची प्राप्त करें."""
    blob_service_client = BlobServiceClient.from_connection_string(AZURE_CONNECTION_STRING)
    container_client = blob_service_client.get_container_client(container_name)
    
    blobs = []
    blob_list = container_client.list_blobs()
    for blob in blob_list:
        blobs.append(blob.name)
    return blobs

def upload_to_roboflow(api_key: str, project_name: str, presigned_url: str, img_name='', split="train"):
    """Roboflow पर एक image upload करें."""
    API_URL = "https://api.roboflow.com"
    if img_name == '':
        img_name = presigned_url.split("/")[-1]

    upload_url = "".join([
        API_URL + "/dataset/" + project_name + "/upload",
        "?api_key=" + api_key,
        "&name=" + img_name,
        "&split=" + split,
        "&image=" + urllib.parse.quote_plus(presigned_url),
    ])
    response = requests.post(upload_url)

    # response code जांचें
    if response.status_code == 200:
        print(f"{img_name} को सफलतापूर्वक {project_name} में upload किया गया")
        return True
    else:
        print(f"{img_name} को upload करने में विफल। Error: {response.content.decode('utf-8')}")
        return False

if __name__ == "__main__":
    # उपलब्ध blobs की सूची प्राप्त करें
    available_blobs = get_azure_blob_objects(AZURE_CONTAINER_NAME)
    
    # वैकल्पिक: यहाँ blobs को filter करें
    # जैसे, available_blobs = [blob for blob in available_blobs if "some_condition"]
    
    # Azure Blob Service Client initialize करें
    blob_service_client = BlobServiceClient.from_connection_string(AZURE_CONNECTION_STRING)
    
    # blobs को Roboflow पर upload करें
    for blob in available_blobs:
        blob_url = get_blob_sas_url(blob_service_client, AZURE_CONTAINER_NAME, blob)
        upload_to_roboflow(ROBOFLOW_API_KEY, ROBOFLOW_PROJECT_NAME, blob_url)

```

## विकल्प 2: Azure से Data को Local रूप से Download करें

सबसे पहले, `azcopy` command line utility इंस्टॉल करें। यह utility आपको Azure Storage से files और folders download करने देती है। फिर, एक [Shared Access Signature](https://learn.microsoft.com/en-us/azure/storage/common/storage-sas-overview) token का उपयोग करके अपने Azure account के साथ authenticate करें। आप इसके बारे में अधिक जान सकते हैं [SAS token कैसे retrieve करें](https://learn.microsoft.com/en-us/azure/storage/common/storage-sas-overview) azcopy documentation में।

एक बार आपके पास `azcopy` set up हो जाने पर, file या folder download करने के लिए निम्न command चलाएँ:

```bash
azcopy copy "C:\local\path" <sas-token> --recursive=true
```

Replace `C:\local\path` को उस folder या file के path से बदलें जिसे आप download करना चाहते हैं। `<sas-token>` value को authentication के लिए एक SAS token से बदलें। अगर आप files और folders को recursively download करना चाहते हैं, तो ऊपर जैसा `--recursive=true` argument specify करें। अन्यथा, इस argument को हटा दें।

## Roboflow पर डेटा Upload करें

अब जब हमने data डाउनलोड कर लिया है, तो हम इसे Roboflow पर या तो [Upload Web Interface](/roboflow/roboflow-hi/datasets/adding-data.md#upload-data-with-the-web-application) का उपयोग करके या [Roboflow CLI](/roboflow/roboflow-hi/datasets/adding-data.md#upload-datasets-with-the-command-line).

## यह भी देखें

* [Datasources (Bucket Mirror)](/roboflow/roboflow-hi/datasets/adding-data/datasources.md) — बिना scripting के Azure से निरंतर, automatic sync
* [एक Roboflow project ID प्राप्त करें](https://docs.roboflow.com/api-reference/workspace-and-project-ids)
