using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Text;
using IStation.Bimface;
namespace IStation
{
///
/// 文件上传
///
public sealed partial class BimfaceClient
{
private const string _normalUploadUrl = @"https://file.bimface.com/upload";//普通文件流上传URL
private const string _policyUploadUrl = @"https://file.bimface.com/upload/policy";//文件直传URL
///
/// 普通文件流上传(不推荐)
///
/// 文件全路径
public UploadFileResponse UploadFileGeneral(string fullFileName, string fileName = null)
{
GetAccessToken();
if (string.IsNullOrEmpty(fileName))
{
var fileInfo = new FileInfo(fullFileName);
fileName = fileInfo.Name;
}
var utf8_fileName = Encoding.UTF8.GetString(Encoding.UTF8.GetBytes(fileName));
var url = string.Format("{0}?name={1}", _normalUploadUrl, utf8_fileName);
var request = (HttpWebRequest)WebRequest.Create(url);
request.Method = WebRequestMethods.Http.Put;
var autoHeader = new HttpHeaders().GetBasicAuthorHeader(_accesstoken);
request.Headers.Add(autoHeader.Key, autoHeader.Value);
byte[] bytes;
using (FileStream steam = new FileStream(fullFileName, FileMode.Open, FileAccess.Read))
{
bytes = new byte[(int)steam.Length];
steam.Read(bytes, 0, bytes.Length);
}
request.ContentLength = bytes.Length;
request.AllowWriteStreamBuffering = true;
using (Stream stream = request.GetRequestStream())
{
stream.Write(bytes, 0, bytes.Length);
stream.Flush();
}
var response = request.GetResponse();
string responsetext = string.Empty;
using (Stream stream = response.GetResponseStream())
using (StreamReader reader = new StreamReader(stream))
{
responsetext = reader.ReadToEnd();
}
var result = JsonHelper.Json2Object>(responsetext);
if (result.code != Constants.Success)
{
throw new BimfaceException(result.code);
}
if (result.data.status != Constants.Success)
{
throw new BimfaceException(result.code);
}
return result.data;
}
///
/// 普通文件流上传Core(不推荐)
///
/// 文件全路径
public UploadFileResponse UploadFileGeneralCore(string fullFileName, string fileName = null)
{
GetAccessToken();
if (string.IsNullOrEmpty(fileName))
{
var fileInfo = new FileInfo(fullFileName);
fileName = fileInfo.Name;
}
var utf8_fileName = Encoding.UTF8.GetString(Encoding.UTF8.GetBytes(fileName));
var url = string.Format("{0}?name={1}", _normalUploadUrl, utf8_fileName);
using (var httpClient = new HttpClient())
using (var request=new HttpRequestMessage(HttpMethod.Put,url))
using (var stream= new FileStream(fullFileName, FileMode.Open, FileAccess.Read))
{
var autoHeader = new HttpHeaders().GetBasicAuthorHeader(_accesstoken);
request.Headers.Add(autoHeader.Key, autoHeader.Value);
request.Content = new StreamContent(stream);
var response = httpClient.SendAsync(request).Result;
response.EnsureSuccessStatusCode();
var responsetext=response.Content.ReadAsStringAsync().Result;
var result = JsonHelper.Json2Object>(responsetext);
if (result.code != Constants.Success)
{
throw new BimfaceException(result.code);
}
if (result.data.status != Constants.Success)
{
throw new BimfaceException(result.code);
}
return result.data;
}
}
///
/// 文件直传(推荐)
///
/// 文件全路径
/// 文件名称(必须带后缀)
public UploadFileResponse UploadFilePolicy(string fullFileName, string fileName = null)
{
if (string.IsNullOrEmpty(fileName))
{
var fileInfo = new FileInfo(fullFileName);
fileName = fileInfo.Name;
}
var policyResult = GetFileUploadPolicy(fileName);
string boundary = "----" + DateTime.Now.Ticks.ToString("x");// 边界符
byte[] beginBoundaryBytes = Encoding.UTF8.GetBytes("--" + boundary + "\r\n"); // 边界符开始。【☆】右侧必须要有 \r\n 。
byte[] endBoundaryBytes = Encoding.UTF8.GetBytes("\r\n--" + boundary + "--\r\n"); // 边界符结束。【☆】两侧必须要有 --\r\n 。
var textFormTemplate = "Content-Disposition: form-data; name=\"{0}\"\r\n\r\n" + "{1}\r\n";//文本模板
var fileFormTemplate = "Content-Disposition: form-data; name=\"{0}\"; filename=\"{1}\"\r\n" + "Content-Type: application/octet-stream\r\n\r\n";//文件模板
var dic = new Dictionary();
dic.Add("name", fileName);
dic.Add("key", policyResult.objectKey);
dic.Add("policy", policyResult.policy);
dic.Add("OSSAccessKeyId", policyResult.accessId);
dic.Add("success_action_status", "200");
dic.Add("callback", policyResult.callbackBody);
dic.Add("signature", policyResult.signature);
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(policyResult.host);
request.ContentType = string.Format("multipart/form-data; boundary={0}", boundary);
request.Method = WebRequestMethods.Http.Post;
request.AllowWriteStreamBuffering = false;
//request.KeepAlive = true;
request.Timeout = -1;
long contentLength = 0;
var textBytesList = dic.Select(x =>
{
var textFormItem = string.Format(textFormTemplate, x.Key, x.Value);
byte[] textFormItemBytes = Encoding.UTF8.GetBytes(textFormItem);
contentLength += beginBoundaryBytes.Length;
contentLength += textFormItemBytes.Length;
return textFormItemBytes;
}).ToList();
var fileFormItem = string.Format(fileFormTemplate, "file", fileName);
byte[] fileFormItemBytes = Encoding.UTF8.GetBytes(fileFormItem);
contentLength += beginBoundaryBytes.Length;
contentLength += fileFormItemBytes.Length;
var fileStream = new FileStream(fullFileName, FileMode.Open, FileAccess.Read);
contentLength += fileStream.Length;
contentLength += endBoundaryBytes.Length;
request.ContentLength = contentLength;
var requestStream = request.GetRequestStream();
textBytesList.ForEach(x =>
{
requestStream.Write(beginBoundaryBytes, 0, beginBoundaryBytes.Length);
requestStream.Write(x, 0, x.Length);
});
requestStream.Write(beginBoundaryBytes, 0, beginBoundaryBytes.Length);
requestStream.Write(fileFormItemBytes, 0, fileFormItemBytes.Length);
//每次上传4M
byte[] buffer = new Byte[checked((uint)Math.Min(4096, (int)fileStream.Length))];
int bytesRead = 0;
while ((bytesRead = fileStream.Read(buffer, 0, buffer.Length)) != 0)
{
requestStream.Write(buffer, 0, bytesRead);
}
requestStream.Write(endBoundaryBytes, 0, endBoundaryBytes.Length);
fileStream.Close();
requestStream.Close();
var response = request.GetResponse();
string responsetext = string.Empty;
using (Stream stream = response.GetResponseStream())
using (StreamReader reader = new StreamReader(stream))
{
responsetext = reader.ReadToEnd();
}
var result = JsonHelper.Json2Object>(responsetext);
if (result.code != Constants.Success)
{
throw new BimfaceException(result.code);
}
if (result.data.status != Constants.Success)
{
throw new BimfaceException(result.code);
}
return result.data;
}
///
/// 文件直传Core(推荐)
///
/// 文件全路径
/// 文件名称(必须带后缀)
public UploadFileResponse UploadFilePolicyCore(string fullFileName, string fileName = null)
{
if (string.IsNullOrEmpty(fileName))
{
var fileInfo = new FileInfo(fullFileName);
fileName = fileInfo.Name;
}
var policyResult = GetFileUploadPolicy(fileName);
string responsetext = string.Empty;
using (var httpClient = new HttpClient())
{
httpClient.Timeout = Timeout.InfiniteTimeSpan;
var url = policyResult.host;
var content = new MultipartFormDataContent();
content.Add(new StringContent(fileName),"name");
content.Add(new StringContent(policyResult.objectKey), "key");
content.Add(new StringContent(policyResult.policy), "policy");
content.Add(new StringContent(policyResult.accessId), "OSSAccessKeyId");
content.Add(new StringContent("200"), "success_action_status");
content.Add(new StringContent(policyResult.callbackBody), "callback");
content.Add(new StringContent(policyResult.signature), "signature");
using (var fileStream = new FileStream(fullFileName, FileMode.Open, FileAccess.Read))
using (var streamContent = new StreamContent(fileStream, 2048))
{
content.Add(streamContent,"file",fileName);
var response = httpClient.PostAsync(url,content).Result;
response.EnsureSuccessStatusCode();
responsetext = response.Content.ReadAsStringAsync().Result;
}
}
var result = JsonHelper.Json2Object>(responsetext);
if (result.code != Constants.Success)
{
throw new BimfaceException(result.code);
}
if (result.data.status != Constants.Success)
{
throw new BimfaceException(result.code);
}
return result.data;
}
///
/// 文件直传
///
///
///
///
public long UploadFilePolicyEx(string fullFileName, string fileName = null)
{
var response = UploadFilePolicy(fullFileName,fileName);
if (response.status != Constants.Success)
{
return 0;
}
return response.fileId.Value;
}
//获取文件直传Policy
private UploadFilePolicyResponse GetFileUploadPolicy(string fileName)
{
GetAccessToken();
var utf8_fileName = Encoding.UTF8.GetString(Encoding.UTF8.GetBytes(fileName));
var url = string.Format("{0}?name={1}", _policyUploadUrl, utf8_fileName);
using (var httpClient = new HttpClient())
using (var request = new HttpRequestMessage(HttpMethod.Get, _translateUrl))
{
var autoHeader = new HttpHeaders().GetBasicAuthorHeader(_accesstoken);
request.Headers.Add(autoHeader.Key, autoHeader.Value);
var response = httpClient.SendAsync(request).Result;
response.EnsureSuccessStatusCode();
var responsetext = response.Content.ReadAsStringAsync().Result;
var result = JsonHelper.Json2Object>(responsetext);
if (result.code != Constants.Success)
{
throw new BimfaceException(result.code);
}
return result.data;
}
}
}
}