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에 회신으로
감사 앨런의 GUID, 지역을 사용하여, 슬러그를 생성처럼 내 기술 요구 사항이 있다는 사실을, 그것은 이미 해결되었습니다. 너는 내 표를 대답 한 사람이다. 감사. – eestein
@alanquillin이 시점에서 v1.1이 게시되었으며 위의 라이브러리는 더 이상 권장되지 않는다고 생각합니까? OpenStack.net과 함께 사용하기 위해 어딘가에 배치 된 업데이트 된 예제가 있습니까? –