C# 一个webapi接口,接收来自其它软件传过来的文件,实现文件上传功能。
这是个例子 接收上传文件流+存储到本地 代码是.net 5下实现的 , 其他的环境下大同小异
[Route("~/file/upload/{Id}")]
public JsonResult Upload()
{
try
{
var file = Request.Form.Files.FirstOrDefault();
if (file is null)
{
return new JsonResult(new { success = 0, message = "不能提交空文件" });
}
string FileName = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, $"{Guid.NewGuid()}.jpg"); //文件存储地址
using (FileStream fs = new FileStream(FileName, FileMode.Create, FileAccess.ReadWrite, FileShare.ReadWrite))
{
using (Stream stream = file.OpenReadStream())
{
stream.CopyTo(fs);
}
}
return new JsonResult(new { success = 1, message = "上传成功", url = FileName });
}
catch (Exception ex)
{
return new JsonResult(new { success = 500, message = ex.Message });
}
}
/// <summary>
/// POST api/FileManager/PostFormData
/// </summary>
/// <returns></returns>
[ActionName("PostFormData")]
[HttpPost]
public async Task<HttpResponseMessage> PostFormData()
{
// Check if the request contains multipart/form-data.
// 检查该请求是否含有multipart/form-data
if (!Request.Content.IsMimeMultipartContent())
{
throw new HttpResponseException(HttpStatusCode.UnsupportedMediaType);
}
string root = HttpContext.Current.Server.MapPath(PortraitApp);
var provider = new MultipartFormDataStreamProvider(root);
try
{
// Read the form data.
// 读取表单数据
await Request.Content.ReadAsMultipartAsync(provider);
// This illustrates how to get the file names.
// 以下描述如何获取文件名
foreach (MultipartFileData file in provider.FileData)
{
Trace.WriteLine(file.Headers.ContentDisposition.FileName);
Trace.WriteLine("Server file path: " + file.LocalFileName);
}
return Request.CreateResponse(HttpStatusCode.OK);
}
catch (System.Exception e)
{
return Request.CreateErrorResponse(HttpStatusCode.InternalServerError, e);
}
}
/// <summary>
/// POST api/FileManager/PostFormFile
/// </summary>
/// <returns></returns>
[ActionName("PostFormFile")]
[HttpPost]
public IHttpActionResult PostFormFile()
{
try
{
if (!Directory.Exists(HttpContext.Current.Server.MapPath(PortraitApp)))
{
Directory.CreateDirectory(HttpContext.Current.Server.MapPath(PortraitApp));
}
HttpFileCollection files = HttpContext.Current.Request.Files;
string name = "";
foreach (string key in files.AllKeys)
{
HttpPostedFile file = files[key];
if (string.IsNullOrEmpty(file.FileName) == false)
{
int length = file.ContentLength;
if (length>2097152)
{
throw new CustomException("上传文件超过2M,请将上传文件大小控制在2M内,谢谢");
}
string extension = file.FileName.Substring(file.FileName.LastIndexOf('.')).ToLower();
if (extension!=".bmp"&& extension != ".jpg" && extension != ".jpeg" && extension != ".png")
{
throw new CustomException("上传文件扩展名不正确,请上传bmp,jpg,jpeg,png格式的图片");
}
name = DateTime.Now.ToStringByDatetime(DateTimeType.yyyyMMddHHmmss) + extension;
//LoginVerifyModels usermodel = GetVerifyModel();
string username = GetVerifyString();
if (!string.IsNullOrEmpty(username))
{
name = username + extension;
}
file.SaveAs(HttpContext.Current.Server.MapPath(PortraitApp) + name);
}
}
return Json(Success(new { ImgPath = RetureTemp + name }));
}
catch (CustomException ce)
{
return Json(getException(ce.Message));
}
catch (Exception ex)
{
return Json(getException(ex));
}
}
<%@ Page Language="C#" %>
<%@ Import Namespace="System.IO" %>
<script runat="server">
string fileHtml="";
protected void Page_Load(Object sender, EventArgs e)
{
var savePath = Server.MapPath("/upload/");//文件保存路径,网站根目录upload文件夹下
var op = Request.QueryString["op"];
if (op == "upload")
{ //上传操作
var file = Request.Files["file"];
if (file != null)
{
var ext = Path.GetExtension(file.FileName).Substring(1).ToLower();
if (new[] { "jpg", "jpeg", "gif", "png" }.Contains(ext))
{
var fn = Path.GetFileName(file.FileName);
int i = 1;
while (File.Exists(savePath + fn))
{
fn = fn.Replace((i == 1 ? "" : i.ToString()) + ".", "-" + i + ".");
i++;
}
file.SaveAs(savePath + fn);
Response.Write("文件保存成功");
}
}
}
else if (op == "download")
{//下载操作
var fn = Request.QueryString["fn"];
if (!string.IsNullOrEmpty(fn) && File.Exists(savePath + fn))
{
Response.AddHeader("content-disposition", "attachment;filename=\"" + fn + "\"");
Response.TransmitFile(savePath + fn);
Response.End();
}
}
//读取文件夹文件显示操作
fileHtml = String.Join("", Directory.GetFiles(savePath).Select(i => "<div><a href='?op=download&fn=" + Server.UrlDecode(Path.GetFileName(i)) + "'>"+Path.GetFileName(i)+"</a></div>"));
this.DataBind();
}
</script>
<script>
function check(f) {
if (!/(jpe?g|png|gif)$/.test(f.file.value)) { alert('只允许上传图片文件!'); return false;}
}
</script>
<form method="post" action="?op=upload" enctype="multipart/form-data" onsubmit="return check(this)">
选择文件:<input type="file" name="file" accept="image/*" /><input type="submit" value="上传文件" />
</form>
<div>点击下载文件
<%#fileHtml %>
</div>
一般情况,我都是使用asp.net的一般处理程序(.ashx)进行负责接收文件。发送端一般都是通过浏览器、System.Net.WebClient的UploadData方法或其他的发送文件(大同小异吧)。
下面是发送和接收简单代码。
接收图片:
<%@ WebHandler Language="C#" Class="ReceiveScreen" %>
#region 命名空间
using System;
using System.Web;
using System.IO;
#endregion
public class ReceiveScreen : IHttpHandler
{
#region 进程请求
public void ProcessRequest(HttpContext context)
{
string OperaType = context.Request.Params["opera"].ToString();
if (OperaType == "getscreen")
{
this.SaveScreenPicture(context);
}
}
#endregion
#region 保存截屏
private void SaveScreenPicture(HttpContext context)
{
try
{
Stream streamObj = context.Request.InputStream;
string floderPath = HttpContext.Current.Server.MapPath("~/");
string fileName = context.Request.Params["clientid"].ToString();
File.WriteAllBytes(floderPath + "Screen\\" + fileName + ".jpg", this.StreamToByteArray(streamObj));
context.Response.Write("上传成功");
}
catch
{
//
}
}
#endregion
#region 字节流转换
public byte[] StreamToByteArray(Stream stream)
{
byte[] bytes = new byte[stream.Length];
stream.Read(bytes, 0, bytes.Length);
stream.Seek(0, SeekOrigin.Begin);
return bytes;
}
#endregion
public bool IsReusable
{
get
{
return false;
}
}
}
发送图片:
#region 上传文件
/// <summary>
/// 上传文件
/// </summary>
/// <param name="receiveFileUrl">接收文件URL(http://....)</param>
/// <param name="uploadFile">上传文件地址(D:\....)</param>
public static bool UploadHttpFile(string receiveFileUrl, string uploadFile)
{
bool isOk = false;
try
{
System.Net.WebClient webClient = null;
webClient = new System.Net.WebClient();
byte[] resultBuffer = webClient.UploadData(receiveFileUrl, File.ReadAllBytes(uploadFile));
string result = WinBaseClass.ByteArrayToStringUTF8(resultBuffer);
isOk = result == "上传成功" ? true : false;
}
catch
{
isOk = false;
}
return isOk;
}
#endregion