ã¬ãã¹ã³ã®ç®çã Web.configæ§æãã¡ã€ã«ã®äœ¿ç𿹿³ãåŠç¿ããŸãã ç¬èªã®ConfigSectionããã³IConfigãäœæããã¢ããªã±ãŒã·ã§ã³ã»ã¯ã·ã§ã³ã ãã¡ã€ã«ã®ã¢ããããŒãããã¡ã€ã«ã¢ããããŒããŒã䜿çšãããã¡ã€ã«ã®ããŠã³ããŒããããã³ãã¡ã€ã«ã®åŠçãåŠã³ãŸãã
ãã®ãã¥ãŒããªã¢ã«ã§ã¯ãWeb.configæ§æãã¡ã€ã«ã§ã®äœæ¥ãèŠãŠãããŸãã ããã¯xmlãã¡ã€ã«ã§ãããããã°ã©ã èšå®ãä¿åããŸãã
ãã®ãã¡ã€ã«ãäœã§æ§æãããŠããããããã«è©³ããèããŠã¿ãŸãããã
- configSection ã ãã®ã»ã¯ã·ã§ã³ã¯ãã©ã®ã¯ã©ã¹ãããã«å®£èšãããã»ã¯ã·ã§ã³ãåŠçããããæ
åœããŸãã 屿§åã§æ§æãããŸã-ããã¯ã¿ã°ã次ã«å®£èšãããã»ã¯ã·ã§ã³ãããã³ã¿ã€ã-ãããå±ããã¯ã©ã¹ã§ãã
- connectionStrings ã ãã®ã»ã¯ã·ã§ã³ã§ã¯ãããŒã¿ããŒã¹æ¥ç¶ãåæåããããã«æååãæäœããŸãã
- appSettings ã ã¿ã€ãããŒ/å€ã®ãã©ã¡ãŒã¿ãŒã®ã»ã¯ã·ã§ã³ã
- system.webãsystem.webServer ã Webã¢ããªã±ãŒã·ã§ã³ã®ãã©ã¡ãŒã¿ãŒã»ã¯ã·ã§ã³ã
- ã©ã³ã¿ã€ã ã ã©ã³ã¿ã€ã 調æŽã»ã¯ã·ã§ã³ã DLLéã®äŸåé¢ä¿ãå®çŸ©ããŸãã
- æ®ãã®ã»ã¯ã·ã§ã³ã configSectionã§å®£èšããããã©ã¡ãŒã¿ãŒãæã€ä»ã®ã»ã¯ã·ã§ã³ã
IConfigïŒããã³å®è£
ïŒã
ãªããžããªã®ããã«ãã³ã³ãã£ã®ã¥ã¬ãŒã¿ãŒããµãŒãã¹ãšããŠäœæããŸãã ã°ããŒãã«ãã©ã«ããŒïŒ/Global/Config/IConfig.csïŒã«IConfigããã³Configå®è£
ãäœæããŸãã
public interface IConfig { string Lang { get; } }
ãš
public class Config : IConfig { public string Lang { get { return "ru"; } } }
RegisterServicesïŒ/App_Start/NinjectWebCommon.csïŒã«è¡ã远å ããŸãã
kernel.Bind<IConfig>().To<Config>().InSingletonScope();
BaseControllerãžã®åºåïŒ
[Inject] public IConfig Config { get; set; }
ããã§ãã³ã³ãããŒã©ãŒã®åæåã§ãã¹ããªãŒã ã®CultureInfoãåå²ãåœãŠããŸãïŒ/Controllers/BaseController.csïŒïŒ
protected override void Initialize(System.Web.Routing.RequestContext requestContext) { try { var cultureInfo = new CultureInfo(Config.Lang); Thread.CurrentThread.CurrentCulture = cultureInfo; Thread.CurrentThread.CurrentUICulture = cultureInfo; } catch (Exception ex) { logger.Error("Culture not found", ex); } base.Initialize(requestContext); }
ãããŠãIndex.cshtmlïŒ/Areas/Default/Views/Home/Index.cshtmlïŒã«æ¥ä»åºåã远å ããŸãã
@DateTime.Now.ToString("D")
çµè«ãåŸãããŸãã

ãããŠããããWeb.Configãšæ¬åœã«é¢é£ä»ããŸãã appSettingsã®Web.configã«æ¬¡ã®è¡ã远å ããŸãã
<add key="Culture" value="ru" />
Config.csïŒ/Global/Config/Config.csïŒïŒ
public string Lang { get { return ConfigurationManager.AppSettings["Culture"] as string; } }
éå§-çµæã¯åãã§ãããä»åºŠã¯Web.configã®å€ãfrã«å€æŽããŸãã
<add key="Culture" value="fr" />
æ¥ä»ãååŸããŸãã
mardi 5 mars 2013
ãããïŒ ããã«ããã€ãã®èšèªã§è©Šãããšãã§ããŸãã ç¥èªã®ãªã¹ãã¯ãã¡ã
http://msdn.microsoft.com/en-us/goglobal/bb896001.aspxç¬èªã®ConfigSectionã¿ã€ããäœæãã
ãã®ããŒãã§ã¯ãç¬èªã®ConfigSectionã®äœæã«ã€ããŠèª¬æããŸãã ãã®ç« ã§ã¯ããã¡ã€ã«ã®ã¢ããããŒããšãã¬ãã¥ãŒã®äœæãå®è£
ããŸãã æ¬¡ã®ããŒã¿ãå¿
èŠã§ãããŸããæ¡åŒµåã«å¯ŸããMIMEã¿ã€ãã®äŸåé¢ä¿ãããã³ãã¡ã€ã«ã¢ã€ã³ã³ïŒããŠã³ããŒããªã©ïŒïŒ
- æ¡å€§
- MIMEã¿ã€ã
- 倧ããªã¢ã€ã³ã³
- å°ããªã¢ã€ã³ã³
次ã«ããã¬ãã¥ãŒãäœæããããã®ããŒã¿ïŒ
- ãã¬ãã¥ãŒã¿ã€ãã«ïŒäŸïŒUserAvatarSizeïŒ
- å¹
- 身é·
ã©ã¡ãã®ã¿ã€ããåãæ¹æ³ã§å®è¡ããããããã©ã¡ããäžæ¹ã®äœæã®ã¿ãèšè¿°ããŸãã ãã¬ãã¥ãŒãäœæããã«ã¯ãIconSizeã«ããŸãã æåã«è¡ãããšã¯ãConfigurationElementïŒ/Global/Config/IconSize.csïŒã«ãã£ãŠç¶æ¿ãããã¯ã©ã¹ãäœæããããšã§ãã
public class IconSize : ConfigurationElement { [ConfigurationProperty("name", IsRequired = true, IsKey = true)] public string Name { get { return this["name"] as string; } } [ConfigurationProperty("width", IsRequired = false, DefaultValue = "48")] public int Width { get { return (int)this["width"]; } } [ConfigurationProperty("height", IsRequired = false, DefaultValue = "48")] public int Height { get { return (int)this["height"]; } } }
ããã«è©³ããèããŠã¿ãŸãããã
- ConfigurationPropertyã¯ååã§æ§æãããããã¯æååã®å±æ§åã§ã
- IsRequired-å¿
é ãã©ãã
- IsKey-ããŒã§ãïŒããŒã¿ããŒã¹ã®äž»ããŒãšããŠïŒ
- DefaultValue-ããã©ã«ãå€
次ã®ã¹ãããã§ã¯ãã³ã¬ã¯ã·ã§ã³ã¯ã©ã¹ïŒå€ãã®èŠçŽ ãããããïŒãšã»ã¯ã·ã§ã³ïŒ/Global/Config/IconSize.csïŒãäœæããŸãã
public class IconSizesConfigSection : ConfigurationSection { [ConfigurationProperty("iconSizes")] public IconSizesCollection IconSizes { get { return this["iconSizes"] as IconSizesCollection; } } } public class IconSizesCollection : ConfigurationElementCollection { protected override ConfigurationElement CreateNewElement() { return new IconSize(); } protected override object GetElementKey(ConfigurationElement element) { return ((IconSize)element).Name; } }
Web.configã§ã次ã远å ããŸãã
<iconConfig> <iconSizes> <add name="Avatar173Size" width="173" height="176" /> ⊠</iconSizes> </iconConfig>
次ã«ãconfigSectionã®ãã®ã»ã¯ã·ã§ã³ã®è§£æã¯ã©ã¹ã宣èšããå¿
èŠããããŸãã
<section name="iconConfig" type="LessonProject.Global.Config.IconSizesConfigSection, LessonProject" />
ã¿ã€ãã®èª¬æã§ã¯ããããå«ãŸããŠããdllïŒ
LessonProject
ïŒã®ååãæå®ããå¿
èŠãããããšã«æ³šæããŠãã ããã ããã¯éèŠã§ãããåäœãã¹ãã§ã«ããŒãããŸãã
ã¡ãŒã«èšå®
smtp-mailãæäœããããã®èšå®çšã®åäžã®æ§æãäœæããŸãããã å¿
èŠãªãã®ïŒ
- SmtpServerã ãµãŒããŒå
- SmtpPort ããŒããéåžž25çªç®ã
- SmtpUserNameã ãã°ã€ã³
- SmtpPasswordã ãã¹ã¯ãŒã
- SmtpReplyã Reply-toè¡ã®è¿ä¿¡å
ã¢ãã¬ã¹ã
- SmtpUserã Fromè¡ã®ãŠãŒã¶ãŒåã
- EnableSslã ã¯ã/ããããSslã§äœæ¥ã䜿çšãããã©ããã
ãã¡ã€ã«ïŒ/Global/Config/MailSetting.csïŒïŒ
public class MailSetting : ConfigurationSection { [ConfigurationProperty("SmtpServer", IsRequired = true)] public string SmtpServer { get { return this["SmtpServer"] as string; } set { this["SmtpServer"] = value; } } [ConfigurationProperty("SmtpPort", IsRequired = false, DefaultValue="25")] public int SmtpPort { get { return (int)this["SmtpPort"]; } set { this["SmtpPort"] = value; } } [ConfigurationProperty("SmtpUserName", IsRequired = true)] public string SmtpUserName { get { return this["SmtpUserName"] as string; } set { this["SmtpUserName"] = value; } } [ConfigurationProperty("SmtpPassword", IsRequired = true)] public string SmtpPassword { get { return this["SmtpPassword"] as string; } set { this["SmtpPassword"] = value; } } [ConfigurationProperty("SmtpReply", IsRequired = true)] public string SmtpReply { get { return this["SmtpReply"] as string; } set { this["SmtpReply"] = value; } } [ConfigurationProperty("SmtpUser", IsRequired = true)] public string SmtpUser { get { return this["SmtpUser"] as string; } set { this["SmtpUser"] = value; } } [ConfigurationProperty("EnableSsl", IsRequired = false, DefaultValue="false")] public bool EnableSsl { get { return (bool)this["EnableSsl"]; } set { this["EnableSsl"] = value; } } }
Web.configã«è¿œå ããŸãã
<section name="mailConfig" type="LessonProject.Global.Config.MailSetting, LessonProject" />
ãš
<mailConfig SmtpServer="smtp.gmail.com" SmtpPort="587" SmtpUserName="lxndrpetrov" SmtpPassword="**********" SmtpReply="lxndrpetrov@gmail.com" SmtpUser="test" EnableSsl="true" />
ããããã¹ãŠIConfig.csããã³Config.csïŒ/Global/Config/IConfig.csïŒã«è¿œå ããŸãã
public interface IConfig { string Lang { get; } IQueryable<IconSize> IconSizes { get; } IQueryable<MimeType> MimeTypes { get; } MailSetting MailSetting { get; } }
ãš
public IQueryable<IconSize> IconSizes { get { IconSizesConfigSection configInfo = (IconSizesConfigSection)ConfigurationManager.GetSection("iconConfig"); return configInfo.IconSizes.OfType<IconSize>().AsQueryable<IconSize>(); } } public IQueryable<MimeType> MimeTypes { get { MimeTypesConfigSection configInfo = (MimeTypesConfigSection)ConfigurationManager.GetSection("mimeConfig"); return configInfo.MimeTypes.OfType<MimeType>().AsQueryable<MimeType>(); } } public MailSetting MailSetting { get { return (MailSetting)ConfigurationManager.GetSection("mailConfig"); } }
ãŸããç»é²æã«ããŸãã¯ãã¹ã¯ãŒããæãåºããããšãã«ã¡ãŒã«ãéä¿¡ããå¿
èŠããããã³ãã¬ãŒãã§ããMailTemplatesã远å ããŸãã
ç°¡åãªãã¡ã€ã«ã¢ããããŒã
次ã«ããã¡ã€ã«ããµãŒããŒã«ã¢ããããŒãããæšæºçãªäŸãèŠãŠã¿ãŸãããããã®ã¡ãœããã¯äºåºŠãšäœ¿çšããŸããã 察話çšã®SimpleFileViewã¯ã©ã¹ïŒ/Models/Info/SimpleFileView.csïŒïŒ
public class SimpleFileView { public HttpPostedFileBase UploadedFile { get; set; } }
ãã¡ã€ã«ãåä¿¡ããããã®ã¯ã©ã¹åã«æ³šæããŠãã ããã ãã®ãããSimpleFileControllerã³ã³ãããŒã©ãŒïŒ/Areas/Default/Controllers/SimpleFileController.csïŒãäœæããŸãã
public class SimpleFileController : DefaultController { [HttpGet] public ActionResult Index() { return View(new SimpleFileView()); } [HttpPost] public ActionResult Index(SimpleFileView simpleFileView) { return View(simpleFileView); } }
ãã¥ãŒã远å ããŸãã
@model LessonProject.Models.Info.SimpleFileView @{ ViewBag.Title = "Index"; Layout = "~/Areas/Default/Views/Shared/_Layout.cshtml"; } <h2>Index</h2> @using (Html.BeginForm("Index", "SimpleFile", FormMethod.Post, new {enctype = "multipart/form-data", @class = "form-horizontal" })) { <fieldset> <div class="control-group"> <label class="control-label" for="Email"> :</label> <div class="controls"> @Html.TextBox("UploadedFile", Model.UploadedFile, new { type = "file", @class = "input-xlarge" }) @Html.ValidationMessage("UploadedFile") </div> </div> <div class="form-actions"> <button type="submit" class="btn btn-primary"> Upload</button> </div> </fieldset> }
ãã©ãŒã 屿§ã®enctypeãšTextBox屿§ã®åã«æ³šæããŠãã ããïŒå®éãåã¯ãŸã ãã¹ã¯ãŒãããã§ãã¯ããã¯ã¹ãã©ãžãªã§ããã@ Htmlã¯ã©ã¹ã«ã¯å¯Ÿå¿ããã¡ãœããããããŸãïŒã 倧éã®æ
å ±ãããŒãããã«ã¯ãEnctypeããmultipart / form-dataãã«èšå®ããå¿
èŠããããŸãã
ããŠã³ããŒãããŠç¢ºèªããŠãã ããã ãã¡ã€ã«ã¯å®å
šã«ã¢ããããŒããããŸããInputStreamãç¹å®ã®ãã¡ã€ã«ã«ä¿åããã ãã§ãã ããããä»ã®ãšããã¯æ®ããŠãæ¬ ç¹ãèæ
®ããŸãããã
æåã®æ¬ ç¹ã¯ããã¹ãŠã®ãã©ãŠã¶ã§ãã¡ã€ã«éžæãã©ãŒã ãç°ãªã£ãŠèŠããããšã§ãïŒ

ãã¡ããããã¶ã€ããŒã¯ãã¡ã€ã«ãSafariã§ããŠã³ããŒãããã顧客ãChromeãšIEã§ç¢ºèªããéçºè
ã«ãã©ã®ãããªã€ãã·ã¢ãããããšå°ãå§ããŸãã
2çªç®ã®æ¬ ç¹ã¯ããã©ãŒã ãæ€èšŒã«åæ Œããªãã£ãå Žåããããã®ãã£ãŒã«ããååºŠéžæããå¿
èŠãããããšã§ãã ã€ãŸã ãã®ãããªåœ¢åŒããããŸãïŒ
- å
- å§
- ã¡ãŒã«
- çå¹Žææ¥
- åçæ®åœ±
- ãã¹ããŒãã®æåã®ã¹ãã¬ããã®åç
- ãã¹ããŒãã®ç¬¬2ã¹ãã¬ããã®åç
- ç»é²æžã¿ã®ãã¹ããŒãåç
- ãã¹ã¯ãŒã
- ããäžåºŠãã¹ã¯ãŒã
- ãã£ããã£
ãããŠãçªç¶ãã¹ã¯ãŒããééã£ãŠå
¥åãããããã£ããã£ãééã£ãŠå
¥åãããããã¹ããŒãã®2çªç®ã®ã¿ãŒã³ã®åçã倧ããããããrawãã©ãŒãããããjpegã«è¿œãè¶ãã®ãå¿ããŸããã
ãã®ãããåçãç»é²ããã£ããã£ãåå
¥åããå¿
èŠããããŸãã åœç¶ãããã¯ãŠãŒã¶ãŒãã¬ã³ããªãŒã§ã¯ãªãã顧客ãå°ãããŸãïŒããã«ããã¶ã€ããŒã¯çŸããå¡è£
ãããŠããŸãããæšãã«èŠããŸãïŒã
Ajaxã䜿çšããŠãã¡ã€ã«ãã¢ããããŒããã
ãã¡ã€ã«ã®ã¢ããããŒãã®åäœã決å®ããŸãã
- ãŠãŒã¶ãŒã¯ãããŠã³ããŒãããã¯ãªãã¯ããŸãã
- ãã¡ã€ã«éžæãã©ãŒã ãéããŸã
- ãŠãŒã¶ãŒããã¡ã€ã«ãéžæ
- ãã¡ã€ã«ãããŒããããŠããããäœããééã£ãŠããããšã瀺ããšã©ãŒãçºè¡ãããŸã
- ãã©ãŒã ãæ€èšŒã«åæ ŒããªããŠãããã¡ã€ã«ã¯ããŒãããããŸãŸã§ãããå床ããŠã³ããŒãããå¿
èŠã¯ãããŸããã
ããã¯ajaxããŒããšåŒã°ããfineuploaderã䜿çšããŸãïŒ
http://fineuploader.com/ ïŒã ã©ã€ãã©ãªã¯ææã§ããããœãŒã¹ãããŠã³ããŒãããŠåéããŸãïŒãã³ãã«ããããŸãïŒïŒã ãªã³ã¯ïŒ
https://github.com/valums/file-uploaderïŒã§ãœãŒã¹ãããŠã³ããŒãã
ãŸã ã jsãã¡ã€ã«ã/ Scripts / fine-uploaderãã©ã«ããŒã«ç§»åããŸãã cssãã¡ã€ã«ã/ Contentã«ãç»åã/ Content / imagesã«ç§»åããŸãã ç»åã®fineuploader.cssã§URLãæ£ããæžãæããŸãã
.qq-upload-spinner { display: inline-block; background: url("images/loading.gif"); width: 15px; height: 15px; vertical-align: text-bottom; } .qq-drop-processing { display: none; } .qq-drop-processing-spinner { display: inline-block; background: url("images/processing.gif"); width: 24px; height: 24px; vertical-align: text-bottom; }
BundleConfig.csïŒ/App_Start/BundleConfig.csïŒã®ãã¡ã€ã«ãåæåããŸãã
bundles.Add(new ScriptBundle("~/bundles/fineuploader") .Include("~/Scripts/fine-uploader/header.js") .Include("~/Scripts/fine-uploader/util.js") .Include("~/Scripts/fine-uploader/button.js") .Include("~/Scripts/fine-uploader/ajax.requester.js") .Include("~/Scripts/fine-uploader/deletefile.ajax.requester.js") .Include("~/Scripts/fine-uploader/handler.base.js") .Include("~/Scripts/fine-uploader/window.receive.message.js") .Include("~/Scripts/fine-uploader/handler.form.js") .Include("~/Scripts/fine-uploader/handler.xhr.js") .Include("~/Scripts/fine-uploader/uploader.basic.js") .Include("~/Scripts/fine-uploader/dnd.js") .Include("~/Scripts/fine-uploader/uploader.js") .Include("~/Scripts/fine-uploader/jquery-plugin.js") ); bundles.Add(new StyleBundle("~/Content/css/fineuploader") .Include("~/Content/fineuploader.css"));
ã³ã³ãããŒã©ãŒFileController.csïŒ/Areas/Default/Controllers/FileController.csïŒãäœæããŸãã
public class FileController : DefaultController { [HttpGet] public ActionResult Index() { return View(); } public ActionResult Upload(HttpPostedFileWrapper qqfile) { return Json(new { result = "ok", success = true}); } }
action-uploadã¡ãœããã¯qqfileæååå€ãåãå
¥ããŸãããã®çç±ã以äžã§èª¬æããŸãã æ¬¡ã«ãã€ã³ããã¯ã¹ã®ãã¥ãŒãäœæããŸãã ãããè¡ãã«ã¯ïŒ
- ãã¿ã³ãäœæããã¯ãªãã¯ãããšãã¡ã€ã«ãããŠã³ããŒãããŸãã
- ãã¡ã€ã«ãã¢ããããŒãããããã¬ãã¥ãŒãäœæãããŸãã
- ãã¡ã€ã«ã·ã¹ãã ã«ä¿åããããã¡ã€ã«ãšãã¬ãã¥ãŒ
- ã¡ãœããã¯ãJsonå¿çãä»ããŠãã¡ã€ã«ãšãã¬ãã¥ãŒãã¢ããããŒãããããªã³ã¯ãè¿ããŸã
- ãã¡ã€ã«ãããŠã³ããŒãã§ããªãã£ãå Žåãé©åãªãšã©ãŒãçºè¡ãããŸã
- JSONçµæãåŠçãããã¡ã€ã«ãšãã¬ãã¥ãŒãèªã¿èŸŒãŸããããšãéç¥ããŸã
- ãã©ãŒã ã®æ€èšŒãšããŒã¿ããŒã¹ãžã®æžã蟌ã¿ã¯äžèŠã§ãã
ã€ã³ããã¯ã¹ã®è¡šç€ºïŒ
@{ ViewBag.Title = "Index"; Layout = "~/Areas/Default/Views/Shared/_Layout.cshtml"; } @section styles { @Styles.Render("~/Content/css/fineuploader") } @section scripts { @Scripts.Render("~/bundles/fineuploader") @Scripts.Render("~/Scripts/default/file-index.js") } <h2>Index</h2> <fieldset> <div class="control-group"> <label class="control-label" for="Text"> Image </label> <div class="controls"> <div id="UploadImage"> Upload </div> </div> </div> <div> <img src="" alt="" id="ImagePreview" /> </div> </fieldset>
id = UploadImageã®ãã¿ã³ã åŠçããfile-index.jsãã¡ã€ã«ã远å ããŸãïŒ/Scripts/default/file-index.jsïŒïŒ
function FileIndex() { _this = this; this.ajaxFileUpload = "/File/Upload"; this.init = function () { $('#UploadImage').fineUploader({ request: { endpoint: _this.ajaxFileUpload }, }).on('error', function (event, id, name, reason) {
ããŠã³ããŒããåŠçããŸãã
public ActionResult Upload(HttpPostedFileWrapper qqfile) { var extension = Path.GetExtension(qqfile.FileName); if (!string.IsNullOrWhiteSpace(extension)) { var mimeType = Config.MimeTypes.FirstOrDefault(p => string.Compare(p.Extension, extension, 0) == 0);
ãã¡ã€ã«ãã©ã«ããŒãã³ã³ãã³ãã«è¿œå ããŸã-ããããŠãŒã¶ãŒããŒã¿ãã©ã«ããŒã«ãªããŸãã ã³ãŒããåæããŸãããïŒ
- qqfileãååŸããŸãïŒããã§ã¯äœã倿Žããªãã§ãã ããããã®ãã©ã¡ãŒã¿ãŒã¯fineuploaderã«ãããã®ã§ãïŒã
- ããããæ¡åŒµæ©èœãååŸããŸãã
- æ¡åŒµã«ãããmimeTypeãèŠã€ããŸãã .jpgã.gifã.pngã®å Žåããimage / ...ãã¿ã€ãã®MIMEã¿ã€ããååŸããŸãã ãããã£ãŠããã®ãã¡ã€ã«ãããŠã³ããŒãã§ããããšã確èªããŸãã
- 次ã«ããã¡ã€ã«åã䜿çšããŠãServer.MapPathã䜿çšããŠ/ Content / filesãã©ã«ããŒïŒäºåã«äœæããïŒãžã®çµ¶å¯Ÿãã¹ãäœæããŸãã
- 次ã«ãSaveAsã䜿çšããŠãã¡ã€ã«ãä¿åããŸãã
- json data.filePathã§ãã¡ã€ã«åãè¿ããŸãã
ãã¹ãŠãããŒããããŠãããã©ããã確èªãããã¬ãã¥ãŒã®äœæã«é²ã¿ãŸãã
ãã¬ãã¥ãŒäœæ
ãŸããmime-type = "image \ ..."ãå°ãããŸãããŸããããããã«ã¯ããã©ãŠã¶ã§ãµããŒããããŠããªãbmpããã³tiffãã¡ã€ã«ãå«ãŸããŠããããã§ãã
ã ãããLessonProject.ToolsïŒPreviewCreator.csïŒãããžã§ã¯ãã§PreviewCreatorã¯ã©ã¹ãäœæããŸãããã
public static class PreviewCreator { public static bool SupportMimeType(string mimeType) { switch (mimeType) { case "image/jpg": case "image/jpeg": case "image/png": case "image/gif": return true; } return false; } }
FileController.csïŒ/Areas/Default/Controller/FileController.csïŒã§çœ®ãæããŸãïŒ
if (mimeType != null && PreviewCreator.SupportMimeType(mimeType.Name))
PreviewCreatorã«ã¯ãã¬ãã¥ãŒãäœæããããã®å€ãã®æ©èœããããããç»åãäœæããããã®ããŸããŸãªãªãã·ã§ã³ããªã¹ããããã®ãã¡ã®1ã€ã詳现ã«åæããŸãã ãã¹ãŠã®ãã¬ãã¥ãŒãjpeg圢åŒã§äœæãããããšãèæ
®ãã䟡å€ããããŸãã ããã§ããªãã·ã§ã³ã¯äœã§ããïŒ
- ã«ã©ãŒãšé»ãšçœã®ãªãã·ã§ã³ã ã°ã¬ãŒã¹ã±ãŒã«ãã©ã¡ãŒã¿ãŒã§å¶åŸ¡ïŒããã©ã«ã= falseïŒ
- ãã¬ãã¥ãŒ ïŒ
CreateAndSavePreview
ïŒå
ã®ç»åããã¬ãã¥ãŒãµã€ãºãããå°ããå Žåãç»åã¯çœããã£ã³ãã¹ã®äžå€®ã«é
眮ãããŸãã ãµã€ãºã«é¢ããŠãåæãµã€ãºãåçŽæ¹åïŒããŒãã¬ãŒã圢åŒã®æ£æ¹åœ¢ïŒã§ããå Žå-äžéšãåãåããŸãã æ¯çããµã€ãºã«å¯ŸããŠæ°Žå¹³æ¹åã®å Žåãäžå€®ãåãåããŸãã - ã¢ãã¿ãŒ ïŒ
CreateAndSaveAvatar
ïŒå
ã®ç»åããã¬ãã¥ãŒãµã€ãºããå°ããå Žåãç»åã¯åã«ä¿åãããŸãã ãµã€ãºã«é¢ããŠãåæãµã€ãºãåçŽæ¹åïŒããŒãã¬ãŒã圢åŒã®æ£æ¹åœ¢ïŒã§ããå Žåãé«ããæžãããŸãã æ¯çããµã€ãºã«å¯ŸããŠæ°Žå¹³æ¹åã®å Žåãäžå€®ãåãåããŸãã - ç»å ïŒ
CreateAndSaveImage
ïŒç»åãæå€§ãµã€ãºãããå°ããå Žåã¯ãå
ã®ãŸãŸã«ããŸãã ç»åãå¢çç·ã«åãŸããªãå Žåã¯ãæå€§ãµã€ãºãè¶
ããªãããã«çž®å°ããŠä¿åããŸãã - ãµã€ãºå¥ã ïŒ
CreateAndSaveFitToSize
ïŒç»åããµã€ãºããå°ããå Žåãå¿
èŠãªãµã€ãºã«æ¡å€§ãããŸãã ãã¡ãããå質ãäœäžããŸãã - äœç©ã ïŒ
CropAndSaveImage
ïŒæšæºãã©ã¡ãŒã¿ãŒã«å ããŠãç»åãããªãã³ã°ããããã®åº§æšãéä¿¡ãããŸãã
ãã¬ãã¥ãŒãäœæããŠïŒ
CreateAndSavePreview
ïŒãæ§æãã寞æ³ãååŸããŠAvatarSizeãã¬ãã¥ãŒïŒ/Areas/Default/Controllers/FileController.csïŒãäœæããŸãã
var filePreviewPath = Path.Combine("/Content/files/previews", qqfile.FileName); var previewIconSize = Config.IconSizes.FirstOrDefault(c => c.Name == "AvatarSize"); if (previewIconSize != null) { PreviewCreator.CreateAndSavePreview(qqfile.InputStream, new Size(previewIconSize.Width, previewIconSize.Height), Server.MapPath(filePreviewPath)); } return Json(new { success = true, result = "error", data = new { filePath, filePreviewPath } });
å§ããŸãã ããŠã³ããŒãã ãã¡ã€ã«ãããŒãããå¿
èŠãããããã¬ãã¥ãŒãäœæãããŸãã
ããã§ãfile-index.jsïŒ/Scripts/default/file-index.jsïŒã§åŠçãè¡ããŸãã
$('#UploadImage').fineUploader({ request: { endpoint: _this.ajaxFileUpload }, }) .on('error', function (event, id, name, reason) {
ããã§ããã¡ã€ã«ããã¬ãã¥ãŒãšãšãã«ããŒããããŸãã ãŸãã倧ããªãã¡ã€ã«ã®ãã¹ãåå¥ã«è»¢éããããšãã°é衚瀺ãã£ãŒã«ãã«èšé²ããŠãå°æ¥ããŒã¿ããŒã¹ã«æååãšããŠä¿åããããšãã§ããŸãã
ãã®èšèšã§ééã£ãŠããã®ã¯ã次ã®2ã€ã®åé¡ã§ãã
- ãã¡ã€ã«ã¯äžæžãã§ããŸãããããã¯æ¡åŒµåã®ã¿ã䜿çšããŠãã¡ã€ã«åãåå¥ã«å²ãåœãŠãããå°ãã®ãœã«ãã远å ããããšã§è§£æ±ºããŸã
- ãã¡ã€ã«ã¯ããŒã¿ããŒã¹ã«é¢ä¿ãªãããŠã³ããŒãã§ããŸãã ããã¯ãããŒãã«ããšã«ãã¡ã€ã«ãåå¥ã®ãã©ã«ããŒã«æžã蟌ãŸããæ€çŽ¢ãå®è¡ããŠæªèšé²ã®ãã®ãåé€ããããšã§è§£æ±ºã§ããŸãã
ãªã³ã¯ã«ãããã¡ã€ã«ã®ååŸ
å¥ã®ãã¡ã€ã«ã¢ããããŒãæ¹æ³ããããŸãã ãã¡ã€ã«ã¯ã€ã³ã¿ãŒãããäžã§èªç±ã«ãã³ã°ã¢ãããããã®ãã¹ãæå®ãïŒããšãã°ãfacebookã§ãã°ã€ã³ããå ŽåïŒããªã³ã¯ã䜿çšããŠãã®ãã¡ã€ã«ãæ¢ã«ä¿åããŸãã
ããã¯æ¬¡ã®ããã«è¡ãããŸãã
var webClient = new WebClient(); var bytes = webClient.DownloadData(url); var ms = new MemoryStream(bytes);
urlã¯ãã¡ã€ã«ãžã®ãã¹ã§ãã HttpWebRequestã䜿çšãããšããè€éã«ãªãå¯èœæ§ããããŸãã
public ActionResult Export(string uri) { HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(uri); webRequest.Method = "GET"; webRequest.KeepAlive = false; webRequest.PreAuthenticate = false; webRequest.Timeout = 1000; var response = webRequest.GetResponse(); var stream = response.GetResponseStream(); var previewIconSize = Config.IconSizes.FirstOrDefault(c => c.Name == "AvatarSize"); var filePreviewPath = Path.Combine("/Content/files/previews", Guid.NewGuid().ToString("N") + ".jpg"); if (previewIconSize != null) { PreviewCreator.CreateAndSavePreview(stream, new Size(previewIconSize.Width, previewIconSize.Height), Server.MapPath(filePreviewPath)); } return Content("OK"); }
ããã§ããã¡ã€ã«ã¯Guid.NewGuidã®çæãéããŠèšå®ãããŸãã ç§ãã¡ã¯ãã§ãã¯ããŸãïŒ
http://localhost/File/Export?uri=https://st.free-lance.ru/users/chernikov/upload/sm_f_81850beffd0d0c89.jpg
ãã¡ã€ã«ãã¢ããããŒããããåŠçãããŸããã ãã¹ãŠãæé«ã§ãïŒ
PreviewCreatorãããã¬ãŒã䜿çšããŠãããã§ãã¹ãŠãã©ã®ããã«æ©èœããããçè§£ããããšããå§ãããŸãã
ãã¹ãŠã®ãœãŒã¹ã¯
https://bitbucket.org/chernikov/lessonsã«ãããŸã