2013-03-29 4 views
2

정적 컨텐츠를 저장하기 위해 RackSpace의 CDN (Cloud Files)을 사용하고 싶습니다. 문제는 내가 ASP.NET MVC3을 사용하고 있으며 현재 수행중인 작업 예제를 보지 못했습니다..net을 사용하여 RackSpace 클라우드 파일에 파일을 업로드하는 방법은 무엇입니까?

온라인으로 몇 가지 예를 보았지만 이제는 RackSpace가 더 이상 지원하지 않는 버전이었습니다. 당신은 그들의 에 여기 사항을 확인 할 수 있습니다

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

을 그리고 당신이 그들의 지원에 리디렉션 프로젝트 openstack.net에서 랙 스페이스의 GitHub의 계정을 확인할 때, 당신은 파일을 업로드에 대한 지원이 없다는 것을 참조 클라우드 파일. 당신은 파일 테이블에서 그것을 볼 수 있습니다

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

어떻게 C#을 사용 프로그래밍 랙 스페이스의 클라우드 파일에 파일을 업로드 할 수 있습니까?

답변

4

openstack.net 프로젝트가 CloudFiles를 지원하지 않는 시점에서 정확합니다. 이 기능은 이번 달 (4 월 중순)에 출시 될 예정입니다. 원한다면 여전히 csharp-cloudfiles (https://github.com/rackerlabs/csharp-cloudfiles)를 사용할 수 있습니다. 여전히 작동하기 때문에 더 이상 지원되지 않는 상태이며 업데이트 또는 버그 수정이 제공되지 않습니다.

그러나 여기에는 openstack.net v1.1이 출시 될 때까지 시작하는 데 도움이되는 HttpWebRequest/Response 객체가 내장 된 빠르고 사용하기 쉬운 콘솔 앱이 있습니다. 위의 코드에서

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 클라이언트 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); 
} 

희망이 있습니다. 2014 년과 마크 M에 회신으로

+0

감사 앨런의 GUID, 지역을 사용하여, 슬러그를 생성처럼 내 기술 요구 사항이 있다는 사실을, 그것은 이미 해결되었습니다. 너는 내 표를 대답 한 사람이다. 감사. – eestein

+0

@alanquillin이 시점에서 v1.1이 게시되었으며 위의 라이브러리는 더 이상 권장되지 않는다고 생각합니까? OpenStack.net과 함께 사용하기 위해 어딘가에 배치 된 업데이트 된 예제가 있습니까? –

2

이 그것을 할 방법입니다 :

먼저 업로드 할 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; 

그냥 몇 가지 부품 등