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提供。

  1. public static bool UpLoadFilesToRemoteOSSUrl(string filePath, out string remoteUrl, out string errorMsg)
  2. {
  3. errorMsg = "ok";
  4. remoteUrl = "";
  5. var client = new Aliyun.OSS.OssClient(ConstUtils.EndPoint, ConstUtils.AccessKey, ConstUtils.AccessSecret);
  6. try
  7. {
  8. using (Stream sm = new FileStream(filePath, FileMode.Open))
  9. {
  10. DateTime now = DateTime.Now;
  11. string yyyy = now.Year.ToString().PadLeft(4, '0');
  12. string mm = now.Month.ToString().PadLeft(2, '0');
  13. string day = now.Day.ToString().PadLeft(2, '0');
  14. //文件的命名格式。这个其实和上传没有关系
  15. string fileName = $"snap/{Common.GetInstance().GetSecondCompanyId()}/{yyyy}-{mm}-{day}/{Path.GetFileName(filePath)}";
  16. //最重要的一局上传代码
  17. var result = client.PutObject(ConstUtils.Bucket, fileName, sm);
  18. if (result.HttpStatusCode == HttpStatusCode.OK)
  19. {
  20. remoteUrl = ConstUtils.ServerUrl + "/" + fileName;
  21. }
  22. else
  23. {
  24. remoteUrl = "";
  25. }
  26. }
  27. return true;
  28. }
  29. catch (Exception ex)
  30. {
  31. errorMsg = ex.Message;
  32. remoteUrl = "";
  33. }
  34. return false;
  35. }

第二种上传到天翼云oss

安装

  1. public static bool UploadFilesToRemoteUrl(string filepath, out string remoteUrl, out string errorMsg)
  2. {
  3. errorMsg = "ok";
  4. remoteUrl = "";
  5. try
  6. {
  7. using (Stream sm = new FileStream(filepath, FileMode.Open))
  8. {
  9. DateTime now = DateTime.Now;
  10. string yyyy = now.Year.ToString().PadLeft(4, '0');
  11. string mm = now.Month.ToString().PadLeft(2, '0');
  12. string day = now.Day.ToString().PadLeft(2, '0');
  13. string fileName = $"snap/{Common.GetInstance().GetSecondCompanyId()}/{yyyy}-{mm}-{day}/{Path.GetFileName(filepath)}";
  14. //using (var fs = new FileStream(fileName, FileMode.Open))
  15. {
  16. if (tianyi.AmazonS3ClientHelper.GetInstance().PutObject($"{fileName}", sm))
  17. {
  18. remoteUrl = tianyi.CtyunConst.OOS_SERVICE + "/" + tianyi.CtyunConst.bucketName + "/" + fileName;
  19. }
  20. else
  21. {
  22. remoteUrl = "";
  23. }
  24. }
  25. }
  26. return true;
  27. }
  28. catch (Exception ex)
  29. {
  30. errorMsg = ex.Message;
  31. remoteUrl = "";
  32. }
  33. return false;
  34. }

第三种调用本地的http请求接口直接上传对应的图片资源

使用异步方法调用。 这里用到了一个UpLoadResult对象,该对象主要标识 上传的结果。该对象的定义如下:

  1. public class UpLoadResult
  2. {
  3. //标识上传结果
  4. public bool Result
  5. {
  6. get;
  7. set;
  8. }
  9. //上传成功的的远程url,该路径为网路唯一路径
  10. public string RemoteUrl
  11. {
  12. get;
  13. set;
  14. }
  15. //当上传失败的时候,错误的提示。
  16. public string ErrorMsg
  17. {
  18. get;
  19. set;
  20. }
  21. }
  1. public static async Task<UpLoadResult> UploadLoclServer(string filePath)
  2. {
  3. var result = new UpLoadResult();
  4. result.RemoteUrl = "";
  5. result.ErrorMsg = "";
  6. result.Result = false;
  7. try
  8. {
  9. HttpClient client = new HttpClient();
  10. // 构造MultipartFormDataContent,用于上传文件
  11. MultipartFormDataContent formData = new MultipartFormDataContent();
  12. // 读取C#文件为byte[]
  13. byte[] fileBytes = File.ReadAllBytes(filePath);
  14. // 添加文件流到formData中
  15. string fileName = Path.GetFileName(filePath);
  16. formData.Add(new ByteArrayContent(fileBytes), "file", fileName);
  17. // 调用Java文件上传接口
  18. HttpResponseMessage response = await client.PostAsync(config.ConfigData.GetInstance().UploadServerUrl, formData);
  19. string responseBody = await response.Content.ReadAsStringAsync();
  20. // 处理响应
  21. if (response.IsSuccessStatusCode && FuncUtils.ChkStringIsJson(responseBody))
  22. {
  23. var cbData = JsonConvert.DeserializeObject<UploadResData>(responseBody);
  24. Common.GetInstance().GetInfoLog().Info($"上传成功:{filePath},远程地址:{cbData.Data}");
  25. result.ErrorMsg = "ok";
  26. result.RemoteUrl = cbData.Data;
  27. result.Result = true;
  28. }
  29. else
  30. {
  31. //Console.WriteLine("文件上传失败:" + response.StatusCode);
  32. Common.GetInstance().GetInfoLog().Info($"上传失败:{response.StatusCode}");
  33. result.ErrorMsg = "error";
  34. result.Result = false;
  35. }
  36. }
  37. catch (Exception ex)
  38. {
  39. Common.GetInstance().GetInfoLog().Info($"上传失败:{filePath},异常:{ex.Message}");
  40. result.ErrorMsg = "error";
  41. result.RemoteUrl = ex.Message;
  42. result.Result = false;
  43. }
  44. return result;
  45. }

本人正在做的一个图像抓拍程序。 并且将图片上传到对应的服务器。