Heim  >  Artikel  >  Backend-Entwicklung  >  Erklären Sie die .Net Core-Entwicklung, um das Hoch- und Herunterladen von Bilddateien von Grund auf zu implementieren

Erklären Sie die .Net Core-Entwicklung, um das Hoch- und Herunterladen von Bilddateien von Grund auf zu implementieren

巴扎黑
巴扎黑Original
2018-05-17 11:13:128300Durchsuche

Dieser Artikel stellt hauptsächlich die Bilddatei-Upload- und Download-Funktion von .Net Core im Detail vor. Er hat einen gewissen Referenzwert.

Das aktuelle .Net Core-Projekt ist wie folgt Als Mitglied der .Net-Armee habe ich .Net Core begeistert angenommen und es aktiv für die Geschäftsentwicklung genutzt. Lassen Sie uns zunächst die im Rahmen des .Net Core-Projekts implementierte Datei-Upload- und Download-Schnittstelle vorstellen.

1. Entwicklungsumgebung

Zweifellos die erste IDE im Universum VisualStudio 2017

2, Projektstruktur

FilesController Datei-Upload- und Download-Controller

PictureController Bild-Upload- und Download-Controller

Return_Helper_DG Rückgabewerthilfe Klasse

3. Schauen wir uns zunächst Startup.cs an. Hier führen wir eine Reihe von Konfigurationen durch.

Domänenübergreifende Konfiguration:

Selbstverständlich sind domänenübergreifende Verweise auf DLLs unverzichtbar. Wir verwenden Nuget um auf verwandte Referenzpakete zu verweisen.

Ersetzung des Serverressourcenpfads, wodurch verhindert werden kann, dass der Client den Serverdateipfad errät, und ein virtueller Schatten für den Zugriff erstellt wird, was die Sicherheit erhöht.

Der vollständige Code von Startup.cs lautet wie folgt:

2. Der Benutzer der Klasse Return_Helper_DG legt einen einheitlichen Rückgabewert fest und gibt ihn zurück der Client

Der Code der Return_Helper_DG-Klasse lautet wie folgt:
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.FileProviders;
using Microsoft.Extensions.Logging;
using System.IO;

namespace QX_Core.FilesCenter
{
 public class Startup
 {
 public Startup(IHostingEnvironment env)
 {
  var builder = new ConfigurationBuilder()
  .SetBasePath(env.ContentRootPath)
  .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
  .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true)
  .AddEnvironmentVariables();
  Configuration = builder.Build();
 }

 public IConfigurationRoot Configuration { get; }

 // This method gets called by the runtime. Use this method to add services to the container.
 public void ConfigureServices(IServiceCollection services)
 {
  // Add framework services.
  services.AddMvc();
  #region CORS
  services.AddCors(options =>
  {
  options.AddPolicy("AllowSpecificOrigin",
   builder => builder.WithOrigins("http://localhost:3997").AllowAnyHeader().AllowAnyOrigin().AllowAnyMethod());
  });
  #endregion
 }

 // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
 public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
 {
  //loggerFactory.AddConsole(Configuration.GetSection("Logging"));
  //loggerFactory.AddDebug();

  app.UseMvc();
  // Shows UseCors with named policy.
  app.UseCors("AllowSpecificOrigin");

  app.UseStaticFiles(new StaticFileOptions()
  {
  FileProvider = new PhysicalFileProvider(Path.Combine(Directory.GetCurrentDirectory(), @"wwwroot/Files")),
  RequestPath = new PathString("/src")
  });
 }
 }
}


3. FilesController ist unsere Datei-Upload-Controller-Schnittstelle, die den Empfangsvorgang hochgeladener Dateien definiert und eine domänenübergreifende Konfiguration ermöglicht Controller

using System.Net;
/**
* author:qixiao
* create:2017-5-19 15:15:05
* */
namespace QX_Core.FilesCenter.QX_Core.Helper
{
 public abstract class Return_Helper_DG
 {
 public static object IsSuccess_Msg_Data_HttpCode(bool isSuccess, string msg, dynamic data, HttpStatusCode httpCode = HttpStatusCode.OK)
 {
  return new { isSuccess = isSuccess, msg = msg, httpCode = httpCode, data = data };
 }
 public static object Success_Msg_Data_DCount_HttpCode(string msg, dynamic data = null, int dataCount = 0, HttpStatusCode httpCode = HttpStatusCode.OK)
 {
  return new { isSuccess = true, msg = msg, httpCode = httpCode, data = data, dataCount = dataCount };
 }
 public static object Error_Msg_Ecode_Elevel_HttpCode(string msg, int errorCode = 0, int errorLevel = 0, HttpStatusCode httpCode = HttpStatusCode.InternalServerError)
 {
  return new { isSuccess = false, msg = msg, httpCode = httpCode, errorCode = errorCode, errorLevel = errorLevel };
 }
 }
}

Im obigen Code begrenzen wir die Größe der hochgeladenen Datei und geben Feedback zur Dateigröße.

using Microsoft.AspNetCore.Cors;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Net.Http.Headers;
using QX_Core.FilesCenter.QX_Core.Helper;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;

namespace QX_Core.FilesCenter.Controllers
{
 //[Produces("application/json")]
 [Route("api/[controller]")]
 [EnableCors("AllowSpecificOrigin")]
 public class FilesController : Controller
 {
 private IHostingEnvironment hostingEnv;

 public FilesController(IHostingEnvironment env)
 {
  this.hostingEnv = env;
 }

 [HttpPost]
 public IActionResult Post()
 {
  var files = Request.Form.Files;
  long size = files.Sum(f => f.Length);

  //size > 100MB refuse upload !
  if (size > 104857600)
  {
  return Json(Return_Helper_DG.Error_Msg_Ecode_Elevel_HttpCode("files total size > 100MB , server refused !"));
  }

  List<string> filePathResultList = new List<string>();

  foreach (var file in files)
  {
  var fileName = ContentDispositionHeaderValue.Parse(file.ContentDisposition).FileName.Trim(&#39;"&#39;);

  string filePath = hostingEnv.WebRootPath + $@"\Files\Files\";

  if (!Directory.Exists(filePath))
  {
   Directory.CreateDirectory(filePath);
  }

  fileName = Guid.NewGuid() + "." + fileName.Split(&#39;.&#39;)[1];

  string fileFullName = filePath + fileName;

  using (FileStream fs = System.IO.File.Create(fileFullName))
  {
   file.CopyTo(fs);
   fs.Flush();
  }
  filePathResultList.Add($"/src/Files/{fileName}");
  }

  string message = $"{files.Count} file(s) /{size} bytes uploaded successfully!";

  return Json(Return_Helper_DG.Success_Msg_Data_DCount_HttpCode(message, filePathResultList, filePathResultList.Count));
 }

 }
}
4. PictureController-Schnittstelle zum Hochladen von Bildern, ähnlich wie bei Dateien, jedoch mit Prüfsummenbeschränkungen für hochgeladene Bildtypen

Zu diesem Zeitpunkt ist unser Datei- und Bild-Upload-Code vollständig. Lassen Sie uns die Client-Seite für den Datei-Upload implementieren

using Microsoft.AspNetCore.Cors;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Net.Http.Headers;
using QX_Core.FilesCenter.QX_Core.Helper;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;

namespace QX_Core.FilesCenter.Controllers
{
 //[Produces("application/json")]
 [Route("api/[controller]")]
 [EnableCors("AllowSpecificOrigin")]
 public class PicturesController : Controller
 {
 private IHostingEnvironment hostingEnv;

 string[] pictureFormatArray = { "png", "jpg", "jpeg", "bmp", "gif","ico", "PNG", "JPG", "JPEG", "BMP", "GIF","ICO" };

 public PicturesController(IHostingEnvironment env)
 {
  this.hostingEnv = env;
 }

 [HttpPost]
 public IActionResult Post()
 {
  var files = Request.Form.Files;
  long size = files.Sum(f => f.Length);

  //size > 100MB refuse upload !
  if (size > 104857600)
  {
  return Json(Return_Helper_DG.Error_Msg_Ecode_Elevel_HttpCode("pictures total size > 100MB , server refused !"));
  }

  List<string> filePathResultList = new List<string>();

  foreach (var file in files)
  {
  var fileName = ContentDispositionHeaderValue.Parse(file.ContentDisposition).FileName.Trim(&#39;"&#39;);

  string filePath = hostingEnv.WebRootPath + $@"\Files\Pictures\";

  if (!Directory.Exists(filePath))
  {
   Directory.CreateDirectory(filePath);
  }

  string suffix = fileName.Split(&#39;.&#39;)[1];

  if (!pictureFormatArray.Contains(suffix))
  {
   return Json(Return_Helper_DG.Error_Msg_Ecode_Elevel_HttpCode("the picture format not support ! you must upload files that suffix like &#39;png&#39;,&#39;jpg&#39;,&#39;jpeg&#39;,&#39;bmp&#39;,&#39;gif&#39;,&#39;ico&#39;."));
  }

  fileName = Guid.NewGuid() + "." + suffix;

  string fileFullName = filePath + fileName;

  using (FileStream fs = System.IO.File.Create(fileFullName))
  {
   file.CopyTo(fs);
   fs.Flush();
  }
  filePathResultList.Add($"/src/Pictures/{fileName}");
  }

  string message = $"{files.Count} file(s) /{size} bytes uploaded successfully!";

  return Json(Return_Helper_DG.Success_Msg_Data_DCount_HttpCode(message, filePathResultList, filePathResultList.Count));
 }

 }
}

4. Client-Implementierung

Auf der Client-Seite verwenden wir einfach jQuery Ajax, um Bilddateien hochzuladen. Übermittlung und Implementierung des Client-Codes :

5. Codetest
<!doctype>

<head>
 <script src="jquery-3.2.0.min.js"></script>
 <script>
 $(document).ready(function () {
  var appDomain = "http://localhost:53972/";
  $("#btn_fileUpload").click(function () {
    var fileUpload = $("#files").get(0);
  var files = fileUpload.files;
  var data = new FormData();
  for (var i = 0; i < files.length; i++) {
   data.append(files[i].name, files[i]);
  }
  $.ajax({
   type: "POST",
   url: appDomain+&#39;api/Pictures&#39;,
   contentType: false,
   processData: false,
   data: data,
   success: function (data) {
   console.log(JSON.stringify(data));
   },
   error: function () {
   console.log(JSON.stringify(data));
   }
  });
  });
  //end click


 })
 </script>
</head>
<title></title>

<body>
 <article>
 <header>
  <h2>article-form</h2>
 </header>
 <p>
  <form id="uploadForm" enctype="multipart/form-data">
  <input type="file" id="files" name="files" placeholder="file" multiple>file-multiple属性可以选择多项<br><br>
  <input type="button" id="btn_fileUpload" value="fileUpload">
  </form>
 </p>
 </article>
</body>

1 Starten Sie den Server

Wir können a sehen Konsole und ein Web werden automatisch gestartet, und das Web zeigt den Anforderungsrückgabewert des Standardwerte-Controllers an.

2. Bild-Upload

Wir verwenden Ajax, um Bilder hochzuladen, öffnen die Testwebseite, wählen das Bild aus, klicken auf Hochladen und sehen die von der Konsole zurückgegebenen Ergebnisse:

Sie können sehen, dass ein Bild erfolgreich hochgeladen wurde!

Geben Sie die Absenderadresse ein. Hier können Sie sehen, dass der Zugriff auf das Bild erfolgreich war:

Hochladen mehrere Bilder:

Es ist ersichtlich, dass das Hochladen mehrerer Bilder kein Problem darstellt!

Führen Sie auf ähnliche Weise den Datei-Upload-Test durch:

Ebenso gibt es keine Probleme beim Datei-Upload!

6. Zusammenfassung

Bisher haben wir alle erwarteten Funktionen zum Hochladen von .Net Core-Bilddateien erreicht!

Das obige ist der detaillierte Inhalt vonErklären Sie die .Net Core-Entwicklung, um das Hoch- und Herunterladen von Bilddateien von Grund auf zu implementieren. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn