> 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/datasets/hi/create-and-upload/adding-data/upload-data-from-aws-gcp-and-azure/azure-blob-storage.md).

# Azure Blob Storage

{% hint style="info" %}
यह पृष्ठ साइन किए गए URL और स्थानीय डाउनलोड वर्कफ़्लो को कवर करता है। यदि आपका स्रोत डेटा Azure में है, तो उपयोग करें [Datasources](/datasets/hi/create-and-upload/adding-data/datasources.md) और इस पैटर्न को अपनाने के बजाय Bucket Mirror का उपयोग करें।
{% endhint %}

Azure Blob Storage में छवि डेटा भंडारण और Roboflow पर अपलोड करने के मामले में, आपके पास आमतौर पर दो विकल्प होते हैं: साइन किए गए URL का उपयोग करना या छवियों को स्थानीय रूप से (Azure CLI के माध्यम से) मैन्युअल रूप से डाउनलोड करके उन्हें स्थानीय रूप से अपलोड करना। इन विधियों के बीच चुनाव डेटा प्रसंस्करण और प्रबंधन के लिए आपकी विशिष्ट आवश्यकताओं पर निर्भर करता है।

* **साइन किए गए URL**: यह विधि विशेष रूप से लाभकारी है यदि आप छवियों को अपने स्थानीय मशीन पर डाउनलोड करने से जुड़ी अतिरिक्त प्रक्रिया और समय-खपत से बचना चाहते हैं। साइन किए गए URL के साथ, आप छवि डेटा को सीधे Azure Blob Storage से Roboflow API में बिना कभी भी इसे स्थानीय रूप से संग्रहीत किए अपलोड कर सकते हैं। इससे प्रसंस्करण तेज़ होता है और आपके स्थानीय सिस्टम पर कम भार पड़ता है।
* **CLI लोकल**ऐसी परिस्थितियाँ हो सकती हैं जहाँ आप पहले छवियों को अपने स्थानीय वातावरण में डाउनलोड करना पसंद करें। उदाहरण के लिए, यदि आपको Roboflow पर अपलोड करने से पहले छवियों को प्रीप्रोसेस करना है या उन्हें मैन्युअल रूप से जाँचना है, तो स्थानीय प्रतियाँ होना लाभकारी होगा।

सही तरीका चुनना आपकी विशिष्ट उपयोग-मामला आवश्यकताओं पर निर्भर करेगा, जैसे डेटा ट्रांसफर की गति, प्रीप्रोसेसिंग की आवश्यकता, या छवियों की मैन्युअल जाँच।

## Azure कनेक्शन स्ट्रिंग

Storage Account बनाने के बाद, आप Azure पोर्टल में "Security + networking" के अंतर्गत "Access keys" अनुभाग में एक्सेस कुंजियाँ या कनेक्शन स्ट्रिंग पा सकते हैं। इन क्रेडेंशियल्स का उपयोग आपके एप्लिकेशन को प्रमाणित करने के लिए किया जाता है।

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

आप Python में Azure SDK द्वारा Azure Blob Storage में अपनी छवियों के लिए साइन किए गए URL जनरेट कर सकते हैं।

```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
```

ऊपर दिए गए कोड स्निपेट में, आपको blob service client, container name, और blob name की आवश्यकता होती है। छवि का साइन किया गया URL जनरेट किया जाता है और लौटाया जाता है।

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

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

# ************* इन वेरिएबल्स को सेट करें *************
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 नामों की सूची प्राप्त करें।"""
    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 अपलोड करें।"""
    API_URL = "https://api.roboflow.com"
    यदि 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} में अपलोड किया गया")
        return True
    else:
        print(f"{img_name} को अपलोड करने में विफल। त्रुटि: {response.content.decode('utf-8')}")
        return False

if __name__ == "__main__":
    # उपलब्ध blobs की सूची प्राप्त करें
    available_blobs = get_azure_blob_objects(AZURE_CONTAINER_NAME)
    
    # वैकल्पिक: यहाँ blobs को फ़िल्टर करें
    # उदाहरण के लिए, available_blobs = [blob for blob in available_blobs if "some_condition"]
    
    # Azure Blob Service Client प्रारंभ करें
    blob_service_client = BlobServiceClient.from_connection_string(AZURE_CONNECTION_STRING)
    
    # blobs को Roboflow पर अपलोड करें
    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 से डेटा को स्थानीय रूप से डाउनलोड करें

सबसे पहले, स्थापित करें `azcopy` कमांड-लाइन यूटिलिटी। यह यूटिलिटी आपको Azure Storage से फ़ाइलें और फ़ोल्डर डाउनलोड करने देती है। फिर, एक का उपयोग करके अपने Azure खाते के साथ प्रमाणित करें [Shared Access Signature](https://learn.microsoft.com/en-us/azure/storage/common/storage-sas-overview) आप इसके बारे में अधिक जान सकते हैं [SAS टोकन कैसे प्राप्त करें](https://learn.microsoft.com/en-us/azure/storage/common/storage-sas-overview) azcopy दस्तावेज़ में।

एक बार जब आपके पास `azcopy` सेट अप करने के बाद, फ़ाइल या फ़ोल्डर डाउनलोड करने के लिए निम्न कमांड चलाएँ:

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

बदलें `C:\local\path` को उस फ़ोल्डर या फ़ाइल के पथ से बदलें जिसे आप डाउनलोड करना चाहते हैं। निम्न को बदलें `<sas-token>` मान को प्रमाणीकरण के लिए SAS टोकन से बदलें। यदि आप फ़ाइलों और फ़ोल्डरों को पुनरावर्ती रूप से डाउनलोड करना चाहते हैं, तो `--recursive=true` जैसा ऊपर दिखाया गया है, तर्क निर्दिष्ट करें। अन्यथा, इस तर्क को हटा दें।

## Roboflow में डेटा अपलोड करें

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

## यह भी देखें

* [Datasources (Bucket Mirror)](/datasets/hi/create-and-upload/adding-data/datasources.md) - बिना स्क्रिप्टिंग के Azure से निरंतर, स्वचालित सिंक
* [Roboflow project ID प्राप्त करें](https://docs.roboflow.com/reference/authentication/authentication/workspace-and-project-ids)
