有些时候接收到客户端的文件需要再上传到另一服务中(当前这种情况不常见),我们应该怎么处理呢。
目前需求是这样的,客户端有文件上传到A服务中,A服务需要再把文件上传到B服务中,实现的方案是,A服务获取到Request.Form.Files中的文件保存到本地,然后再获取本地的文件上传到B服务中,在使用中大量的请求,这样的操作导致了磁盘读写非常高。
string FileName = Request.Form.Files[0].FileName;
if (!Directory.Exists("D:\\Test"))//创建文件夹,如果不存在则创建
{
Directory.CreateDirectory("D:\\Test");
}
string fullPath = "D:\\Test\\" + Request.Form.Files[0].FileName;//组合成要存储到的目录
string PC = "D:\\Test\\Receivefile\\" + "aaa_" + FileName ;//最后下载到的目录
using (var stream = new FileStream(fullPath, FileMode.Create))
{
Request.Form.Files[0].CopyTo(stream);
}
try
{
var fileName = System.IO.Path.GetFileName(PC );
var client = new RestClient($"{123.123.123.123}api/uploadfile");
var request = new RestRequest("", Method.Post);
request.AlwaysMultipartFormData = true;
request.AddHeader("Content-Type", "multipart/form-data");
request.AddFile("file", PC );
request.AddParameter("multipart/form-data", fileName, ParameterType.RequestBody);
var response = client.Execute(request);
return response.StatusCode == System.Net.HttpStatusCode.OK;
}
catch (Exception e)
{
return false;
}
以上的操作需要先获取请求中的文件 保存到本地 然后再去上传,客户端如果很多请求多了服务器的磁盘读写就高,严重可能会导致宕机
我们可以改成直接读取请求中文件,转换成byte数组直接去上传,这样就减少了写入本地的操作
string FileName = Request.Form.Files[0].FileName;
Stream size = Request.Form.Files[0].OpenReadStream();//读取Request的文件
byte[] buffer = new byte[size.Length];//将Request转换为byte数组
size.Read(buffer, 0, buffer.Length);
try
{
var client = new RestClient($"http://123.123.123.44:16000/api/uploadfile");
var request = new RestRequest("", Method.Post);
request.AlwaysMultipartFormData = true;
request.AddHeader("Content-Type", "multipart/form-data");
request.AddFile("file", buffer, FileName);
request.AddParameter("multipart/form-data", FileName , ParameterType.RequestBody);
var response = client.Execute(request);
if (response.StatusCode == System.Net.HttpStatusCode.OK)
{
return new T返回 { rec = "200", msg = "上传成功" };
}
return new T返回 { rec = "400", msg = "上传失败" };
}
catch (Exception e)
{
return new T返回 { rec = "400", msg = "上传失败" };
}