说明:实现文件的上传功能。后端使用.net core3.1作为接口服务,用于接收文件。前端使用winfrom 实现文件上传。
1、.net core3.1 实现webApi接口。
/// <summary>
/// 客户端:上传图片、视频
/// </summary>
/// <returns></returns>
[HttpPost]
[Route("postUploadFile")]
public ResultObject postUploadFile() {
ResultObject result = new ResultObject();
try {
IFormFileCollection files = Request.Form.Files;
foreach (IFormFile file in files) {
//目录
string directory = Path.Combine(Directory.GetCurrentDirectory(), "Upload");
if (!Directory.Exists(directory)) {
Directory.CreateDirectory(directory);
}
string filePath = Path.Combine(directory, file.FileName);
// 写入文件
using (var stream = new FileStream(filePath, FileMode.Create)) {
file.CopyTo(stream);
stream.Flush();
}
}
result = CommonResult.success();
}
catch (Exception vErr) {
result = CommonResult.failure(vErr.Message);
}
return result;
}
2、winfrom 项目代码
public class UploadFileHelper {
/// <summary>
/// Http Post 可传文件参数
/// </summary>
/// <param name="dic">字符串 字典数据</param>
/// <param name="dicFile">文件 字典数据</param>
/// <returns></returns>
public bool PostJsonDataFile(Dictionary<string, string> dic, Dictionary<string, KeyValuePair<string, byte[]>> dicFile) {
bool vCheck = true;
string str = "";
try {
string url = ConfigurationManager.AppSettings["UploadFileUrl"].ToString();
Uri uri = new Uri(url);
var httpclientHandler = new HttpClientHandler();
HttpClient client = new HttpClient(httpclientHandler);
client.Timeout = Timeout.InfiniteTimeSpan;
var form = new MultipartFormDataContent();
string boundary = string.Format("--{0}", DateTime.Now.Ticks.ToString("x"));
form.Headers.Add("ContentType", $"multipart/form-data, boundary={boundary}");
if (dic != null) {
foreach (var key in dic.Keys) {
form.Add(new StringContent(dic[key].ToString()), key);
}
}
if (dicFile != null) {
foreach (var key in dicFile.Keys) {
var fileContent = new ByteArrayContent(dicFile[key].Value);
fileContent.Headers.ContentType = new MediaTypeHeaderValue("text/plain");
form.Add(fileContent, name: key, fileName: dicFile[key].Key);
}
}
Util.SetCertificatePolicy();//为SSL/TLS 安全通道建立信任关系
HttpResponseMessage response = client.PostAsync(url, form).Result;
str = response.Content.ReadAsStringAsync().Result;
}
catch (Exception vErr) {
vCheck = false;
str = vErr.Message;
}
return vCheck;
}
}
public static class Util {
/// <summary>
/// Sets the cert policy.
/// </summary>
public static void SetCertificatePolicy() {
ServicePointManager.ServerCertificateValidationCallback += RemoteCertificateValidate;
}
/// <summary>
/// Remotes the certificate validate.
/// </summary>
private static bool RemoteCertificateValidate(
object sender, X509Certificate cert, X509Chain chain, SslPolicyErrors error) {
// trust any certificate!!!
System.Console.WriteLine("Warning, trust any certificate");
return true;
}
}
string vName = DateTime.Now.ToString("yyyyMMddHHmmssffff") + "_" + new Random().Next(1, 10000) + System.IO.Path.GetExtension(vFileNames[i]);
//上传图片
if (vCheck) {
Dictionary<string, KeyValuePair<string, byte[]>> vParam = new Dictionary<string, KeyValuePair<string, byte[]>>();
vParam.Add("imageFile", new KeyValuePair<string, byte[]>(vName, System.IO.File.ReadAllBytes(vFileNames[i])));
UploadFileHelper uploadFile = new UploadFileHelper();
vCheck = uploadFile.PostJsonDataFile(null, vParam);
}