实现MultipartStreamProvider经Web API上传文档或图片
周末,有些时间,想起博客园,为自己博客创建一些随笔。
前些时间,有分享过一篇《文件上传和表单字段混合提交》https://www.cnblogs.com/insus/p/22898945
从这里,我们慢慢跟着它一步一步实现自己的上传功能,先从简单入手。
<div> <input id="FileImage" type="file" /> <input id="BtnUpload" type="button" value="上传" /> </div>
重点部分,即是创建Web API,把用户上传的文档图片存储起来,数据库,文件夹等。
下面可以复制代码:
namespace Insus.NET.Models { public class Response { public bool Status { get; set; } public string Message { get; set; } public object Data { get; set; } public Response() { } public Response(bool status, string message, object data) { Status = status; Message = message; Data = data; } } }
public async Task<IHttpActionResult> UploadImage() { Response _Data; //Model try { await ProcessPostImageFile(); _Data = new Response() { Status = true, Message = "File uploaded successfully.", Data = null }; } catch (Exception ex) { _Data = new Response() { Status = false, Message = ex.Message, Data = null }; } return Ok(_Data); }
private async Task ProcessPostImageFile() { if (!Request.Content.IsMimeMultipartContent()) { throw new HttpResponseException(HttpStatusCode.UnsupportedMediaType); } var provider = await Request.Content.ReadAsMultipartAsync<InsusNetMultipartFormDataStreamProvider>( new InsusNetMultipartFormDataStreamProvider() ); NameValueCollection formData = provider.FormData; IList<HttpContent> files = provider.Files; foreach (var file in files) { var _ocr = new OcrFile(); string ofn = file.Headers.ContentDisposition.FileName.Trim('"'); //去掉前后的引号 _ocr.OriginalFileName = ofn; //上传的文件名 _ocr.Extension = Path.GetExtension(ofn); //扩展名 _ocr.MimeType = file.Headers.ContentType.MediaType; //图片文档的Media type。 using (var ms = new MemoryStream()) //不管你是上传单文件,还是上传多文件,均需从内存流去读取数据。 { var stream = await file.ReadAsStreamAsync(); await stream.CopyToAsync(ms); _ocr.Size = ms.Length; ms.Position = 0; // 重置位置供后续使用 using (var image = Image.FromStream(ms)) { System.Drawing.Imaging.ImageFormat format = ImageUtil.GetImageFormat(image); //这里自定义方法,从图片获取其格式。 string extension = ImageUtil.GetExtensionByImageFormat(format); //这里也是自定义方法,从图片格式获取其扩展名 string newFileName = $"{Guid.NewGuid()}{extension}"; //用GUID生成唯一文件名 _ocr.NewFileName = newFileName; string newFileFullPath = Path.Combine(InsusIO.TempDirectory, newFileName); image.Save(newFileFullPath, format); //存储入文件夹中。 } } await Task.Run(() => xxx.Save2Db(_ocr)); //相关数据存入数据库中 } }
namespace Insus.NET { public static class ImageUtil { public static ImageFormat GetImageFormat(Image image) { if (image.RawFormat.Equals(ImageFormat.Jpeg)) return ImageFormat.Jpeg; else if (image.RawFormat.Equals(ImageFormat.Png)) return ImageFormat.Png; else if (image.RawFormat.Equals(ImageFormat.Tiff)) return ImageFormat.Tiff; else if (image.RawFormat.Equals(ImageFormat.Gif)) return ImageFormat.Gif; else if (image.RawFormat.Equals(ImageFormat.Bmp)) return ImageFormat.Bmp; else if (image.RawFormat.Equals(ImageFormat.Emf)) return ImageFormat.Emf; else if (image.RawFormat.Equals(ImageFormat.Exif)) return ImageFormat.Exif; else if (image.RawFormat.Equals(ImageFormat.Icon)) return ImageFormat.Icon; else if (image.RawFormat.Equals(ImageFormat.Wmf)) return ImageFormat.Wmf; else return ImageFormat.Jpeg; // 默认使用JPEG } public static string GetExtensionByImageFormat(ImageFormat format) { if (format.Equals(ImageFormat.Jpeg)) return ".jpg"; if (format.Equals(ImageFormat.Png)) return ".png"; if (format.Equals(ImageFormat.Tiff)) return ".tiff"; if (format.Equals(ImageFormat.Gif)) return ".gif"; if (format.Equals(ImageFormat.Bmp)) return ".bmp"; if (format.Equals(ImageFormat.Icon)) return ".ico"; // 其他格式... return ".jpg"; // 默认 } } }
上面代码中,还是一行#59,
var _ocr = new OcrFile();
即是图片相关属性model。
本篇简单的图片上传。细看代码,没有什么困难之处。初学者入门篇。





浙公网安备 33010602011771号