2013-03-29 64 views
2

我想使用RackSpace的CDN(云文件)来存储我的静态内容。问题是我正在使用ASP.NET MVC3,我还没有看到任何当前的工作示例如何做到这一点。如何使用.net将文件上传到RackSpace Cloud文件?

我在网上看到了几个例子,但他们都是一个版本RackSpace不再支持。可以确认的是,这里对他们

http://www.rackspace.com/knowledge_center/article/sample-csharp-application-for-cloud-files

当你检查下openstack.net Rackspace的GitHub的账户,这是他们的支持重定向到该项目,你看,有没有支持上传文件到云文件。你可以看到,文件下表:

https://github.com/rackspace/openstack.net/wiki/Feature-Support

如何以编程方式使用C#我把文件上传到Rackspace的云文件?

回答

4

你是对的,目前openstack.net项目不支持CloudFiles。该功能将在本月晚些时候发布(4月中旬)。如果您愿意,仍然可以使用csharp-cloudfiles(https://github.com/rackerlabs/csharp-cloudfiles),因为它仍然有效,它只是处于弃用状态,并且不会收到任何更新或错误修复。

但是,这里是一个快速和肮脏的控制台应用程序,使用内置的HttpWebRequest/Response对象,应该可以帮助您开始,直到openstack.net v1.1发布。

class Program 
{ 
    const string filePath = @"Path\FileName"; 
    const string myToken = "myToken"; 
    const string url = "Url/Container/FileName"; 

    static void Main(string[] args) 
    { 
     //Do(); 
     DoAsync(); 
    } 

    static void Do() 
    { 
     using (var fs = File.Open(filePath, FileMode.Open, FileAccess.Read)) 
     { 
      UploadStream(new Uri(url), fs, myToken, 
       (response) => Console.WriteLine("Upload Complete. Status Code: {0} ({1})", response.StatusCode, response.StatusDescription)); 
     } 

     Console.WriteLine("Done!"); 
     Console.ReadLine(); 
    } 

    static void DoAsync() 
    { 
     IAsyncResult asyncRes; 
     using (var fs = File.Open(filePath, FileMode.Open, FileAccess.Read)) 
     { 
      asyncRes = UploadStreamAsync(new Uri(url), fs, myToken, 
       (asyncResult) => 
       { 
        var request = (HttpWebRequest)asyncResult.AsyncState; 
        var response = (HttpWebResponse)request.EndGetResponse(asyncResult); 
        Console.WriteLine("Upload Complete. Status Code: {0} ({1})", response.StatusCode, response.StatusDescription); 
       }); 
     } 

     asyncRes.AsyncWaitHandle.WaitOne(); 

     Console.WriteLine("Done!"); 
     Console.ReadLine(); 
    } 

    static IAsyncResult UploadStreamAsync(Uri uri, Stream contents, string token, AsyncCallback resultCallback, int chunkSize = 8 * 1024) 
    { 
     var req = (HttpWebRequest)WebRequest.Create(uri); 
     req.Headers.Add("X-Auth-Token", token); 
     req.Method = "PUT"; 

     req.AllowWriteStreamBuffering = false; 
     if (req.ContentLength == -1L) 
      req.SendChunked = true; 

     using (Stream stream = req.GetRequestStream()) 
     { 
      var buffer = new byte[chunkSize]; 
      int count; 
      while ((count = contents.Read(buffer, 0, chunkSize)) > 0) 
      { 
       stream.Write(buffer, 0, count); 
      } 
     } 

     return req.BeginGetResponse(resultCallback, req); 
    } 

    static void UploadStream(Uri uri, Stream contents, string token, Action<HttpWebResponse> resultCallback, int chunkSize = 8 * 1024) 
    { 
     var req = (HttpWebRequest)WebRequest.Create(uri); 
     req.Headers.Add("X-Auth-Token", token); 
     req.Method = "PUT"; 

     req.AllowWriteStreamBuffering = false; 
     if (req.ContentLength == -1L) 
      req.SendChunked = true; 

     using (Stream stream = req.GetRequestStream()) 
     { 
      var buffer = new byte[chunkSize]; 
      int count; 
      while ((count = contents.Read(buffer, 0, chunkSize)) > 0) 
      { 
       stream.Write(buffer, 0, count); 
      } 
     } 

     using (var resp = req.GetResponse() as HttpWebResponse) 
     { 
      resultCallback(resp); 
     } 
    } 
} 

在上面的代码,我已经提供了两个和异步和同步的方法,所以你不需要两个,只使用一个最适合你的。

如果您安装了Http Client NuGet软件包(http://nuget.org/packages/Microsoft.Net.Http/2.0.20710.0),则也可以使用HttpClient库。这里是一个样本:

static void UploadFileToRSCloud(string path, string filename) 
{ 
    HttpClient client = new HttpClient(); 
    MemoryStream ms = new MemoryStream(); 

    client.DefaultRequestHeaders.TransferEncodingChunked = true; 

    var filePath = 
    // Copy the data to the Resource Part 
    using (FileStream fileStream = new FileStream(filename, FileMode.Open, FileAccess.Read)) 
    { 
     CopyStream(fileStream, ms); 
    }// end:using(fileStream) - Close and dispose fileStream. 

    ms.Position = 0; 
    StreamContent sc = new StreamContent(ms); 

    client.DefaultRequestHeaders.Add("X-Auth-Token", "TOKEN HERE"); 

    var result = client.PutAsync("UrlBase/Container/ChipperJones.jpg", sc); 

    result.Wait(); 
} 

private static void CopyStream(Stream source, Stream target) 
{ 
    const int bufSize = 0x1000; 
    byte[] buf = new byte[bufSize]; 
    int bytesRead = 0; 
    while ((bytesRead = source.Read(buf, 0, bufSize)) > 0) 
     target.Write(buf, 0, bytesRead); 
} 

希望帮助!

+0

感谢艾伦的技术要求,它已经解决了。你是答复我的票的那个人。谢谢。 – eestein

+0

@alanquillin我相信在这一点上v1.1已经发布了,上面的库不再被推荐?是否有更新的示例在OpenStack.net中使用? –

2

截至2014年和回复马克男,这是怎么了应该做的事:

首先安装openstack.net包

https://www.nuget.org/packages/openstack.net/

PM> Install-Package openstack.net 

的代码上传:

public static string Upload(Stream stream, string fileName) 
{ 
    CloudFilesProvider cloudFilesProvider = getProvider(); 
    IEnumerable<string> containerObjectList = 
     cloudFilesProvider.ListObjects(CONTAINER_NAME, region: REGION_DFW) 
     .Select(o => o.Name); 
    string extension = Path.GetExtension(fileName); 
    string name = Path.GetFileNameWithoutExtension(fileName); 

    stream.Position = 0; 

    name = name.GenerateSlug(); //my method 
    fileName = name + extension; 

    while (containerObjectList.Contains(fileName)) 
     fileName = name + Guid.NewGuid().ToString().Split('-')[0] + extension; 

    cloudFilesProvider 
     .CreateObject(CONTAINER_NAME, stream, fileName, region: REGION_DFW); 

    return Constants.Rackspace.CloudFiles.PUBLIC_CONTAINER + fileName; 
} 

private static CloudFilesProvider getProvider() 
{ 
    CloudIdentity cloudIdentity = 
     new CloudIdentity() { APIKey = API_KEY, Username = USERNAME }; 
    return new CloudFilesProvider(cloudIdentity); 
} 

使用:

using net.openstack.Core.Domain; 
using net.openstack.Providers.Rackspace; 

就注意到,一些地方是我喜欢生成蛞蝓,使用的Guid地区,区域等

相关问题