asp.net - वेब पेज से एज़्योर ब्लॉब में बड़ी फ़ाइलों को कैसे अपलोड करें




azure azure-storage-blobs (3)

आंतरिक रूप से एएसपी.नेट में 2 जीबी एड्रेसिंग स्पेस है, लेकिन वास्तव में आपके पास 1 जीबी से भी कम अपलोड के लिए मुफ्त है (देखें http://support.microsoft.com/?id=295626 )। इसके अलावा आईआईएस 7 में 30 एमबी की टोपी है (देखें http://www.iislogs.com/steveschofield/iis7-post-40-adjusting-file-upload-size-in-iis7 ) और आपको अनुमान लगाया जाना चाहिए

appcmd set config "My Site/MyApp" -section:requestFiltering -requestLimits.maxAllowedContentLength:104857600 -commitpath:apphost

सर्वर पर इस 30 एमबी सीमा से परे जाना लेकिन मैं इसे अपने एज़्यूर सर्वर पर कैसे चला सकता हूँ?

इसके अलावा, http://support.microsoft.com/?id=295626 के अनुसार

अपलोड प्रक्रिया के दौरान, एएसपी.एन.ई.टी. पूरी फाइल मेमोरी में लोड करता है इससे पहले कि उपयोगकर्ता फाइल को डिस्क पर सहेज सके।

, इसलिए यदि मैं एक समय में बड़ी संख्या में उपयोगकर्ता बड़ी फ़ाइलों को अपलोड करता हूं, तो मैं जल्दी से स्मृति सीमा को समाप्त कर दूँगा। नीचे दिए गए मेरे कोड में मैं धाराओं का उपयोग करता हूं, लेकिन मुझे लगता है कि पूरी फाइल मेमोरी में पहले भी अपलोड की जाती है। क्या यह मामला है?

using System;
using System.Web.Security;
using Microsoft.WindowsAzure;
using Microsoft.WindowsAzure.StorageClient;

namespace WebPages
{
    public partial class Upload : System.Web.UI.Page
    {
        CloudBlobClient BlobClient = null;
        CloudBlobContainer BlobContainer = null;

        void InitBlob()
        {
            // Setup the connection to Windows Azure Storage
            var storageAccount = CloudStorageAccount.FromConfigurationSetting("DataConnectionString");
            BlobClient = storageAccount.CreateCloudBlobClient();

            // Get and create the container
            BlobContainer = BlobClient.GetContainerReference("publicfiles");
        }

        protected void Page_Load(object sender, EventArgs e)
        {
            //if (Membership.GetUser() == null) return;   // Only allow registered users to upload files

            InitBlob();

            try
            {
                var file = Request.Files["Filedata"];

                var storageAccount = CloudStorageAccount.FromConfigurationSetting("DataConnectionString");
                BlobClient = storageAccount.CreateCloudBlobClient();

                // Make a unique blob name
                var extension = System.IO.Path.GetExtension(file.FileName);

                // Create the Blob and upload the file
                var blobAddressUri = String.Format("{0}{1}", Guid.NewGuid(), extension);
                var blob = BlobContainer.GetBlobReference(blobAddressUri);

                blob.UploadFromStream(file.InputStream);

                // Set the metadata into the blob
                blob.Metadata["FileName"] = file.FileName;
                //blob.Metadata["Submitter"] = Membership.GetUser().UserName;
                blob.Metadata["Type"] = "Video";
                blob.Metadata["Description"] = "Test";
                blob.SetMetadata();

                // Set the properties
                blob.Properties.ContentType = file.ContentType;
                blob.SetProperties();
            }
            catch(Exception ex)
            {
                System.Diagnostics.Trace.TraceError("Upload file exception: {0}", ex.ToString());
                // If any kind of error occurs return a 500 Internal Server error
                Response.StatusCode = 500;
                Response.Write("An error occured while uploading the file");
                Response.End();
            }
        }
    }
}

मैं http://azureblobuploader.codeplex.com/ जैसे गैर वेब पेज अपलोड टूल के बारे में जानता हूं, लेकिन मुझे वाकई एक वेब पेज से अपलोड करने की आवश्यकता है।

तो, मेरे सवाल हैं:

  1. मैं एक वेब पेज से 2 जीबी से अधिक बड़ा ब्लॉब के लिए फाइल कैसे अपलोड करूँ?
  2. मैं एक वेब पेज से ऐसी स्ट्रीम के रूप में बड़ी अपलोड फाइल कैसे कर सकता हूं जो सभी मेमोरी नहीं खाती
  3. यदि समाधान मेरे अपलोड करने के लिए अपने खुद के एचटीटीपी मॉड्यूल या एचटीटीपीहैंडलर को लिखना है, तो मैं इसे अपने एज़्यूर सर्वर पर कैसे स्थापित कर सकता हूं? क्या मैं एचटीटीपीएंडलर्स का उपयोग http://neatupload.codeplex.com/ पर नीला कर सकता हूँ?
  4. यह परियोजना SharePoint पर नहीं है, लेकिन मुझे लगता है कि SharePoint में आपको ब्लॉब प्रदाता कहा जाता है और आप अपना खुद का लिख ​​सकते हैं, क्या ASP.NET के लिए ब्लॉब प्रदाता हैं?

मैं यह भी उल्लेख कर सकता हूं कि मेरा कोड 30 MB से छोटा फाइलों के साथ डिफ़ॉल्ट रूप से ठीक काम करता है, मैं क्लाइंट पर SWFUpload V2.2.0 का उपयोग करता हूं।

अपडेट 19. जून 1 9 07 : Twitter पर @YvesGoeleven ने मुझे साझा पहुँच हस्ताक्षर का उपयोग करने का एक संकेत दिया (msdn.microsoft.com/en-us/library/ee395415.aspx देखें) और फ़ाइल सीधे बिना अज़ूर ब्लॉब संग्रहण में अपलोड करना एएसपी.नेट के माध्यम से जा रहा है। मैंने एक JSON WCF बनाया है जो मेरे ब्लॉब संग्रहण के लिए एक मान्य एसएएस यूट देता है।

using System.ServiceModel;
using System.ServiceModel.Web;

namespace WebPages.Interfaces
{
    [ServiceContract]
    public interface IUpload
    {
        [OperationContract]
        [WebInvoke(Method = "GET",
            ResponseFormat = WebMessageFormat.Json)]
        string GetUploadUrl();
    }
}

--------

using System;
using System.IO;
using System.Runtime.Serialization.Json;
using System.ServiceModel.Activation;
using System.Text;
using Microsoft.WindowsAzure;
using Microsoft.WindowsAzure.StorageClient;

namespace WebPages.Interfaces
{
    [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
    public class UploadService : IUpload
    {
        CloudBlobClient BlobClient;
        CloudBlobContainer BlobContainer;

        public UploadService()
        {
            // Setup the connection to Windows Azure Storage
            var storageAccount = CloudStorageAccount.FromConfigurationSetting("DataConnectionString");
            BlobClient = storageAccount.CreateCloudBlobClient();

            // Get and create the container
            BlobContainer = BlobClient.GetContainerReference("publicfiles");
        }

        string JsonSerialize(string url)
        {
            var serializer = new DataContractJsonSerializer(url.GetType());
            var memoryStream = new MemoryStream();

            serializer.WriteObject(memoryStream, url);

            return Encoding.Default.GetString(memoryStream.ToArray());
        }

        public string GetUploadUrl()
        {
            var sasWithIdentifier = BlobContainer.GetSharedAccessSignature(new SharedAccessPolicy()
            {
                Permissions = SharedAccessPermissions.Write,
                SharedAccessExpiryTime =
                    DateTime.UtcNow.AddMinutes(60)
            });
            return JsonSerialize(BlobContainer.Uri.AbsoluteUri + "/" + Guid.NewGuid() + sasWithIdentifier);
        }
    }
}

यह काम करता है, लेकिन मैं इसे SWFUpload के साथ उपयोग नहीं कर सकता क्योंकि यह HTTP POST क्रिया का उपयोग करता है और HTTP PUT क्रिया नहीं है कि एज़्योर ब्लॉब संग्रहण को उम्मीद है कि एक नया ब्लॉब आइटम बनाते समय कोई भी अपने स्वयं के कस्टम सिल्वरलाइट या फ्लैश क्लाइंट घटक जो बिना HTTP PUT क्रिया का उपयोग करता है, के बिना यह कैसे घूमता है? मैं फ़ाइलों को अपलोड करते समय एक प्रगति पट्टी चाहता था, इसलिए पट का उपयोग करने वाला कोई भी फॉर्म इष्टतम नहीं है I

क्लाइंट कोड में दिलचस्पी रखने वालों के लिए (जो SWFUpload के बाद से काम नहीं करते HTTP पोस्ट का उपयोग करता है और एज़्यूर ब्लॉब संग्रहण की उम्मीद नहीं के रूप में PUT):

    <div id="header">
        <h1 id="logo"><a href="/">SWFUpload</a></h1>
        <div id="version">v2.2.0</div>
    </div>
    <div id="content">
        <h2>Application Demo (ASP.Net 2.0)</h2>
        <div id="swfu_container" style="margin: 0px 10px;">
            <div>
                <span id="spanButtonPlaceholder"></span>
            </div>
            <div id="divFileProgressContainer" style="height: 75px;"></div>
            <div id="thumbnails"></div>
        </div>
    </div>

 <script type="text/javascript" language="javascript">
        $(document).ready(function () {

            $.ajax({
                url: '/Interfaces/UploadService.svc/GetUploadUrl',
                success: function (result) {
                    var parsedResult = $.parseJSON(result);
                    InitUploadFile(parsedResult);
                }
            });


            function InitUploadFile(uploadUrl) {
                //alert(uploadUrl);
                var swfu = new SWFUpload({
                    // Backend Settings
                    upload_url: uploadUrl,
                    post_params: {
                        "ASPSESSID": "<%=Session.SessionID %>"
                    },

                    // File Upload Settings
                    file_size_limit: "100 MB",
                    file_types: "*.*",
                    file_types_description: "All file types",
                    file_upload_limit: "0",    // Zero means unlimited

                    // Event Handler Settings - these functions as defined in Handlers.js
                    //  The handlers are not part of SWFUpload but are part of my website and control how
                    //  my website reacts to the SWFUpload events.
                    file_queue_error_handler: fileQueueError,
                    file_dialog_complete_handler: fileDialogComplete,
                    upload_progress_handler: uploadProgress,
                    upload_error_handler: uploadError,
                    upload_success_handler: uploadSuccess,
                    upload_complete_handler: uploadComplete,

                    // Button settings
                    button_image_url: "Images/swfupload/XPButtonNoText_160x22.png",
                    button_placeholder_id: "spanButtonPlaceholder",
                    button_width: 160,
                    button_height: 22,
                    button_text: '<span class="button">Select files <span class="buttonSmall">(2 MB Max)</span></span>',
                    button_text_style: '.button { font-family: Helvetica, Arial, sans-serif; font-size: 14pt; } .buttonSmall { font-size: 10pt; }',
                    button_text_top_padding: 1,
                    button_text_left_padding: 5,

                    // Flash Settings
                    flash_url: "Js/swfupload-2.2.0/swfupload.swf", // Relative to this file

                    custom_settings: {
                        upload_target: "divFileProgressContainer"
                    },

                    // Debug Settings
                    debug: false
                });
            }
       });
    </script>

अपडेट 19. जून 21:07:

मुझे लगा कि SWFUpload खुले स्रोत है कि मैं स्रोत को डाउनलोड करता हूं और पोस्ट को पोस्ट से पट में बदल देता है, दुर्भाग्य से फ़्लैश प्लेयर URLRequestMethod GET और POST के अलावा अन्य क्रियाओं का समर्थन नहीं करता है। मुझे एक कथित काम मिल गया-आसपास

private function BuildRequest():URLRequest {
   // Create the request object
   var request:URLRequest = new URLRequest();
   request.method = URLRequestMethod.POST;
   request.requestHeaders.push(new URLRequestHeader("X-HTTP-Method-Override", "PUT"));

, लेकिन यह केवल एडोब एयर में काम करता है और फ्लैश प्लेयर के साथ नहीं।

मैंने पढ़ा है कि SilverLight 3 और बाद में HTTP PUT क्रिया का समर्थन करता है, इसलिए मुझे लगता है कि मुझे यहां अपना रास्ता लेने के लिए कुछ SilverLight कोड लिखना होगा मुझे यह ब्लॉग लेख श्रृंखला मिली जो संभवत: मुझे यहां सहायता करेगी http://blog.smarx.com/posts/uploading-windows-azure-blobs-from-silverlight-part-1-shared-access-signatures

अपडेट @ 27. जून '11:

अब मैं http://blog.smarx.com/posts/uploading-windows- पर प्रोजेक्ट के आधार पर लिखे एक कस्टम सिल्वरलाइट क्लाइंट का उपयोग करते हुए एक वेब पेज से बड़ी फ़ाइलों (4,5 जीबी फ़ाइलों के साथ परीक्षण) को सफलतापूर्वक प्रबंधित करने में कामयाब रहा हूँ। नीला-ब्लॉप्स-इन-कल्चरलिइट-पार्ट-1- साझा-प्रवेश-हस्ताक्षर चूंकि सिल्वरलाइट एचटीटीपी पुट क्रिया का समर्थन करता है, क्योंकि एज़्यूर ब्लॉब स्टोरेज के लिए आवश्यक है और प्रगतिशील अपलोड का समर्थन करता है, अब मुझे बड़े फाइलों को सीधे एज़्योर ब्लॉब स्टोरेज में अपलोड करने की संभावना है और मुझे एएसपी.नेट समाधान को थ्रॉघ नहीं जाना है, मुझे भी कुछ अच्छी प्रगति बार प्राप्त करें और उपयोगकर्ता अपलोड के मध्य में रद्द कर सकते हैं यदि वह / वह चाहता है सर्वर पर मेमोरी उपयोग न्यूनतम है क्योंकि पूरी फाइल अपलोड नहीं की गई है इससे पहले कि वह Azure Blob Storage में रखा गया है। मैं एक साझा एक्सेस हस्ताक्षर का उपयोग करता हूं (देखें msdn.microsoft.com/en-us/library/ee395415.aspx) जो अनुरोध पर WCF RESTfull सेवा से आपूर्ति की जाती है। मुझे लगता है कि यह समाधान सबसे अच्छा है जो हमें मिला है। धन्यवाद।

अपडेट @ 18 जुलाई '11:

मैंने यहां जो कुछ पाया उसके साथ मैंने एक ओपन सोर्स प्रोजेक्ट बनाया है:

http://azureslfileuploader.codeplex.com/


इस प्रश्न के इस भाग के लिए:

appcmd set config "My Site/MyApp" -section:requestFiltering -requestLimits.maxAllowedContentLength:104857600 -commitpath:apphost 

सर्वर पर इस 30 एमबी सीमा से परे जाना लेकिन मैं इसे अपने एज़्यूर सर्वर पर कैसे चला सकता हूँ?

आप स्टार्टअप कार्यों का उपयोग करके यह कर सकते हैं - देखें http://richardprodger.wordpress.com/2011/03/22/azure-iis7-configuration-with-appcmd/


कोई फर्क नहीं पड़ता कि आपके द्वारा उपयोग किए जाने वाले कोड पैटर्न यदि आप एक सर्वर साइड कोड लिखते हैं, तो फ़ाइल आपके वेबलॉल पर जा रही है और तब कई रीति-रिवाज जैसे रोल रीसायकल और फिर से प्रयास करने में असफल अपलोड आने वाले हैं। मैंने इन मुद्दों को हटा दिया, हालांकि क्लाइंट साइड सिल्वरलाइट कंट्रोल, जिसने न केवल गलती सहिष्णु अपलोड किया बल्कि यह एक महान गति से भी किया आप अपना नमूना डाउनलोड कर पढ़ सकते हैं कि मैंने इसे कैसे बनाया था: अपनी नीला फ़ाइल अपलोड करें नियंत्रण: Silverlight और TPL या HTML5 और AJAX


समानांतर अपलोड का उपयोग करके हम बहुत बड़ी फ़ाइलों को नीला संग्रहण में अपलोड कर सकते हैं। इसका मतलब है कि हमें बड़ी फ़ाइलों को छोटे फ़ाइल पैकेट के टुकड़ों में विभाजित करने की आवश्यकता है और इन पैकेटों को उओगेट किया गया है। अपलोड करने के बाद हम पैकेट में मूल एक में शामिल हो सकते हैं। पूर्ण कोड के लिए कृपया निम्नलिखित लिंक देखें http://tuvian.wordpress.com/2011/06/28/how-to-upload-large-size-fileblob-to-zure-storage-using-asp-netc/





azure-storage-blobs