C#上传文件到服务器,winform项目开发,抓拍图片的上传
近来在做一个抓拍的程序,C#winform项目,通过对接摄像头,可以将摄像头抓拍的图片保存到本地,接下来希望将保存的图片上传到服务器。服务器目前暂时分为3中类型:
1.阿里云的oss 可以对接阿里云的oss的sdk通过 nuget来下载对应的包。实现起来相对容易
2.天翼云服务器 可以通过nuget安装对应的包。实现起来也没有那么费劲。
3.本地的文件储存服务器,使用java开发的文件存储服务器。 通过调用对应的http请求接口。实现将本地图片上传到对应的服务器存储起来。
本文通过示例代码来介绍三种 文件上传的方法。用的可以参考,仅限参考。
第一种,上传文件到阿里云oss
需要安装:Aliyun.OSS.sdk包。下面的实例代码完全使用oss的sdk来操作。不需要开发者自己关注更多细节,值需要配置好对应的 AccessKey和AccessSecret,EnPoint即可 即可。 这几个参数是 oss提供。
public static bool UpLoadFilesToRemoteOSSUrl(string filePath, out string remoteUrl, out string errorMsg)
{
errorMsg = "ok";
remoteUrl = "";
var client = new Aliyun.OSS.OssClient(ConstUtils.EndPoint, ConstUtils.AccessKey, ConstUtils.AccessSecret);
try
{
using (Stream sm = new FileStream(filePath, FileMode.Open))
{
DateTime now = DateTime.Now;
string yyyy = now.Year.ToString().PadLeft(4, '0');
string mm = now.Month.ToString().PadLeft(2, '0');
string day = now.Day.ToString().PadLeft(2, '0');
//文件的命名格式。这个其实和上传没有关系
string fileName = $"snap/{Common.GetInstance().GetSecondCompanyId()}/{yyyy}-{mm}-{day}/{Path.GetFileName(filePath)}";
//最重要的一局上传代码
var result = client.PutObject(ConstUtils.Bucket, fileName, sm);
if (result.HttpStatusCode == HttpStatusCode.OK)
{
remoteUrl = ConstUtils.ServerUrl + "/" + fileName;
}
else
{
remoteUrl = "";
}
}
return true;
}
catch (Exception ex)
{
errorMsg = ex.Message;
remoteUrl = "";
}
return false;
}
第二种上传到天翼云oss
安装
public static bool UploadFilesToRemoteUrl(string filepath, out string remoteUrl, out string errorMsg)
{
errorMsg = "ok";
remoteUrl = "";
try
{
using (Stream sm = new FileStream(filepath, FileMode.Open))
{
DateTime now = DateTime.Now;
string yyyy = now.Year.ToString().PadLeft(4, '0');
string mm = now.Month.ToString().PadLeft(2, '0');
string day = now.Day.ToString().PadLeft(2, '0');
string fileName = $"snap/{Common.GetInstance().GetSecondCompanyId()}/{yyyy}-{mm}-{day}/{Path.GetFileName(filepath)}";
//using (var fs = new FileStream(fileName, FileMode.Open))
{
if (tianyi.AmazonS3ClientHelper.GetInstance().PutObject($"{fileName}", sm))
{
remoteUrl = tianyi.CtyunConst.OOS_SERVICE + "/" + tianyi.CtyunConst.bucketName + "/" + fileName;
}
else
{
remoteUrl = "";
}
}
}
return true;
}
catch (Exception ex)
{
errorMsg = ex.Message;
remoteUrl = "";
}
return false;
}
第三种调用本地的http请求接口直接上传对应的图片资源
使用异步方法调用。 这里用到了一个UpLoadResult对象,该对象主要标识 上传的结果。该对象的定义如下:
public class UpLoadResult
{
//标识上传结果
public bool Result
{
get;
set;
}
//上传成功的的远程url,该路径为网路唯一路径
public string RemoteUrl
{
get;
set;
}
//当上传失败的时候,错误的提示。
public string ErrorMsg
{
get;
set;
}
}
public static async Task<UpLoadResult> UploadLoclServer(string filePath)
{
var result = new UpLoadResult();
result.RemoteUrl = "";
result.ErrorMsg = "";
result.Result = false;
try
{
HttpClient client = new HttpClient();
// 构造MultipartFormDataContent,用于上传文件
MultipartFormDataContent formData = new MultipartFormDataContent();
// 读取C#文件为byte[]
byte[] fileBytes = File.ReadAllBytes(filePath);
// 添加文件流到formData中
string fileName = Path.GetFileName(filePath);
formData.Add(new ByteArrayContent(fileBytes), "file", fileName);
// 调用Java文件上传接口
HttpResponseMessage response = await client.PostAsync(config.ConfigData.GetInstance().UploadServerUrl, formData);
string responseBody = await response.Content.ReadAsStringAsync();
// 处理响应
if (response.IsSuccessStatusCode && FuncUtils.ChkStringIsJson(responseBody))
{
var cbData = JsonConvert.DeserializeObject<UploadResData>(responseBody);
Common.GetInstance().GetInfoLog().Info($"上传成功:{filePath},远程地址:{cbData.Data}");
result.ErrorMsg = "ok";
result.RemoteUrl = cbData.Data;
result.Result = true;
}
else
{
//Console.WriteLine("文件上传失败:" + response.StatusCode);
Common.GetInstance().GetInfoLog().Info($"上传失败:{response.StatusCode}");
result.ErrorMsg = "error";
result.Result = false;
}
}
catch (Exception ex)
{
Common.GetInstance().GetInfoLog().Info($"上传失败:{filePath},异常:{ex.Message}");
result.ErrorMsg = "error";
result.RemoteUrl = ex.Message;
result.Result = false;
}
return result;
}
本人正在做的一个图像抓拍程序。 并且将图片上传到对应的服务器。
很赞哦! (0)