
<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>C# &#8211; CodeInDotNet</title>
	<atom:link href="https://www.codeindotnet.com/category/csharp/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.codeindotnet.com</link>
	<description>C# Dot Net Programming tutorial &#38; code examples</description>
	<lastBuildDate>Wed, 01 Oct 2025 19:36:24 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.8.3</generator>

<image>
	<url>https://www.codeindotnet.com/wp-content/uploads/2021/04/SiteIcon.png</url>
	<title>C# &#8211; CodeInDotNet</title>
	<link>https://www.codeindotnet.com</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>C# Automation Testing Tools Beyond Selenium: Market Analysis and Career Guide</title>
		<link>https://www.codeindotnet.com/csharp-automation-testing-tools-alternatives-to-selenium/</link>
					<comments>https://www.codeindotnet.com/csharp-automation-testing-tools-alternatives-to-selenium/#respond</comments>
		
		<dc:creator><![CDATA[admin]]></dc:creator>
		<pubDate>Wed, 01 Oct 2025 18:54:06 +0000</pubDate>
				<category><![CDATA[C#]]></category>
		<guid isPermaLink="false">https://www.codeindotnet.com/?p=10875</guid>

					<description><![CDATA[Best C# Automation Testing Tools (Other Than Selenium) Based on current market trends and industry adoption, here are the top automation testing tools that support C# programming: Playwright&#160;&#8211; The Rising Star Playwright has emerged as the most promising automation tool for 2025. It&#8217;s a modern end-to-end testing framework that offers comprehensive browser support and excellent [&#8230;]]]></description>
										<content:encoded><![CDATA[
<div id="PageInHoriAd1"></div>
<script>
fetch('/gads/PageInHoriAd1.txt')
	.then(response => response.text())
	.then(text => {
		document.getElementById('PageInHoriAd1').innerHTML = text;
	})
	.catch(error => {
		console.error('Error fetching manual PageInHoriAd1:', error);
	});
</script>



<h2 class="wp-block-heading h2Cust1" id="best-c-automation-testing-tools">Best C# Automation Testing Tools (Other Than Selenium)</h2>



<p>Based on current market trends and industry adoption, here are the top automation testing tools that support C# programming:</p>



<br>



<figure class="wp-block-image size-large"><img fetchpriority="high" decoding="async" width="1024" height="1024" src="https://www.codeindotnet.com/wp-content/uploads/2025/10/C-Automation-Testing-Tools-Beyond-Selenium-1024x1024.jpg" alt="C# Automation Testing Tools Beyond Selenium" class="wp-image-10877" srcset="https://www.codeindotnet.com/wp-content/uploads/2025/10/C-Automation-Testing-Tools-Beyond-Selenium-1024x1024.jpg 1024w, https://www.codeindotnet.com/wp-content/uploads/2025/10/C-Automation-Testing-Tools-Beyond-Selenium-300x300.jpg 300w, https://www.codeindotnet.com/wp-content/uploads/2025/10/C-Automation-Testing-Tools-Beyond-Selenium-768x768.jpg 768w, https://www.codeindotnet.com/wp-content/uploads/2025/10/C-Automation-Testing-Tools-Beyond-Selenium-1536x1536.jpg 1536w, https://www.codeindotnet.com/wp-content/uploads/2025/10/C-Automation-Testing-Tools-Beyond-Selenium-75x75.jpg 75w, https://www.codeindotnet.com/wp-content/uploads/2025/10/C-Automation-Testing-Tools-Beyond-Selenium.jpg 2048w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<br><br>



<h3 class="wp-block-heading hLBRed" id="playwright-the-rising-star"><strong>Playwright&nbsp;&#8211; The Rising Star</strong></h3>



<br>



<p><a href="https://playwright.dev/" target="_blank" rel="noopener"><strong>Playwright</strong></a> has emerged as the most promising automation tool for 2025. It&#8217;s a modern end-to-end testing framework that offers comprehensive browser support and excellent C# integration.</p>



<p class="p-mb-0"><strong>Key Features:</strong></p>



<ul class="wp-block-list ul1">
<li>Cross-browser testing (Chromium, Firefox, WebKit)</li>



<li>Multi-language support including C#</li>



<li>Built-in auto-wait mechanisms</li>



<li>Native parallel execution support</li>



<li>Advanced network interception and mocking capabilities</li>



<li>Mobile emulation and device testing</li>
</ul>



<p class="p-mb-0"><strong>Why It&#8217;s the Best Choice:</strong></p>



<ul class="wp-block-list ul1">
<li><strong>Modern Architecture</strong>: Playwright runs outside the browser, providing better control and isolation<a href="https://www.lambdatest.com/blog/cypress-vs-playwright/" target="_blank" rel="noreferrer noopener">.</a></li>



<li><strong>Fastest Growth</strong>: Usage has exceeded Selenium in recent surveys, making it the top automation tool for 2025</li>



<li><strong>Enterprise Ready</strong>: Strong CI/CD integration and advanced debugging tools</li>
</ul>



<br>



<h4 class="wp-block-heading" id="key-comparisons"><strong>Selenium vs Playwright &#8211; Key Comparisons</strong></h4>



<p class="custp1">When choosing between <strong>Selenium</strong> and <strong>Playwright</strong> for C# end-to-end automation, Playwright holds clear advantages in modern capabilities, while Selenium remains a strong legacy option.</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>Criteria</th><th>Selenium</th><th>Playwright</th></tr></thead><tbody><tr><td>Browser Support</td><td>Chrome, Firefox, Edge, Safari (via WebDriver)</td><td>Chromium, Firefox, WebKit—single API across all three</td></tr><tr><td>Speed &amp; Stability</td><td>Slower due to WebDriver protocol overhead</td><td>Faster execution with built-in auto-waiting and direct control</td></tr><tr><td>Parallel Execution</td><td>Limited; requires external grid (e.g., Selenium Grid)</td><td>Native parallelism viaTestRunner.RunInParallel()</td></tr><tr><td>Wait Mechanisms</td><td>Manual waits or WebDriverWait</td><td>Automatic smart waits on actions and assertions</td></tr><tr><td>Network Interception</td><td>Only via browser extensions or proxies</td><td>Built-in API for request/response interception and mocking</td></tr><tr><td>Mobile Testing</td><td>Via Appium integration</td><td>Limited (needs external setup)</td></tr><tr><td>API Testing</td><td>Requires separate libraries</td><td>First-class API testing support built in</td></tr><tr><td>Language Bindings</td><td>Multiple (Java, Python, C#, Ruby, JS)</td><td>Multiple (JS/TS, Python, C#, Java)</td></tr><tr><td>Community &amp; Maturity</td><td>Very mature; 15+ years, vast ecosystem</td><td>Newer (2020); rapidly growing community</td></tr><tr><td>CI/CD Integration</td><td>Well-established plugins for Jenkins, Azure, etc.</td><td>Strong integration with GitHub Actions, Azure Pipelines</td></tr><tr><td>Future Demand</td><td>Declining relative to modern tools</td><td>High growth; fastest adoption among automation frameworks</td></tr><tr><td>Learning Curve</td><td>Steeper for advanced features</td><td>More intuitive API design and built-in helpers</td></tr></tbody></table></figure>



<br><br>



<h3 class="wp-block-heading hLBRed" id="appium-with-win-app-driver-desktop-application-testing"><strong>Appium with WinAppDriver&nbsp;&#8211; Desktop Application Testing</strong></h3>



<br>



<p>For Windows desktop application automation, <a href="http://appium.io/" target="_blank" rel="noopener"><strong>Appium</strong></a> paired with WinAppDriver is Microsoft&#8217;s recommended solution after CodedUI deprecation.</p>



<p class="p-mb-0"><strong>Key Features:</strong></p>



<ul class="wp-block-list">
<li>Supports WPF, WinForms, UWP, and Win32 applications</li>



<li>Selenium-like <a href="/what-is-api-application-programming-interface/" target="_blank" data-type="post" data-id="18" rel="noreferrer noopener">API</a> for familiar syntax</li>



<li>Multi-language support including C#</li>



<li>Integration with CI/CD pipelines</li>
</ul>



<br><br>



<h3 class="wp-block-heading hLBRed" id="spec-flow-bdd-framework"><strong>SpecFlow&nbsp;&#8211; BDD Framework</strong></h3>



<br>



<p><a href="http://specflow.org" target="_blank" rel="noopener"><strong>SpecFlow</strong></a> is the leading Behavior-Driven Development (BDD) framework for .NET, allowing natural language test scenarios.</p>



<p class="p-mb-0"><strong>Key Features:</strong></p>



<ul class="wp-block-list ul1">
<li>Integrates with NUnit, xUnit, and MSTest</li>



<li>Gherkin syntax for business-readable tests</li>



<li>Strong Visual Studio integration</li>



<li>Supports parallel execution</li>
</ul>



<br><br>



<h2 class="wp-block-heading hLBRed" id="other-notable-c-tools"><strong>Other Notable C# Tools:</strong></h2>



<br>



<ul class="wp-block-list">
<li><strong>NUnit/xUnit/MSTest</strong>: Core unit testing frameworks</li>



<li><strong>TestComplete</strong>: Commercial tool with advanced features</li>



<li><strong>Ranorex</strong>: Enterprise-grade automation platform</li>



<li><strong>Robot Framework</strong>: Keyword-driven testing with .NET support</li>



<li><strong>White</strong>: Desktop UI automation library (now deprecated, use WinAppDriver instead)</li>
</ul>



<br><br><br>



<h2 class="wp-block-heading hLBRed" id="market-demand-and-future-trends"><strong>Market Demand and Future Trends</strong></h2>



<br>



<h3 class="wp-block-heading custp1" id="highest-demand-tools-for-2025"><strong>Highest Demand Tools for 2025:</strong></h3>



<ol class="wp-block-list custp1">
<li><strong>Playwright</strong>: Experiencing explosive growth with 74,000+ GitHub stars and widespread enterprise adoption</li>



<li><strong>Selenium</strong>: Still maintains large market share but declining relative to newer tools</li>



<li><strong>Cypress</strong>: Strong in JavaScript-focused environments but limited to Chromium browsers</li>



<li><strong>Appium</strong>: Essential for mobile and desktop application testing</li>
</ol>



<br><br>



<h3 class="wp-block-heading" id="future-market-projections"><strong>Future Market Projections:</strong></h3>



<br>



<p class="p-mb-0">The global test automation market is projected to grow from&nbsp;<strong>$28.1 billion in 2023 to $55.2 billion by 2028</strong>, driven by:</p>



<ul class="wp-block-list ul1">
<li>Increasing demand for continuous testing in DevOps environments</li>



<li>AI-powered testing tools integration</li>



<li>Shift toward cloud-based testing platforms</li>
</ul>



<br><br><br>



<h2 class="wp-block-heading hLBRed" id="salary-expectations-and-career-growth"><strong>Salary Expectations and Career Growth</strong></h2>



<br>



<h3 class="wp-block-heading custp1" id="c-automation-testing-salaries-in-india-2025"><strong>C# Automation Testing Salaries in India (2025):</strong></h3>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>Experience Level</th><th>Salary Range (INR/year)</th><th>Key Skills</th></tr></thead><tbody><tr><td>Entry Level (0-2 years)</td><td>₹3-7 lakhs</td><td>Basic automation, Selenium, C#</td></tr><tr><td>Mid Level (3-5 years)</td><td>₹8-15 lakhs</td><td>Playwright, CI/CD, Framework design</td></tr><tr><td>Senior Level (6+ years)</td><td>₹15-25 lakhs</td><td>Architecture, Team leadership, Multiple tools</td></tr><tr><td>Specialist (Playwright)</td><td>₹5-22 lakhs</td><td>Modern frameworks, Cloud integration</td></tr></tbody></table></figure>



<br>



<h3 class="wp-block-heading custp1" id="city-wise-salary-variations"><strong>City-wise Salary Variations:</strong></h3>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>City</th><th>Salary Range (INR/year)</th><th>Market Characteristics</th></tr></thead><tbody><tr><td>Bangalore</td><td>₹6-25 lakhs</td><td>Highest paying, MNCs and startups</td></tr><tr><td>Pune</td><td>₹5-12 lakhs</td><td>Growing IT hub, cost-effective</td></tr><tr><td>Hyderabad</td><td>₹5-12 lakhs</td><td>Thriving tech ecosystem</td></tr><tr><td>Chennai</td><td>₹4.5-10 lakhs</td><td>Expanding SaaS companies</td></tr></tbody></table></figure>



<br>



<h3 class="wp-block-heading custp1" id="skills-that-command-higher-salaries"><strong>Skills That Command Higher Salaries:</strong></h3>



<ol class="wp-block-list ul1">
<li><strong>Playwright Expertise</strong>: Companies like Microsoft, GitHub, LinkedIn actively hiring</li>



<li><strong>DevOps Integration</strong>: CI/CD pipeline knowledge essential</li>



<li><strong>Cloud Testing</strong>: BrowserStack, AWS Device Farm experience valued</li>



<li><strong>AI/ML Integration</strong>: 75% of organizations investing in AI-driven QA</li>



<li><strong>Multiple Framework Proficiency</strong>: Selenium + Playwright combination ideal</li>
</ol>



<br><br><br>



<h2 class="wp-block-heading hLBRed" id="career-recommendations"><strong>Career Recommendations</strong></h2>



<br>



<h3 class="wp-block-heading custp1" id="for-maximum-salary-potential"><strong>For Maximum Salary Potential:</strong></h3>



<ol class="wp-block-list ul1">
<li><strong>Master Playwright</strong>: It&#8217;s the fastest-growing tool with highest demand</li>



<li><strong>Maintain Selenium Skills</strong>: Large existing codebase ensures continued relevance</li>



<li><strong>Learn Cloud Platforms</strong>: BrowserStack, LambdaTest expertise valuable</li>



<li><strong>Develop DevOps Skills</strong>: Jenkins, Azure DevOps, GitHub Actions integration</li>



<li><strong>Specialize in Domain</strong>: Banking, healthcare, e-commerce have higher pay scales</li>
</ol>



<br>



<h3 class="wp-block-heading" id="learning-path-for-c-developers"><strong>Learning Path for C# Developers:</strong></h3>



<br>



<p class="p-mb-0">Person like 12+ years of .NET experience, focus on:</p>



<ol class="wp-block-list ul1">
<li><strong>Playwright with C#</strong>&nbsp;&#8211; Modern framework with best growth prospects</li>



<li><strong>SpecFlow for BDD</strong>&nbsp;&#8211; Leverage existing C# skills for business-readable tests</li>



<li><strong>Azure DevOps integration</strong>&nbsp;&#8211; Natural fit with Microsoft stack</li>



<li><strong>WinAppDriver</strong>&nbsp;&#8211; For desktop application testing needs</li>
</ol>



<br>



<h3 class="wp-block-heading" id="job-market-outlook"><strong>Job Market Outlook:</strong></h3>



<br>



<p class="p-mb-0">The demand for C# automation engineers is particularly strong because:</p>



<ul class="wp-block-list">
<li><strong>Enterprise Preference</strong>: Many large organizations use .NET stack</li>



<li><strong>Skill Scarcity</strong>: Fewer C# automation engineers compared to Java/Python</li>



<li><strong>Higher Compensation</strong>: C# skills typically command 10-15% premium over other languages</li>
</ul>



<br><br>



<p><strong>Conclusion</strong>: Playwright represents the best investment for future career growth, offering modern capabilities, strong market demand, and excellent salary potential. Combined with your existing C# expertise, this positions you optimally for the evolving automation testing landscape.</p>



<br><br>



<h2 class="wp-block-heading hLBRed" id="f"><strong>Frequently Asked Questions</strong> &#8211; <strong>FAQs</strong></h2>



<br>



<h3 class="wp-block-heading" id="q-1-what-makes-playwright-better-than-selenium-for-c-automation"><strong>Q1: What makes Playwright better than Selenium for C# automation?</strong></h3>



<p class="custp1">Playwright offers faster execution through built-in smart waits and direct browser control, seamless cross-browser testing across Chromium, Firefox, and WebKit with a single API, and first-class support for network interception and API testing—capabilities that require additional setup or external tools in Selenium.</p>



<br>



<h3 class="wp-block-heading" id="q-2-can-i-reuse-my-existing-selenium-tests-in-playwright"><strong>Q2: Can I reuse my existing Selenium tests in Playwright?</strong></h3>



<p class="custp1">While there is no direct migration tool, you can gradually port Selenium tests to Playwright by rewriting key actions (locators, navigation, waits) using Playwright’s API. This phased approach lets you maintain legacy tests while adopting Playwright for new scenarios.</p>



<br>



<h3 class="wp-block-heading" id="q-3-is-playwright-suitable-for-mobile-application-testing"><strong>Q3: Is Playwright suitable for mobile application testing?</strong></h3>



<p class="custp1">Playwright’s core strength is web automation. For mobile testing, it requires external emulation or integration with tools like Appium. If mobile automation is a primary need, Appium with WinAppDriver remains the recommended C# solution.</p>



<br>



<h3 class="wp-block-heading" id="q-4-how-steep-is-the-learning-curve-for-playwright-compared-to-selenium"><strong>Q4: How steep is the learning curve for Playwright compared to Selenium?</strong></h3>



<p class="custp1">Playwright’s modern, promise-based API and auto-wait mechanisms make it more intuitive for beginners. Selenium’s WebDriver protocol often requires manual waits and handling browser quirks, which can increase complexity.</p>



<br>



<h3 class="wp-block-heading" id="q-5-which-tool-has-better-ci-cd-integration-for-c-projects"><strong>Q5: Which tool has better CI/CD integration for C# projects?</strong></h3>



<p class="custp1">Both tools integrate well with popular CI/CD platforms. Playwright provides built-in reporters and GitHub Actions support, while Selenium relies on established plugins for Jenkins, Azure DevOps, and TeamCity. Playwright’s newer integrations simplify pipeline setup.</p>



<br>



<h3 class="wp-block-heading" id="q-6-will-learning-playwright-increase-my-salary-potential"><strong>Q6: Will learning Playwright increase my salary potential?</strong></h3>



<p class="custp1">Yes. Demand for Playwright expertise is rapidly growing, especially in enterprises moving to modern test architectures. Automation engineers skilled in Playwright and CI/CD practices command higher salary ranges, particularly in mid to senior roles.</p>



<br>



<h3 class="wp-block-heading" id="q-7-what-resources-should-i-use-to-learn-playwright-with-c"><strong>Q7: What resources should I use to learn Playwright with C#?</strong></h3>



<p class="custp1">The official Playwright website (<a href="https://playwright.dev/" target="_blank" rel="noreferrer noopener">https://playwright.dev</a>) offers comprehensive C# documentation, tutorials, and API references. Additionally, BrowserStack’s Playwright guides and community blogs provide practical examples and best practices.</p>



<br>



<h3 class="wp-block-heading" id="q-8-is-spec-flow-still-a-viable-option-for-bdd-in-net"><strong>Q8: Is SpecFlow still a viable option for BDD in .NET?</strong></h3>



<p class="custp1">SpecFlow reached end-of-life in late 2024. For BDD in .NET, consider community-driven forks like Reqnroll or alternative frameworks such as xBehave.net, which provide similar Gherkin-style testing support.</p>



<br>



<h3 class="wp-block-heading" id="q-9-how-do-i-choose-between-open-source-and-commercial-automation-tools"><strong>Q9: How do I choose between open-source and commercial automation tools?</strong></h3>



<p class="custp1">Open-source tools like Playwright and Appium offer cost-effective, community-driven development and rapid updates. Commercial platforms (e.g., TestComplete, Ranorex) provide enterprise features, dedicated support, and out-of-the-box reporting but come with licensing costs. Choose based on project scale, budget, and required features.</p>



<br>



<h3 class="wp-block-heading" id="q-10-what-career-path-should-a-c-automation-engineer-follow"><strong>Q10: What career path should a C# automation engineer follow?</strong></h3>



<p class="custp1">Start by mastering Playwright for modern web testing, then learn cloud testing platforms (BrowserStack, LambdaTest) and CI/CD integration. Expand skills into API testing, AI-driven testing tools, and desktop automation with WinAppDriver. Specializing in high-demand domains—finance, healthcare, or e-commerce—can further boost salary and advancement opportunities.</p>



<br>



<br>
<script src="/my-js/latesttop10post.js" type="text/javascript"></script>
<input type="hidden" id="cids" value="3,59,71">
<div id="latestPostlist"></div>
<br>



<div class="wp-block-rank-math-toc-block toc-cust" id="rank-math-toc"><h2>Table of Contents</h2><nav><ul><li><a href="#best-c-automation-testing-tools">Best C# Automation Testing Tools (Other Than Selenium)</a><ul><li><a href="#playwright-the-rising-star">Playwright &#8211; The Rising Star</a><ul><li><a href="#key-comparisons">Selenium vs Playwright &#8211; Key Comparisons</a></li></ul></li><li><a href="#appium-with-win-app-driver-desktop-application-testing">Appium with WinAppDriver &#8211; Desktop Application Testing</a></li><li><a href="#spec-flow-bdd-framework">SpecFlow &#8211; BDD Framework</a></li></ul></li><li><a href="#other-notable-c-tools">Other Notable C# Tools:</a></li><li><a href="#market-demand-and-future-trends">Market Demand and Future Trends</a><ul><li><a href="#highest-demand-tools-for-2025">Highest Demand Tools for 2025:</a></li><li><a href="#future-market-projections">Future Market Projections:</a></li></ul></li><li><a href="#salary-expectations-and-career-growth">Salary Expectations and Career Growth</a><ul><li><a href="#c-automation-testing-salaries-in-india-2025">C# Automation Testing Salaries in India (2025):</a></li><li><a href="#city-wise-salary-variations">City-wise Salary Variations:</a></li><li><a href="#skills-that-command-higher-salaries">Skills That Command Higher Salaries:</a></li></ul></li><li><a href="#career-recommendations">Career Recommendations</a><ul><li><a href="#for-maximum-salary-potential">For Maximum Salary Potential:</a></li><li><a href="#learning-path-for-c-developers">Learning Path for C# Developers:</a></li><li><a href="#job-market-outlook">Job Market Outlook:</a></li></ul></li><li><a href="#f">Frequently Asked Questions &#8211; FAQs</a><ul><li><a href="#q-1-what-makes-playwright-better-than-selenium-for-c-automation">Q1: What makes Playwright better than Selenium for C# automation?</a></li><li><a href="#q-2-can-i-reuse-my-existing-selenium-tests-in-playwright">Q2: Can I reuse my existing Selenium tests in Playwright?</a></li><li><a href="#q-3-is-playwright-suitable-for-mobile-application-testing">Q3: Is Playwright suitable for mobile application testing?</a></li><li><a href="#q-4-how-steep-is-the-learning-curve-for-playwright-compared-to-selenium">Q4: How steep is the learning curve for Playwright compared to Selenium?</a></li><li><a href="#q-5-which-tool-has-better-ci-cd-integration-for-c-projects">Q5: Which tool has better CI/CD integration for C# projects?</a></li><li><a href="#q-6-will-learning-playwright-increase-my-salary-potential">Q6: Will learning Playwright increase my salary potential?</a></li><li><a href="#q-7-what-resources-should-i-use-to-learn-playwright-with-c">Q7: What resources should I use to learn Playwright with C#?</a></li><li><a href="#q-8-is-spec-flow-still-a-viable-option-for-bdd-in-net">Q8: Is SpecFlow still a viable option for BDD in .NET?</a></li><li><a href="#q-9-how-do-i-choose-between-open-source-and-commercial-automation-tools">Q9: How do I choose between open-source and commercial automation tools?</a></li><li><a href="#q-10-what-career-path-should-a-c-automation-engineer-follow">Q10: What career path should a C# automation engineer follow?</a></li></ul></li></ul></nav></div>



<br>
]]></content:encoded>
					
					<wfw:commentRss>https://www.codeindotnet.com/csharp-automation-testing-tools-alternatives-to-selenium/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>What is NullReferenceException? Complete Guide to Understanding, Fixing, and Preventing Null Reference Errors in C#</title>
		<link>https://www.codeindotnet.com/what-is-nullreferenceexception-complete-guide-fixing-preventing/</link>
					<comments>https://www.codeindotnet.com/what-is-nullreferenceexception-complete-guide-fixing-preventing/#respond</comments>
		
		<dc:creator><![CDATA[admin]]></dc:creator>
		<pubDate>Mon, 08 Sep 2025 16:11:18 +0000</pubDate>
				<category><![CDATA[.Net Core]]></category>
		<category><![CDATA[C#]]></category>
		<guid isPermaLink="false">https://www.codeindotnet.com/?p=10814</guid>

					<description><![CDATA[NullReferenceException is one of the most common and frustrating runtime errors that .NET developers encounter. If you&#8217;ve ever seen the message &#8220;Object reference not set to an instance of an object,&#8221; you&#8217;ve experienced this exception firsthand. This comprehensive guide will walk you through everything you need to know about NullReferenceException, from understanding what causes it to implementing [&#8230;]]]></description>
										<content:encoded><![CDATA[
<br><br>



<p><strong>NullReferenceException</strong> is one of the most common and frustrating runtime errors that .NET developers encounter. If you&#8217;ve ever seen the message &#8220;Object reference not set to an instance of an object,&#8221; you&#8217;ve experienced this exception firsthand. This comprehensive guide will walk you through everything you need to know about <strong>NullReferenceException</strong>, from understanding what causes it to implementing robust prevention strategies.</p>



<br><br>



<h2 class="wp-block-heading h2Cust1" id="what-is-nullreferenceexception"><strong>What is NullReferenceException?</strong></h2>



<br>



<p>A&nbsp;<strong>NullReferenceException</strong>&nbsp;(often abbreviated as NRE) occurs when your program attempts to access a member (such as a method or property) on a reference variable that currently holds a&nbsp;<strong>null reference</strong>. In simple terms, you&#8217;re trying to use something that doesn&#8217;t exist &#8211; like asking someone who isn&#8217;t there to do something for you.<a rel="noreferrer noopener" target="_blank" href="https://www.tutorialsteacher.com/articles/nullreferenceexception-in-csharp"></a></p>



<p>In .NET,&nbsp;<strong>reference types</strong>&nbsp;(such as classes, strings, and arrays) store references to objects in memory rather than the actual values. When a reference variable doesn&#8217;t point to any object, it contains a&nbsp;<strong>null value</strong>. The&nbsp;<strong>null reference</strong>&nbsp;serves as a way to indicate that a variable has no meaningful value or that an object is absent.<a rel="noreferrer noopener" target="_blank" href="https://pvs-studio.com/en/blog/posts/csharp/1049/"></a></p>



<p>When you attempt to&nbsp;<strong>dereference</strong>&nbsp;a&nbsp;<strong>null reference</strong>&nbsp;by accessing its members using the dot operator (.), the .NET runtime throws a&nbsp;<strong>NullReferenceException</strong>.<a rel="noreferrer noopener" target="_blank" href="https://learn.microsoft.com/en-us/dotnet/api/system.nullreferenceexception?view=net-9.0"></a></p>



<br>
<div style="padding: 1.25rem 1.25rem 1.25rem 1.25rem;box-shadow: 0.0625rem 0.0625rem 0.9375rem 0rem lightgrey;margin-bottom: 1.25rem;border-radius: 0.625rem;">
	<div style="margin-bottom: 0.375rem;">
		<span style="border-bottom: 0.0625rem solid #cd5c5c; color:#cd5c5c;"><b><i>Interview Questions And Answers: </i></b></span>
		<a href="/oops-interview-questions-answers/" target="_blank" rel="noreferrer noopener"><strong>OOPs</strong></a>, 
		<a href="/csharp-interview-questions-answers/" target="_blank" rel="noreferrer noopener"><strong>C#</strong></a>, 
		<a href="/web-api-interview-questions-answers/" target="_blank" rel="noreferrer noopener"><strong>Web API</strong></a>, 
		<a href="/sql-interview-questions-answers/" target="_blank" rel="noreferrer noopener"><strong>SQL Database</strong></a>, 
		<a href="/entity-framework-interview-questions-answers/"><strong>Entity Framework</strong></a>
		
	</div>
</div>



<br><br>



<h2 class="wp-block-heading h2Cust1" id="common-causes-of-nullreferenceexception"><strong>Common Causes of NullReferenceException</strong></h2>



<p class="custp1">Understanding the root causes of&nbsp;<strong>null reference errors</strong>&nbsp;is essential for effective debugging and prevention. Here are the most frequent scenarios that lead to&nbsp;<strong>NullReferenceException</strong>:<a rel="noreferrer noopener" target="_blank" href="https://learn.microsoft.com/en-us/answers/questions/944445/how-can-i-fix-the-error-system-nullreferenceexcept"></a></p>



<h3 class="wp-block-heading hLBRed" id="1-uninitialized-object-variables"><strong>1. Uninitialized Object Variables</strong></h3>



<p class="custp1">The most basic cause occurs when you declare a reference variable but forget to initialize it with an actual object:</p>



<pre class="pchl"><code><span class="key">string</span> message = null;
<span class="key">int</span> length = message.Length; <span class="com">// Throws NullReferenceException</span></code></pre>



<br><br>



<h3 class="wp-block-heading hLBRed" id="2-uninitialized-class-fields"><strong>2. Uninitialized Class Fields</strong></h3>



<p class="custp1">Class fields of reference types default to&nbsp;<strong>null</strong>&nbsp;if not explicitly initialized:</p>



<pre class="pchl"><code><span class="key">public</span> <span class="key">class</span> Person
{
    <span class="key">private</span> <span class="key">string</span> _name; <span class="com">// Defaults to null</span>
    
    <span class="key">public</span> <span class="key">void</span> DisplayName()
    {
        Console.WriteLine(_name.Length); <span class="com">// NullReferenceException</span>
    }
} </code></pre>



<br><br>



<h3 class="wp-block-heading hLBRed" id="3-method-returning-null"><strong>3. Method Returning Null</strong></h3>



<p class="custp1">When methods return&nbsp;<strong>null</strong>&nbsp;values and you don&#8217;t check before using the result:</p>



<pre class="pchl"><code><span class="key">public</span> Person FindPerson(<span class="key">int</span> id)
{
    <span class="com">// Returns null if person not found</span>
    <span class="key">return</span> database.FirstOrDefault(p =&gt p.Id == id);
}

<span class="key">var</span> person = FindPerson(123);
Console.WriteLine(person.Name); <span class="com">// Potential NullReferenceException</span></code></pre>



<br><br>



<h3 class="wp-block-heading hLBRed" id="4-method-chaining-with-null-values"><strong>4. Method Chaining with Null Values</strong></h3>



<p class="custp1"><strong>Method chaining</strong>&nbsp;becomes dangerous when any link in the chain returns&nbsp;<strong>null</strong>:</p>



<pre class="pchl"><code><span class="key">var</span> street = service.GetUser().Address.Street; <span class="com">// Any part could be null</span></code></pre>



<br><br>



<h3 class="wp-block-heading hLBRed" id="5-array-elements-containing-null"><strong>5. Array Elements Containing Null</strong></h3>



<p class="custp1">Arrays can contain&nbsp;<strong>null elements</strong>, leading to exceptions during iteration:</p>



<pre class="pchl"><code>string[] names = { <span class="str">"Alice"</span>, <span class="key">null</span>, <span class="str">"Bob"</span> };
<span class="key">foreach</span> (<span class="key">var</span> name <span class="key">in</span> names)
{
    Console.WriteLine(name.Length); <span class="com">// Throws exception on null element</span>
} </code></pre>



<br><br>



<h3 class="wp-block-heading hLBRed" id="6-forgetting-component-assignment-unity-development"><strong>6. Forgetting Component Assignment (Unity Development)</strong></h3>



<p class="custp1">In&nbsp;<strong>Unity development</strong>, a common cause is forgetting to assign components in the Inspector:</p>



<pre class="pchl"><code><span class="key">public</span> <span class="key">class</span> PlayerController : MonoBehaviour
{
    <span class="key">public</span> Transform playerTransform; <span class="com">// Not assigned in Inspector</span>
    
    <span class="key">void</span> Start()
    {
        playerTransform.position = Vector3.zero; <span class="com">// NullReferenceException</span>
    }
} </code></pre>



<br><br><br><br>



<h2 class="wp-block-heading h2Cust1" id="how-to-fix-nullreferenceexception"><strong>How to Fix NullReferenceException</strong></h2>



<p class="custp1">Fixing&nbsp;<strong>null reference errors</strong>&nbsp;requires systematic debugging and proper&nbsp;<strong>null handling</strong>. Here&#8217;s a step-by-step approach to resolve these issues:<a rel="noreferrer noopener" target="_blank" href="https://sentry.io/answers/nullreferenceexception-c-sharp/"></a></p>



<h3 class="wp-block-heading hLBRed" id="step-1-identify-the-exact-location"><strong>1. Identify the Exact Location</strong></h3>



<p class="custp1">The&nbsp;<strong>exception message</strong>&nbsp;typically indicates the exact line and method where the error occurred:</p>



<pre class="pchl"><code>NullReferenceException: Object reference not set to an instance of an object
at Example.Start() [0x0000b] in /Unity/projects/nre/Assets/Example.cs:10 </code></pre>



<p>This tells you that line 10 in the Example.cs file is where the problem occurs.<a rel="noreferrer noopener" target="_blank" href="https://docs.unity3d.com/550/Documentation/Manual/NullReferenceException.html"></a></p>



<br>



<h3 class="wp-block-heading hLBRed" id="step-2-use-debugging-tools"><strong>2. Use Debugging Tools</strong></h3>



<p class="custp1">Modern IDEs like&nbsp;<strong>Visual Studio</strong>&nbsp;provide powerful debugging capabilities:</p>



<ul class="wp-block-list ol1">
<li>Set&nbsp;<strong>breakpoints</strong>&nbsp;before the problematic line</li>



<li>Use the&nbsp;<strong>debugger</strong>&nbsp;to inspect variable values</li>



<li>Leverage <strong>Null Reference Analysis</strong> in Visual Studio to identify which specific object is <strong>null</strong><a href="https://blog.elmah.io/debugging-system-nullreferenceexception-object-reference-not-set-to-an-instance-of-an-object/" target="_blank" rel="noreferrer noopener"></a></li>
</ul>



<br>



<h3 class="wp-block-heading hLBRed" id="step-3-implement-null-checks"><strong>3. Implement Null Checks</strong></h3>



<p class="custp1">The most straightforward fix is adding&nbsp;<strong>explicit null checks</strong>:</p>



<pre class="pchl"><code><span class="key">public</span> <span class="key">void</span> DisplayUserName(User user)
{
    <span style="background:#f2f19d;"><span class="key">if</span> (user != <span class="key">null</span>)</span>
    {
        Console.WriteLine(user.Name);
    }
    <span class="key">else</span>
    {
        Console.WriteLine(<span class="str">"User is null"</span>);
    }
} </code></pre>



<br><br>



<h3 class="wp-block-heading hLBRed" id="step-4-use-safe-navigation-patterns"><strong>4. Use Safe Navigation Patterns</strong></h3>



<p class="custp1"><strong>C# 6.0</strong>&nbsp;introduced&nbsp;<strong>null-conditional operators</strong>&nbsp;that provide elegant solutions for&nbsp;<strong>null safety</strong>:</p>



<pre class="pchl"><code><span class="com">// Using null-conditional operator (?.)</span>
<span class="key">var</span> userName = user<span style="background:#f2f19d;">?</span>.Name;

<span class="com">// Chaining null-conditional operators</span>
<span class="key">var</span> street = user<span style="background:#f2f19d;">?</span>.Address<span style="background:#f2f19d;">?</span>.Street;

<span class="com">// Null-conditional with indexer</span>
<span class="key">var</span> firstItem = collection<span style="background:#f2f19d;">?</span>[0]; </code></pre>



<br><br>



<h3 class="wp-block-heading hLBRed" id="step-5-provide-default-values"><strong>5. Provide Default Values</strong></h3>



<p class="custp1">Use the&nbsp;<strong>null-coalescing operator</strong>&nbsp;(??) to provide fallback values:</p>



<pre class="pchl"><code><span class="key">string</span> displayName = user?.Name <span style="background:#f2f19d;">??</span> <span class="str">"Unknown User"</span>;
<span class="key">var</span> items = collection <span style="background:#f2f19d;">??</span> <span class="key">new</span> List&lt;<span class="key">string</span>&gt(); </code></pre>



<br><br>



<br><br><br>



<h2 class="wp-block-heading h2Cust1" id="advanced-debugging-techniques"><strong>Advanced Debugging Techniques</strong></h2>



<br>



<h3 class="wp-block-heading hLBRed" id="using-debug-assert-for-development"><strong><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-black-color">1.</mark> Using Debug.Assert for Development</strong></h3>



<p class="custp1"><strong>Debug.Assert</strong>&nbsp;helps catch&nbsp;<strong>null references</strong>&nbsp;early during development:</p>



<pre class="pchl"><code><span class="key">public</span> <span class="key">void</span> ProcessUser(User user)
{
    Debug.Assert(user != <span class="key">null</span>, <span class="str">"User should not be null"</span>);
    <span class="com">// Process user safely</span>
} </code></pre>



<br><br>



<h3 class="wp-block-heading hLBRed" id="exception-handling-with-try-catch"><strong>2. Exception Handling with Try-Catch</strong></h3>



<p class="custp1">While not recommended as a primary solution,&nbsp;<strong>try-catch blocks</strong>&nbsp;can handle unexpected&nbsp;<strong>null references</strong>:</p>



<pre class="pchl"><code><span class="key">try</span>
{
    <span class="key">var</span> result = service.GetData().ProcessValue();
}
<span class="key">catch</span> (NullReferenceException ex)
{
    Logger.LogError(<span class="str">"Unexpected null reference: "</span> + ex.Message);
    <span class="com">// Handle gracefully</span>
} </code></pre>



<br><br>



<h3 class="wp-block-heading hLBRed" id="using-nullable-reference-types"><strong>3. Using Nullable Reference Types</strong></h3>



<p class="custp1"><strong>C# 8.0</strong>&nbsp;introduced&nbsp;<strong>nullable reference types</strong>&nbsp;that help identify potential&nbsp;<strong>null reference issues</strong>&nbsp;at compile time:</p>



<pre class="pchl"><code>#nullable enable

<span class="key">public</span> <span class="key">class</span> User
{
    <span class="key">public</span> <span class="key">string</span> Name { get; set; } = string.Empty; <span class="com">// Non-nullable</span>
    <span class="key">public</span> string? Email { get; set; } <span class="com">// Nullable</span>
} </code></pre>



<br><br><br><br>



<h2 class="wp-block-heading h2Cust1" id="ways-to-prevent-nullreferenceexception"><strong>Ways to Prevent NullReferenceException</strong></h2>



<p class="custp1">Prevention is always better than fixing&nbsp;<strong>null reference errors</strong>&nbsp;after they occur. Here are proven strategies to avoid&nbsp;<strong>NullReferenceException</strong>:<a rel="noreferrer noopener" target="_blank" href="https://www.wayline.io/blog/fixing-nullreferenceexception-unity-guide"></a></p>



<h3 class="wp-block-heading hLBRed" id="1-defensive-programming"><strong>1. Defensive Programming</strong></h3>



<p class="custp1">Always assume that references might be&nbsp;<strong>null</strong>&nbsp;and implement appropriate checks:</p>



<pre class="pchl"><code><span class="key">public</span> <span class="key">decimal</span> CalculateTotal(Order order)
{
    <span class="key">if</span> (order == <span class="key">null</span>)
        <span class="key">throw</span> <span class="key">new</span> ArgumentNullException(nameof(order));
    
    <span class="key">if</span> (order.Items == <span class="key">null</span>)
        <span class="key">return</span> 0;
    
    <span class="key">return</span> order.Items.Sum(item =&gt item?.Price ?? 0);
} </code></pre>



<br><br>



<h3 class="wp-block-heading hLBRed" id="2-initialize-variables-properly"><strong>2. Initialize Variables Properly</strong></h3>



<p class="custp1">Ensure all reference variables are initialized when declared:</p>



<pre class="pchl"><code><span class="key">public</span> <span class="key">class</span> ShoppingCart
{
    <span class="key">public</span> List&lt;Item&gt Items { get; set; } = <span class="key">new</span> List&lt;Item&gt(); <span class="com">// Initialize immediately</span>
    
    <span class="key">public</span> ShoppingCart()
    {
        <span class="com">// Constructor ensures proper initialization</span>
        Items = <span class="key">new</span> List&lt;Item&gt();
    }
} </code></pre>



<br><br>



<h3 class="wp-block-heading hLBRed" id="3-use-constructor-injection"><strong>3. Use Constructor Injection</strong></h3>



<p class="custp1"><strong>Dependency injection</strong>&nbsp;makes dependencies explicit and ensures they&#8217;re not&nbsp;<strong>null</strong>:</p>



<pre class="pchl"><code><span class="key">public</span> <span class="key">class</span> OrderService
{
    <span class="key">private</span> <span class="key">readonly</span> IRepository _repository;
    
    <span class="key">public</span> OrderService(IRepository repository)
    {
        _repository = repository ?? <span class="key">throw</span> <span class="key">new</span> ArgumentNullException(nameof(repository));
    }
} </code></pre>



<br><br>



<h3 class="wp-block-heading hLBRed" id="4-implement-null-object-pattern"><strong>4. Implement Null Object Pattern</strong></h3>



<p class="custp1">Create default objects instead of returning&nbsp;<strong>null</strong>:</p>



<pre class="pchl"><code><span class="key">public</span> <span class="key">class</span> NullUser : IUser
{
    <span class="key">public</span> <span class="key">string</span> Name =&gt <span class="str">"Guest"</span>;
    <span class="key">public</span> <span class="key">bool</span> IsValid =&gt false;
}

<span class="key">public</span> IUser GetUser(<span class="key">int</span> id)
{
    <span class="key">var</span> user = database.Find(id);
    <span class="key">return</span> user ?? <span class="key">new</span> NullUser(); <span class="com">// Never return null</span>
} </code></pre>



<br><br>



<h3 class="wp-block-heading hLBRed" id="5-use-guard-clauses"><strong>5. Use Guard Clauses</strong></h3>



<p class="custp1">Implement&nbsp;<strong>guard clauses</strong>&nbsp;at the beginning of methods:</p>



<pre class="pchl"><code><span class="key">public</span> <span class="key">void</span> ProcessOrder(Order order)
{
    <span class="key">if</span> (order == <span class="key">null</span>) return; <span class="com">// Early exit</span>
    <span class="key">if</span> (order.Items == <span class="key">null</span>) return;
    
    <span class="com">// Safe to proceed</span>
    <span class="key">foreach</span> (<span class="key">var</span> item <span class="key">in</span> order.Items)
    {
        ProcessItem(item);
    }
} </code></pre>



<br><br>



<h3 class="wp-block-heading hLBRed" id="6-enable-nullable-reference-types"><strong>6. Enable Nullable Reference Types</strong></h3>



<p class="custp1">Configure your project to use&nbsp;<strong>nullable reference types</strong>&nbsp;for compile-time&nbsp;<strong>null safety</strong>:</p>



<pre class="pchl"><code>&lt;PropertyGroup&gt
    &lt;Nullable&gtenable&lt;/Nullable&gt
&lt;/PropertyGroup&gt </code></pre>



<br><br>



<h3 class="wp-block-heading hLBRed" id="7-use-modern-c-features"><strong>7. Use Modern C# Features</strong></h3>



<p class="custp1">Leverage <strong>pattern matching</strong> and other modern C# features for <strong>null safety</strong>:</p>



<pre class="pchl"><code><span class="com">// Pattern matching with null checks</span>
<span class="key">if</span> (user <span class="key">is</span> { Name: not <span class="key">null</span> } validUser)
{
    Console.WriteLine(validUser.Name);
}

<span class="com">// Null-coalescing assignment (C# 8.0)</span>
name ??= <span class="str">"Default Name"</span>; </code></pre>



<br><br><br><br>



<h2 class="wp-block-heading h2Cust1" id="debugging-tools-and-techniques"><strong>Debugging Tools and Techniques</strong></h2>



<br>



<h3 class="wp-block-heading hLBRed" id="visual-studio-debugging-features"><strong>1. Visual Studio Debugging Features</strong></h3>



<p class="custp1"><strong>Visual Studio</strong>&nbsp;provides excellent tools for debugging&nbsp;<strong>null reference exceptions</strong>:<a rel="noreferrer noopener" target="_blank" href="https://learn.microsoft.com/en-us/visualstudio/debugger/debugger-feature-tour?view=vs-2022"></a></p>



<ul class="wp-block-list ol1">
<li><strong>Exception Helper</strong>&nbsp;shows detailed information about the exception</li>



<li><strong>Null Reference Analysis</strong>&nbsp;identifies which object is&nbsp;<strong>null</strong></li>



<li><strong>IntelliCode</strong>&nbsp;suggestions help prevent common&nbsp;<strong>null reference patterns</strong></li>
</ul>



<br>



<h3 class="wp-block-heading hLBRed" id="unity-specific-debugging"><strong>2. Unity-Specific Debugging</strong></h3>



<p class="custp1">For&nbsp;<strong>Unity developers</strong>, additional considerations include:<a rel="noreferrer noopener" target="_blank" href="https://docs.unity3d.com/6000.1/Documentation/Manual/null-reference-exception.html"></a></p>



<ul class="wp-block-list ol1">
<li>Use&nbsp;<strong>Unity&#8217;s Console</strong>&nbsp;to track&nbsp;<strong>null references</strong>&nbsp;in game objects</li>



<li>Leverage&nbsp;<strong>Unity&#8217;s Inspector</strong>&nbsp;to ensure component assignments</li>



<li>Implement&nbsp;<strong>null checks</strong>&nbsp;in MonoBehaviour lifecycle methods</li>
</ul>



<br>



<h3 class="wp-block-heading hLBRed" id="logging-and-monitoring"><strong>3. Logging and Monitoring</strong></h3>



<br>



<p>Implement comprehensive&nbsp;<strong>logging</strong>&nbsp;to track&nbsp;<strong>null reference issues</strong>&nbsp;in production:</p>



<pre class="pchl"><code><span class="key">public</span> User GetUser(<span class="key">int</span> id)
{
    <span class="key">try</span>
    {
        <span class="key">var</span> user = _repository.FindUser(id);
        <span class="key">if</span> (user == <span class="key">null</span>)
        {
            _logger.LogWarning($<span class="str">"User with ID {id} not found"</span>);
            <span class="key">return</span> null;
        }
        <span class="key">return</span> user;
    }
    <span class="key">catch</span> (Exception ex)
    {
        _logger.LogError(ex, $<span class="str">"Error retrieving user {id}"</span>);
        <span class="key">throw</span> ;
    }
} </code></pre>



<br><br><br><br>



<h2 class="wp-block-heading h2Cust1" id="best-practices-summary"><strong>Best Practices Summary</strong></h2>



<br>



<p>To effectively handle&nbsp;<strong>null reference exceptions</strong>, follow these&nbsp;<strong>best practices</strong>:<a rel="noreferrer noopener" target="_blank" href="https://dev.to/moh_moh701/guarding-against-null-in-c-best-practices-and-approaches-158i"></a></p>



<ol class="wp-block-list ol1">
<li><strong>Enable nullable reference types</strong>&nbsp;in new projects</li>



<li><strong>Initialize variables</strong>&nbsp;immediately when possible</li>



<li><strong>Use null-conditional operators</strong>&nbsp;(?.) for safe member access</li>



<li><strong>Implement guard clauses</strong>&nbsp;at method entry points</li>



<li><strong>Prefer exceptions over null returns</strong>&nbsp;when appropriate</li>



<li><strong>Use dependency injection</strong>&nbsp;to manage object lifecycles</li>



<li><strong>Write unit tests</strong>&nbsp;that cover null scenarios</li>



<li><strong>Document null behavior</strong>&nbsp;in method contracts</li>
</ol>



<br><br><br>



<h2 class="wp-block-heading h2Cust2" id="conclusion"><strong>Conclusion</strong></h2>



<br>



<p><strong>NullReferenceException</strong>&nbsp;may be one of the most common errors in .NET development, but it&#8217;s entirely preventable with proper techniques and awareness. By understanding what causes&nbsp;<strong>null reference errors</strong>, implementing robust&nbsp;<strong>debugging strategies</strong>, and following&nbsp;<strong>prevention best practices</strong>, you can significantly reduce these exceptions in your applications.</p>



<p>The key to mastering&nbsp;<strong>null safety</strong>&nbsp;lies in adopting a&nbsp;<strong>defensive programming mindset</strong>, leveraging modern C# features like&nbsp;<strong>nullable reference types</strong>&nbsp;and&nbsp;<strong>null-conditional operators</strong>, and implementing comprehensive&nbsp;<strong>null checking</strong>&nbsp;throughout your codebase. Remember that preventing&nbsp;<strong>null references</strong>&nbsp;is always more efficient and reliable than handling them after they occur.</p>



<p>With the techniques and strategies outlined in this guide, you&#8217;ll be well-equipped to write more robust, error-free C# applications that gracefully handle&nbsp;<strong>null scenarios</strong>&nbsp;without compromising functionality or user experience.</p>



<br><br>



<h2 class="wp-block-heading h2Cust2" id="frequently-asked-questions-faqs"><strong>Frequently Asked Questions (FAQs)</strong></h2>



<br>



<h3 class="wp-block-heading" id="what-does-object-reference-not-set-to-an-instance-of-an-object-mean"><strong>What does &#8220;Object reference not set to an instance of an object&#8221; mean?</strong></h3>



<p class="custp1">This error message indicates that you&#8217;re trying to use a reference variable that contains&nbsp;<strong>null</strong>&nbsp;instead of pointing to an actual object. The variable exists, but it doesn&#8217;t reference any object in memory.<a rel="noreferrer noopener" target="_blank" href="https://www.site24x7.com/learn/fixing-nullreferenceexception-and-argumentnullexception.html"></a></p>



<br>



<h3 class="wp-block-heading" id="how-do-i-find-which-object-is-null-in-a-method-chain"><strong>How do I find which object is null in a method chain?</strong></h3>



<p class="custp1">Break down the&nbsp;<strong>method chain</strong>&nbsp;into separate lines or use&nbsp;<strong>Visual Studio&#8217;s Null Reference Analysis</strong>&nbsp;feature. You can also use the&nbsp;<strong>null-conditional operator</strong>&nbsp;(?.) to safely navigate the chain.<a rel="noreferrer noopener" target="_blank" href="https://stackoverflow.com/questions/4660142/what-is-a-nullreferenceexception-and-how-do-i-fix-it"></a></p>



<br>



<h3 class="wp-block-heading" id="can-null-reference-exception-be-caught-and-handled"><strong>Can NullReferenceException be caught and handled?</strong></h3>



<p class="custp1">Yes, you can catch&nbsp;<strong>NullReferenceException</strong>&nbsp;using&nbsp;<strong>try-catch blocks</strong>, but this is generally not recommended as a primary solution. It&#8217;s better to prevent the exception through proper&nbsp;<strong>null checking</strong>.<a rel="noreferrer noopener" target="_blank" href="https://www.tutorialsteacher.com/articles/nullreferenceexception-in-csharp"></a></p>



<br>



<h3 class="wp-block-heading" id="whats-the-difference-between-null-conditional-operator-and-null-coalescing-operator"><strong>What&#8217;s the difference between null-conditional operator and null-coalescing operator?</strong></h3>



<p class="custp1">The&nbsp;<strong>null-conditional operator</strong>&nbsp;(?.) safely accesses members if the object is not null, while the&nbsp;<strong>null-coalescing operator</strong>&nbsp;(??) provides a default value when the object is null.<a rel="noreferrer noopener" target="_blank" href="https://www.c-sharpcorner.com/article/null-conditional-operators-in-c-sharp-simplifying-null-checks-more/"></a></p>



<br>



<h3 class="wp-block-heading" id="how-do-nullable-reference-types-help-prevent-null-reference-exception"><strong>How do nullable reference types help prevent NullReferenceException?</strong></h3>



<p class="custp1"><strong>Nullable reference types</strong>&nbsp;enable compile-time analysis that warns you about potential&nbsp;<strong>null reference issues</strong>&nbsp;before your code runs, allowing you to fix problems during development rather than at runtime.<a rel="noreferrer noopener" target="_blank" href="https://learn.microsoft.com/en-us/dotnet/csharp/nullable-references"></a></p>



<br>



<h3 class="wp-block-heading" id="should-i-use-try-catch-to-handle-all-null-reference-exception"><strong>Should I use try-catch to handle all NullReferenceException?</strong></h3>



<p class="custp1">No,&nbsp;<strong>try-catch should not be your primary strategy</strong>.&nbsp;<strong>NullReferenceException</strong>&nbsp;typically indicates a programming error that should be fixed through proper&nbsp;<strong>null checking</strong>&nbsp;and defensive programming practices.<a rel="noreferrer noopener" target="_blank" href="https://dev.to/canro91/what-nullreferenceexception-is-and-how-to-avoid-it-2o35?comments_sort=latest"></a></p>



<br>



<br>
<script src="/my-js/latesttop10post.js" type="text/javascript"></script>
<input type="hidden" id="cids" value="3,59,71">
<div id="latestPostlist"></div>
<br><br>


<figure class="wp-block-post-featured-image"><img decoding="async" width="814" height="335" src="https://www.codeindotnet.com/wp-content/uploads/2025/09/what-is-nullreferenceexception-complete-guide-fixing-preventing.jpg" class="attachment-post-thumbnail size-post-thumbnail wp-post-image" alt="What is NullReferenceException? Complete Guide to Understanding, Fixing, and Preventing Null Reference Errors in C#" style="object-fit:cover;" srcset="https://www.codeindotnet.com/wp-content/uploads/2025/09/what-is-nullreferenceexception-complete-guide-fixing-preventing.jpg 814w, https://www.codeindotnet.com/wp-content/uploads/2025/09/what-is-nullreferenceexception-complete-guide-fixing-preventing-300x123.jpg 300w, https://www.codeindotnet.com/wp-content/uploads/2025/09/what-is-nullreferenceexception-complete-guide-fixing-preventing-768x316.jpg 768w" sizes="(max-width: 814px) 100vw, 814px" /></figure>


<div class="wp-block-rank-math-toc-block toc-cust" id="rank-math-toc"><h2>Table of Contents</h2><nav><ul><li><a href="#what-is-nullreferenceexception">What is NullReferenceException?</a></li><li><a href="#how-to-fix-nullreferenceexception">How to Fix NullReferenceException</a><ul><li><a href="#step-1-identify-the-exact-location">1. Identify the Exact Location</a></li><li><a href="#step-2-use-debugging-tools">2. Use Debugging Tools</a></li><li><a href="#step-3-implement-null-checks">3. Implement Null Checks</a></li><li><a href="#step-4-use-safe-navigation-patterns">4. Use Safe Navigation Patterns</a></li><li><a href="#step-5-provide-default-values">5. Provide Default Values</a></li></ul></li><li><a href="#advanced-debugging-techniques">Advanced Debugging Techniques</a><ul><li><a href="#using-debug-assert-for-development">1. Using Debug.Assert for Development</a></li><li><a href="#exception-handling-with-try-catch">2. Exception Handling with Try-Catch</a></li><li><a href="#using-nullable-reference-types">3. Using Nullable Reference Types</a></li></ul></li><li><a href="#ways-to-prevent-nullreferenceexception">Ways to Prevent NullReferenceException</a><ul><li><a href="#1-defensive-programming">1. Defensive Programming</a></li><li><a href="#2-initialize-variables-properly">2. Initialize Variables Properly</a></li><li><a href="#3-use-constructor-injection">3. Use Constructor Injection</a></li><li><a href="#4-implement-null-object-pattern">4. Implement Null Object Pattern</a></li><li><a href="#5-use-guard-clauses">5. Use Guard Clauses</a></li><li><a href="#6-enable-nullable-reference-types">6. Enable Nullable Reference Types</a></li><li><a href="#7-use-modern-c-features">7. Use Modern C# Features</a></li></ul></li><li><a href="#debugging-tools-and-techniques">Debugging Tools and Techniques</a><ul><li><a href="#visual-studio-debugging-features">1. Visual Studio Debugging Features</a></li><li><a href="#unity-specific-debugging">2. Unity-Specific Debugging</a></li><li><a href="#logging-and-monitoring">3. Logging and Monitoring</a></li></ul></li><li><a href="#best-practices-summary">Best Practices Summary</a></li><li><a href="#conclusion">Conclusion</a></li><li><a href="#frequently-asked-questions-faqs">Frequently Asked Questions (FAQs)</a><ul><li><a href="#what-does-object-reference-not-set-to-an-instance-of-an-object-mean">What does &#8220;Object reference not set to an instance of an object&#8221; mean?</a></li><li><a href="#how-do-i-find-which-object-is-null-in-a-method-chain">How do I find which object is null in a method chain?</a></li><li><a href="#can-null-reference-exception-be-caught-and-handled">Can NullReferenceException be caught and handled?</a></li><li><a href="#whats-the-difference-between-null-conditional-operator-and-null-coalescing-operator">What&#8217;s the difference between null-conditional operator and null-coalescing operator?</a></li><li><a href="#how-do-nullable-reference-types-help-prevent-null-reference-exception">How do nullable reference types help prevent NullReferenceException?</a></li><li><a href="#should-i-use-try-catch-to-handle-all-null-reference-exception">Should I use try-catch to handle all NullReferenceException?</a></li></ul></li></ul></nav></div>
]]></content:encoded>
					
					<wfw:commentRss>https://www.codeindotnet.com/what-is-nullreferenceexception-complete-guide-fixing-preventing/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>C# DateTime Format yyyy-mm-dd</title>
		<link>https://www.codeindotnet.com/datetime-to-string-format/</link>
					<comments>https://www.codeindotnet.com/datetime-to-string-format/#respond</comments>
		
		<dc:creator><![CDATA[admin]]></dc:creator>
		<pubDate>Sun, 03 Mar 2024 05:56:10 +0000</pubDate>
				<category><![CDATA[C#]]></category>
		<category><![CDATA[dotnet]]></category>
		<guid isPermaLink="false">https://www.codeindotnet.com/?p=6644</guid>

					<description><![CDATA[Working with dates and times is a common task in programming, and C# provides a robust DateTime structure to handle these scenarios. When you need to display or manipulate DateTime values as strings, it&#8217;s essential to understand how to format them. In C#, you can achieve this through custom formatting or by using standard format [&#8230;]]]></description>
										<content:encoded><![CDATA[
<div id="PageInHoriAd1"></div>
<script>
fetch('/gads/PageInHoriAd1.txt')
	.then(response => response.text())
	.then(text => {
		document.getElementById('PageInHoriAd1').innerHTML = text;
	})
	.catch(error => {
		console.error('Error fetching manual PageInHoriAd1:', error);
	});
</script>



<br>



<p>Working with dates and times is a common task in programming, and C# provides a robust DateTime structure to handle these scenarios. When you need to display or manipulate DateTime values as strings, it&#8217;s essential to understand how to format them. In C#, you can achieve this through custom formatting or by using standard format strings.</p>



<br>



<h2 class="wp-block-heading hLBRed" id="date-time-format-examples"><strong>DateTime Format Examples:</strong></h2>



<br>
<table>
    <thead>
        <tr>
            <th>Format</th>
            <th>Result</th>
        </tr>
    </thead>
    <tbody>
		<tr>
			<td>DateTime.Now.ToString(&quot;t&quot;)</td>
			<td>4:05 PM</td>
		</tr>
		<tr>
			<td>DateTime.Now.ToString(&quot;d&quot;)</td>
			<td>3/9/2024</td>
		</tr>
		<tr>
			<td>DateTime.Now.ToString(&quot;T&quot;)</td>
			<td>4:05:07 PM</td>
		</tr>
		<tr>
			<td>DateTime.Now.ToString(&quot;D&quot;)</td>
			<td>Sunday, March 09, 2024</td>
		</tr>
		<tr>
			<td>DateTime.Now.ToString(&quot;f&quot;)</td>
			<td>Sunday, March 09, 2024 4:05 PM</td>
		</tr>
		<tr>
			<td>DateTime.Now.ToString(&quot;F&quot;)</td>
			<td>Sunday, March 09, 2024 4:05:07 PM</td>
		</tr>
		<tr>
			<td>DateTime.Now.ToString(&quot;g&quot;)</td>
			<td>3/9/2024 4:05 PM</td>
		</tr>
		<tr>
			<td>DateTime.Now.ToString(&quot;G&quot;)</td>
			<td>3/9/2024 4:05:07 PM</td>
		</tr>
		<tr>
			<td>DateTime.Now.ToString(&quot;m&quot;)</td>
			<td>March 09</td>
		</tr>
		<tr>
			<td>DateTime.Now.ToString(&quot;y&quot;)</td>
			<td>March, 2024</td>
		</tr>
		<tr>
			<td>DateTime.Now.ToString(&quot;r&quot;)</td>
			<td>Sun, 09 Mar 2024 16:05:07 GMT</td>
		</tr>
		<tr>
			<td>DateTime.Now.ToString(&quot;s&quot;)</td>
			<td>2024-03-09T16:05:07</td>
		</tr>
		<tr>
			<td>DateTime.Now.ToString(&quot;u&quot;)</td>
			<td>2024-03-09 16:05:07Z</td>
		</tr>
        <tr>
            <td>dt.ToString(&quot;MM/dd/yyyy&quot;)</td>
            <td>05/29/2024</td>
        </tr>
        <tr>
            <td>dt.ToString(&quot;dddd, dd MMMM yyyy&quot;)</td>
            <td>Friday, 29 May 2024</td>
        </tr>
        <tr>
            <td>dt.ToString(&quot;dddd, dd MMMM yyyy HH:mm&quot;)</td>
            <td>Friday, 29 May 2024 05:50</td>
        </tr>
        <tr>
            <td>dt.ToString(&quot;dddd, dd MMMM yyyy hh:mm tt&quot;)</td>
            <td>Friday, 29 May 2024 05:50 AM</td>
        </tr>
        <tr>
            <td>dt.ToString(&quot;dddd, dd MMMM yyyy H:mm&quot;)</td>
            <td>Friday, 29 May 2024 5:50</td>
        </tr>
        <tr>
            <td>dt.ToString(&quot;dddd, dd MMMM yyyy h:mm tt&quot;)</td>
            <td>Friday, 29 May 2024 5:50 AM</td>
        </tr>
        <tr>
            <td>dt.ToString(&quot;dddd, dd MMMM yyyy HH:mm:ss&quot;)</td>
            <td>Friday, 15 May 2024 06:40:02</td>
        </tr>
        <tr>
            <td>dt.ToString(&quot;MM/dd/yyyy HH:mm&quot;)</td>
            <td>05/29/2024 05:50</td>
        </tr>
        <tr>
            <td>dt.ToString(&quot;MM/dd/yyyy hh:mm tt&quot;)</td>
            <td>05/29/2024 05:50 AM</td>
        </tr>
        <tr>
            <td>dt.ToString(&quot;MM/dd/yyyy H:mm&quot;)</td>
            <td>05/29/2024 5:50</td>
        </tr>
        <tr>
            <td>dt.ToString(&quot;MM/dd/yyyy h:mm tt&quot;)</td>
            <td>05/29/2024 5:50 AM</td>
        </tr>
        <tr>
            <td>dt.ToString(&quot;MM/dd/yyyy HH:mm:ss&quot;)</td>
            <td>05/29/2024 05:50:06</td>
        </tr>
        <tr>
            <td>dt.ToString(&quot;MMMM dd&quot;)</td>
            <td>May 29</td>
        </tr>
        <tr>
            <td>dt.ToString(&quot;yyyy’-‘MM’-‘dd’T’HH’:’mm’:’ss.fffffffK&quot;)</td>
            <td>2024-05-16T05:50:06.7199222-04:00</td>
        </tr>
        <tr>
            <td>dt.ToString(&quot;ddd, dd MMM yyy HH’:’mm’:’ss ‘GMT’&quot;)</td>
            <td>Fri, 16 May 2024 05:50:06 GMT</td>
        </tr>
        <tr>
            <td>dt.ToString(&quot;yyyy’-‘MM’-‘dd’T’HH’:’mm’:’ss&quot;)</td>
            <td>2024-05-16T05:50:06</td>
        </tr>
        <tr>
            <td>dt.ToString(&quot;HH:mm&quot;)</td>
            <td>05:50</td>
        </tr>
        <tr>
            <td>dt.ToString(&quot;hh:mm tt&quot;)</td>
            <td>05:50 AM</td>
        </tr>
        <tr>
            <td>dt.ToString(&quot;H:mm&quot;)</td>
            <td>5:50</td>
        </tr>
        <tr>
            <td>dt.ToString(&quot;h:mm tt&quot;)</td>
            <td>5:50 AM</td>
        </tr>
        <tr>
            <td>dt.ToString(&quot;HH:mm:ss&quot;)</td>
            <td>05:50:06</td>
        </tr>
        <tr>
            <td>dt.ToString(&quot;yyyy MMMM&quot;)</td>
            <td>2024 May</td>
        </tr>
    </tbody>
</table>



<br><br><br>



<h2 class="wp-block-heading h2Cust1" id="c-date-time-to-string-format"><strong>C# DateTime To String Format</strong></h2>



<br><br>



<h3 class="wp-block-heading hLBRed" id="custom-date-time-formatting"><strong>Custom DateTime Formatting</strong></h3>



<p class="custp1">Custom DateTime formatting in C# allows you to specify the exact format you want for displaying dates and times. This is achieved by using format specifiers that represent different components of the DateTime structure. </p>



<p>To use custom formatting, you can call the <span class="spanHT">ToString</span> method on a DateTime object and pass the desired format string as an argument. For example:</p>



<pre class="pchl"><code>DateTime myDateTime = DateTime.Now;
string formattedDateTime = myDateTime.ToString(<span class="str">"dddd, MMMM dd, yyyy HH:mm:ss"</span>);
Console.WriteLine(formattedDateTime); 

<span class="com">//Output:</span>
<span class="com">// Wednesday, March 02, 2024 15:30:45</span>
</code></pre>



<p>In this example, the format string &#8220;dddd, MMMM dd, yyyy HH:mm:ss&#8221; represents the day of the week, full month name, day of the month, four-digit year, and time in 24-hour format.</p>



<br>
<div><b><i>other examples:</i></b></div>



<pre class="pchl"><code><span class="com"><b>// Date numbers</b></span>
DateTime.Now.ToString(<span class="str">"M/d/yyyy"</span>);            <span class="com">// "3/2/2024"</span>
DateTime.Now.ToString(<span class="str">"MM/dd/yyyy"</span>);          <span class="com">// "03/02/2024"</span>
DateTime.Now.ToString(<span class="str">"MM/dd/yy"</span>);            <span class="com">// "03/02/24"</span>


<span class="com"><b>// Date names</b></span>
DateTime.Now.ToString(<span class="str">"ddd, MMM d, yyyy"</span>);    <span class="com">// "Sat, Mar 2, 2024"</span>
DateTime.Now.ToString(<span class="str">"dddd, MMMM d, yyyy"</span>);  <span class="com">// "Saturday, March 2, 2024"</span> </code></pre>



<br><br>



<h3 class="wp-block-heading hLBRed" id="standard-date-time-formatting"><strong>Standard DateTime Formatting</strong></h3>



<p class="custp1">C# also provides standard DateTime formatting options through the <span class="spanHT">ToString</span> method. These options offer predefined formats for commonly used date and time representations. </p>



<p>To use standard formatting, you can again call the <span class="spanHT">ToString</span> method on a DateTime object and pass the desired standard format string:</p>



<pre class="pchl"><code>DateTime myDateTime = DateTime.Now;
string standardFormattedDateTime = myDateTime.ToString(<span class="str">"F"</span>);
Console.WriteLine(standardFormattedDateTime);

<span class="com">//Output:</span>
<span class="com">// Wednesday, March 02, 2024 15:30:45</span>
</code></pre>



<p>In this example, the standard format string &#8220;F&#8221; is used to represent the full date and long time pattern.</p>



<br>



<p class="hLBRed">Here are some common format specifiers:</p>



<table>
    <thead>
        <tr>
            <th>Specifier</th>
            <th>DateTimeFormatInfo property</th>
            <th>Pattern value</th>
        </tr>
    </thead>
    <tbody>
        <tr>
            <td>d</td>
            <td>Short date pattern</td>
            <td>M/d/yyyy<br>(6/15/2023)</td>
        </tr>
        <tr>
            <td>D</td>
            <td>Long date pattern</td>
            <td>dddd, MMMM dd, yyyy<br>(Monday, June 15, 2023)</td>
        </tr>
        <tr>
            <td>t</td>
            <td>Short time pattern</td>
            <td>h:mm tt<br>(1:45 PM)</td>
        </tr>
        <tr>
            <td>T</td>
            <td>Long time pattern</td>
            <td>h:mm:ss tt<br>(1:45:30 PM)</td>
        </tr>
        <tr>
            <td>f</td>
            <td>Full date and short time pattern</td>
            <td>dddd, MMMM dd, yyyy h:mm tt<br>(Monday, June 15, 2023 1:45 PM)</td>
        </tr>
        <tr>
            <td>F</td>
            <td>Full date and long time pattern</td>
            <td>dddd, MMMM dd, yyyy h:mm:ss tt<br>(Monday, June 15, 2023 1:45:30 PM)</td>
        </tr>
        <tr>
            <td>g</td>
            <td>General short date and short time pattern</td>
            <td>M/d/yyyy h:mm tt<br>(6/15/2023 1:45 PM)</td>
        </tr>
        <tr>
            <td>G</td>
            <td>General short date and long time pattern</td>
            <td>M/d/yyyy h:mm:ss tt<br>(6/15/2023 1:45:30 PM)</td>
        </tr>
        <tr>
            <td>m, M</td>
            <td>Month and day pattern</td>
            <td>MMMM dd<br>(June 15)
			</td>
        </tr>
        <tr>
            <td>y, Y</td>
            <td>Year and month pattern</td>
            <td>MMMM, yyyy<br>(June 2023)</td>
        </tr>
        <tr>
            <td><sup style="color:red; font-weight:bold;">*</sup> s</td>
            <td>Sortable date and time pattern</td>
			<td>yyyy&#8217;-&#8216;MM&#8217;-&#8216;dd&#8217;T&#8217;HH&#8217;:&#8217;mm&#8217;:&#8217;ss</td>
        </tr>
		<tr>
            <td><sup style="color:red; font-weight:bold;">*</sup> r, R</td>
            <td>RFC1123 Pattern</td>
			<td>ddd, dd MMM yyyy HH&#8217;:&#8217;mm&#8217;:&#8217;ss &#8216;GMT&#8217;</td>
        </tr>
		<tr>
            <td><sup style="color:red; font-weight:bold;">*</sup> u</td>
            <td>Universal Sortable DateTime Pattern</td>
			<td>yyyy&#8217;-&#8216;MM&#8217;-&#8216;dd HH&#8217;:&#8217;mm&#8217;:&#8217;ss&#8217;Z&#8217;</td>
        </tr>
    </tbody>
</table>



<p><sup style="color:red; font-weight:bold;">*</sup> Standard Format Specifiers in String.Format method.</p>



<br><br>



<div class="hLBRed">Format specifier list:</div>



<figure class="wp-block-image size-large"><img decoding="async" src="/img/1/datetime-format-specifier.jpg" alt="C# datetime string format specifiers"/></figure>



<div id="PageInAd1"></div>
<script>
fetch('/gads/PageInAd1.txt')
	.then(response => response.text())
	.then(text => {
		document.getElementById('PageInAd1').innerHTML = text;
	})
	.catch(error => {
		console.error('Error fetching manual PageInAd1:', error);
	});
</script>



<br>
<script src="/my-js/latesttop10post.js" type="text/javascript"></script>
<input type="hidden" id="cids" value="3,59,71">
<div id="latestPostlist"></div>
<br>



<div class="wp-block-rank-math-toc-block toc-cust" id="rank-math-toc"><h2>Table of Contents</h2><nav><ul><li><a href="#date-time-format-examples">DateTime Format Examples:</a></li><li><a href="#c-date-time-to-string-format">C# DateTime To String Format</a><ul><li><a href="#custom-date-time-formatting">Custom DateTime Formatting</a></li><li><a href="#standard-date-time-formatting">Standard DateTime Formatting</a></li></ul></li></ul></nav></div>



<br>



<p><em>Reference: <a href="https://learn.microsoft.com/en-us/dotnet/standard/base-types/custom-date-and-time-format-strings" target="_blank" rel="noopener">Microsoft.com</a></em></p>



<style>
.custUl1 {
    padding: 0 0 0 15px !important;
    line-height: 1.8;
}

td { line-height: inherit !important; }
</style>
]]></content:encoded>
					
					<wfw:commentRss>https://www.codeindotnet.com/datetime-to-string-format/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>How to Read Excel Cell Values using Open XML in C# .Net Core</title>
		<link>https://www.codeindotnet.com/read-excel-cell-value-from-openxml-net-core-c/</link>
					<comments>https://www.codeindotnet.com/read-excel-cell-value-from-openxml-net-core-c/#respond</comments>
		
		<dc:creator><![CDATA[admin]]></dc:creator>
		<pubDate>Tue, 21 Nov 2023 15:46:09 +0000</pubDate>
				<category><![CDATA[C#]]></category>
		<category><![CDATA[.Net Core]]></category>
		<category><![CDATA[Web API]]></category>
		<category><![CDATA[documentformat.openxml]]></category>
		<category><![CDATA[import excel to datatable openxml c#]]></category>
		<category><![CDATA[openxml excel c#]]></category>
		<guid isPermaLink="false">https://www.codeindotnet.com/?p=6164</guid>

					<description><![CDATA[C# .NET Core provides a robust platform for building applications that interact with Excel files making it easy to read Excel sheet&#8217;s cell value of any column type. Open XML is an open standard file format for office applications, maintained by the International Organization for Standardization (ISO). It is the default file format for Microsoft [&#8230;]]]></description>
										<content:encoded><![CDATA[
<div id="PageInHoriAd1"></div>
<script>
fetch('https://www.codeindotnet.com/gads/PageInHoriAd1.txt')
	.then(response => response.text())
	.then(text => {
		document.getElementById('PageInHoriAd1').innerHTML = text;
	})
	.catch(error => {
		console.error('Error fetching manual PageInHoriAd1:', error);
	});
</script>



<p>C# .NET Core provides a robust platform for building applications that interact with Excel files making it easy to read Excel sheet&#8217;s cell value of any column type.  Open XML is an open standard file format for office applications, maintained by the International Organization for Standardization (ISO). It is the default file format for Microsoft Office documents, including Excel (.xlsx) files. Open XML provides a structured way to represent document content, making it possible to interact with the various elements within an Office document programmatically. In this article, we will understand the process of reading Excel cell values using Open XML in a C# .NET Core application.</p>



<h2 class="wp-block-heading" id="step-by-step-guide-to-read-excel-spreadsheet-cell-values-from-open-xml-in-c">Step-by-step Guide to Read Excel Spreadsheet Cell Values from OpenXML in C# </h2>



<br>



<p>For demonstration purposes, we&#8217;re going to use a Web API to upload an Excel file. So before we begin, let&#8217;s ensure that you have a C# .NET Core project set up. Then, we&#8217;ll use the OpenXML package to read Excel sheet &amp; its values in each cell and store them in a DataTable.</p>



<br>



<h3 class="wp-block-heading hLBRed" id="install-open-xml-sdk-nuget-package"><strong>Install OpenXml SDK Nuget Package</strong></h3>



<br>



<p>Install an <a href="https://github.com/dotnet/Open-XML-SDK" target="_blank" rel="noopener"><strong>OpenXML</strong></a> Nuget Package into the Web API project, using either:</p>



<div><b><i><u>NuGet Package Manager:</u></i></b></div>



<figure class="wp-block-image size-large"><img decoding="async" src="/img/1/readexcel/documentformat-openxml-nuget-package-manager.jpg" alt=""/></figure>



<p class="custp1"><strong>Or</strong></p>



<div><b><i><u>Package Manager Console:</u></i></b></div>



<p class="has-white-color has-black-background-color has-text-color has-background"><strong><mark style="background-color:#000000" class="has-inline-color has-white-color">PM&gt;   Install-Package DocumentFormat.OpenXml -Version 3.0.0</mark></strong></p>



<br><br>



<p>After you install the package, you can include these assembly directives to use OpenXML, in the <strong>&#8216;Controller.cs&#8217;</strong> class.</p>



<div><b><i><u>Namespaces:</u></i></b></div>



<button class="c-b-s-f-r" onclick="ctc('div1',this)">Copy code</button>
<br>
<div id="div1">
<pre class="pchl"><code><span class="key">using</span> DocumentFormat.OpenXml.Packaging;
<span class="key">using</span> DocumentFormat.OpenXml.Spreadsheet;</code></pre>
</div>



<br><br><br>



<h3 class="wp-block-heading hLBRed" id="create-api-to-get-an-excel-file"><strong>Create API to get an Excel file</strong></h3>



<br>



<p>Create an HTTP POST method in the controller class to receive the uploaded file from the API.</p>



<button class="c-b-s-f-r" onclick="ctc('div2',this)">Copy code</button>
<br>
<div id="div2">
<pre class="pchl"><code>&#91;<span class="custkey">HttpPost</span>(<span class="str">"UploadExcelFile"</span>)]
<span class="key">public</span> <span class="custkey">IActionResult</span> UploadExcelSheet(<span class="custkey">IFormFile</span> uploadRegistration)
{
	<span class="key">string</span> fileName = uploadRegistration.FileName;

	<span class="custkey">DataTable</span> dt = ConvertExcelToDataTable(uploadRegistration);

	<span class="com">// write your logic,</span>
	<span class="com">// example insert DataTable result into Database</span>

	<span class="key">return</span> Ok();
}</code></pre>
</div>



<br>



<p>The API takes <span class="spanHT">IFormFile</span> as a parameter, representing a file sent with the HttpRequest. </p>



<br><br><br>



<h3 class="wp-block-heading hLBRed" id="read-data-from-excel-sheet-using-open-xml-c"><strong>Read Data from Excel Sheet using OpenXML &#8211; C#</strong></h3>



<br>



<button class="c-b-s-f-r" onclick="ctc('div3',this)">Copy code</button>
<br>
<div id="div3">
<pre class="pchl"><code><span class="key">private</span> <span class="custkey">DataTable</span> ConvertExcelToDataTable(<span class="custkey">IFormFile</span> uploadRegistration)
{
	<span class="com">//Create a new DataTable.</span>
	<span class="custkey">DataTable</span> dt = new <span class="key">DataTable</span>();
	dt.Columns.Add(<span class="str">"FIRST_NAME"</span>, <span class="key">typeof</span>(<span class="key">string</span>));
	dt.Columns.Add(<span class="str">"LAST_NAME"</span>, <span class="key">typeof</span>(<span class="key">string</span>));
	dt.Columns.Add(<span class="str">"PHONE_NUMBER"</span>, <span class="key">typeof</span>(<span class="key">int</span>));
	dt.Columns.Add(<span class="str">"EMAIL"</span>, <span class="key">typeof</span>(<span class="key">string</span>));
	dt.Columns.Add(<span class="str">"ADDRESS"</span>, <span class="key">typeof</span>(<span class="key">string</span>));

	<span class="key">using</span> (<span class="custkey">SpreadsheetDocument</span> doc = <span class="custkey">SpreadsheetDocument</span>.Open(uploadRegistration.OpenReadStream(), <span class="key">false</span>))
	{
		<span class="com">//Read the first Sheet from Excel file.</span>
		<span class="custkey">Sheet</span> sheet = doc.WorkbookPart.Workbook.Sheets.GetFirstChild&lt;<span class="custkey">Sheet</span>>();

		<span class="com">//Get the Worksheet instance.</span>
		<span class="custkey">Worksheet</span> worksheet = (doc.WorkbookPart.GetPartById(sheet.Id.Value) as <span class="custkey">WorksheetPart</span>).Worksheet;

		<span class="com">//Fetch all the rows present in the Worksheet.</span>
		<span class="custkey">IEnumerable</span>&lt;<span class="custkey">Row</span>> rows = worksheet.GetFirstChild&lt;<span class="custkey">SheetData</span>>().Descendants&lt;<span class="custkey">Row</span>>();

		<span class="com">//Loop through the Worksheet rows.</span>
		<span class="key">foreach</span> (<span class="custkey">Row</span> row in rows)
		{
			<span class="com">//If first row is header and you want to use same excel header name in Database column.</span>
			<span class="custkey">if</span> (row.RowIndex.Value == 1)
			{
				<span class="com">//foreach (Cell cell in row.Descendants&lt;Cell>())</span>
				<span class="com">//{</span>
				<span class="com">//    dt.Columns.Add(GetCellValue(doc, cell));</span>
				<span class="com">//}</span>
			}
			<span class="custkey">else</span>
			{
				<span class="key">string</span> firstName = GetCellValue(doc, (Cell)row.ElementAt(0));
				<span class="key">string</span> lastName = GetCellValue(doc, (Cell)row.ElementAt(1));

				<span class="custkey">DataRow</span> dataRow = dt.NewRow();

				<span class="com">// Validate if empty</span>
				<span class="key">if</span> (!<span class="key">string</span>.IsNullOrEmpty(firstName))
				{
					dataRow&#91;<span class="str">"FIRST_NAME"</span>] = firstName.Trim();
				}

				<span class="key">if</span> (!<span class="key">string</span>.IsNullOrEmpty(lastName))
				{
					dataRow&#91;<span class="str">"LAST_NAME"</span>] = lastName.Trim();
				}

				dataRow&#91;<span class="str">"PHONE_NUMBER"</span>] = GetCellValue(doc, (<span class="custkey">Cell</span>)row.ElementAt(2)).Trim();

				dataRow&#91;<span class="str">"EMAIL"</span>] = GetCellValue(doc, (<span class="custkey">Cell</span>)row.ElementAt(3)).Trim();

				dataRow&#91;<span class="str">"ADDRESS"</span>] = GetCellValue(doc, (<span class="custkey">Cell</span>)row.ElementAt(4)).Trim();

				dt.Rows.Add(dataRow);
			}
		}

	}

	<span class="key">return</span> dt;
}


<span class="key">private string</span> GetCellValue(<span class="custkey">SpreadsheetDocument</span> doc, <span class="custkey">Cell</span> cell)
{
	if (cell.CellValue != <span class="key">null</span>)
	{
		<span class="key">string</span> value = cell.CellValue.InnerText;
		if (cell.DataType != <span class="key">null</span> &amp;&amp; cell.DataType.Value == <span class="custkey">CellValues</span>.SharedString)
		{
			<span class="com">// in older version e.g. 2.0, you can use <span style="background:#f2f19d;">GetItem</span> instead of <span style="background:#f2f19d;">ElementAt</span></span>
			<span class="key">return</span> doc.WorkbookPart.SharedStringTablePart.SharedStringTable.ChildElements.<b>ElementAt</b>(<span class="key">int</span>.Parse(value)).InnerText;
		}
		else
		{
			<span class="key">return</span> value;
		}
	}
	<span class="key">return string</span>.Empty;
}</code></pre>
</div>



<br><div>In this code:</div>



<ol class="wp-block-list">
<li>We open the Excel file (<strong>RegistrationFormTest.xlsx</strong> in this case) using the <strong>SpreadsheetDocument.Open</strong> method.</li>



<li>We obtain the <strong>WorkbookPart </strong>and identify the first sheet in the workbook.</li>



<li>For each row in the sheet, we iterate through the cells, using the <strong>GetCellValue</strong> method to retrieve the cell value.</li>



<li>The <strong>GetCellValue</strong> method takes care of differentiating between shared string values and other types of cell values. It reads Excel Sheet cell value and stores the result in the DataTable.</li>
</ol>



<br>



<p class="brgrey"><strong><em><mark style="background-color:rgba(0, 0, 0, 0);color:#00008b" class="has-inline-color">also read:</mark></em></strong> <a href="/export-dataset-to-excel-in-c-net-core-openxml/" data-type="post" data-id="1880"><span class="cLink3"><strong>How to Export DataSet To Excel in C# .Net Core &#8211; OpenXml</strong></span></a></p>



<br><br>



<h3 class="wp-block-heading hLBRed" id="testing-upload-read-excel-file">Testing &#8211; Upload &amp; Read Excel file</h3>



<br>



<p>Let&#8217;s consider an example. I have a basic Excel file with the column and row information. Now, let&#8217;s attempt to upload and read the file using API, as shown in the screenshots below.</p>



<br>



<p class="hLBRed"><strong>Screenshots:</strong></p>



<div><b><i><u>sample excel file (RegistrationFormTest.xlsx)</u></i></b></div>



<figure class="wp-block-image size-large"><img decoding="async" src="/img/1/readexcel/excel-sample-data-to-read-from-csharp.jpg" alt=""/></figure>



<br><br><div><b><i><u>upload excel file</u></i></b></div>



<figure class="wp-block-image size-large"><img decoding="async" src="/img/1/readexcel/upload-excel-file-via-post-api.jpg" alt=""/></figure>



<br><br><div><b><i><u>get file via api</u></i></b></div>



<figure class="wp-block-image size-large"><img decoding="async" src="/img/1/readexcel/read-excel-iformfile-debug.jpg" alt=""/></figure>



<br><br><div><b><i><u>read cell value</u></i></b></div>



<figure class="wp-block-image size-large"><img decoding="async" src="/img/1/readexcel/openxml-get-cell-value-by-column-name.jpg" alt="openxml get cell value by column name"/></figure>



<br><br><div><b><i><u>output stored in Datatable</u></i></b></div>



<figure class="wp-block-image size-large"><img decoding="async" src="/img/1/readexcel/read-excel-file-datatable-result-visualizer.jpg" alt=""/></figure>



<br>



<p>In this example, we demonstrate how to read Excel spreadsheet cell values and add results to the DataTable. However, you also have the option to save all records to a database. This can be done either through bulk insert or by saving each row individually, passing the values of each row via the property object.</p>



<br>



<div class="note">
<div style="color:#00008b; font-weight:bold; border-bottom:0.125rem #00008b solid; font-style:italic;">Download &#038; Try Yourself:</div>
<div class="notepoints" style="padding-top:0.375rem">Read Excel File, .Net Core Web API <b>Source code</b> (<b>VS 2022</b>) &#8211; <a href="/img/1/readexcel/ReadExcel.zip"><span class="cLink3"><b>Download</b></span></a></div>
<div class="notepoints">Sample Excel File (RegistrationFormTest.xlsx) &#8211; <a href="/img/1/readexcel/RegistrationFormTest.xlsx"><span class="cLink3"><b>Download</b></span></a></div>
</div>



<div id="PageInAd1"></div>
<script>
fetch('https://www.codeindotnet.com/gads/PageInAd1.txt')
	.then(response => response.text())
	.then(text => {
		document.getElementById('PageInAd1').innerHTML = text;
	})
	.catch(error => {
		console.error('Error fetching manual PageInAd1:', error);
	});
</script>



<br>
<script src="/my-js/latesttop10post.js" type="text/javascript"></script>
<input type="hidden" id="cids" value="3,59,71">
<div id="latestPostlist"></div>
<br>



<br>



<div class="wp-block-rank-math-toc-block toc-cust" id="rank-math-toc"><h2>Table of Contents</h2><nav><ul><li><a href="#step-by-step-guide-to-read-excel-spreadsheet-cell-values-from-open-xml-in-c">Step-by-step Guide to Read Excel Spreadsheet Cell Values from OpenXML in C# </a><ul><li><a href="#install-open-xml-sdk-nuget-package">Install OpenXml SDK Nuget Package</a></li><li><a href="#create-api-to-get-an-excel-file">Create API to get an Excel file</a></li><li><a href="#read-data-from-excel-sheet-using-open-xml-c">Read Data from Excel Sheet using OpenXML &#8211; C#</a></li><li><a href="#testing-upload-read-excel-file">Testing &#8211; Upload &amp; Read Excel file</a></li></ul></li></ul></nav></div>
]]></content:encoded>
					
					<wfw:commentRss>https://www.codeindotnet.com/read-excel-cell-value-from-openxml-net-core-c/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>WordPress Custom Rest API &#8211; Adding Endpoints</title>
		<link>https://www.codeindotnet.com/wordpress-custom-rest-api-plugin-endpoints/</link>
					<comments>https://www.codeindotnet.com/wordpress-custom-rest-api-plugin-endpoints/#respond</comments>
		
		<dc:creator><![CDATA[admin]]></dc:creator>
		<pubDate>Tue, 07 Nov 2023 15:19:07 +0000</pubDate>
				<category><![CDATA[WordPress]]></category>
		<category><![CDATA[Web API]]></category>
		<category><![CDATA[wordpress api get posts]]></category>
		<category><![CDATA[wordpress web api endpoint integration]]></category>
		<category><![CDATA[wordpress wp rest api json plugin]]></category>
		<guid isPermaLink="false">https://www.codeindotnet.com/?p=5832</guid>

					<description><![CDATA[Adding WordPress Custom Rest API Plugin Sometimes you prefer to create a custom Rest API in PHP within the context of WordPress to return data in a structured format such as JSON which involves setting up custom routes. Here&#8217;s a step-by-step guide to creating &#38; integrating a basic WordPress Custom REST API in a WordPress [&#8230;]]]></description>
										<content:encoded><![CDATA[
<div id="PageInHoriAd1"></div>
<script>
fetch('https://www.codeindotnet.com/gads/PageInHoriAd1.txt')
	.then(response => response.text())
	.then(text => {
		document.getElementById('PageInHoriAd1').innerHTML = text;
	})
	.catch(error => {
		console.error('Error fetching manual PageInHoriAd1:', error);
	});
</script>



<br>



<h2 class="wp-block-heading h2Cust1" id="adding-word-press-custom-rest-api-plugin"><strong>Adding WordPress <strong>Custom </strong>Rest API Plugin</strong></h2>



<p class="custp1">Sometimes you prefer to create a custom Rest API in PHP within the context of WordPress to return data in a structured format such as JSON which involves setting up custom routes. Here&#8217;s a step-by-step guide to creating &amp; integrating a basic WordPress Custom REST API in a WordPress plugin.</p>



<br>



<div class="wp-block-rank-math-toc-block toc-cust" id="rank-math-toc"><h2>Table of Contents</h2><nav><ul><li><a href="#set-up-a-word-press-plugin">Set up a WordPress Plugin</a></li><li><a href="#define-wp-api-route">Define WP API Route:</a></li><li><a href="#create-api-callback-function">Create API Callback Function</a></li><li><a href="#test-your-api-endpoint">Test Your API Endpoint</a><ul><li><a href="#how-to-find-wp-api-endpoints-or-ur-ls">How to find WP API endpoints or URLs?</a></li><li><a href="#test-wp-web-api-get-method">Test WP Web API &#8211; Get Method()</a></li></ul></li><li><a href="#calling-word-press-custom-rest-api-from-javascript">Calling WordPress Custom Rest API from Javascript</a></li></ul></nav></div>



<br><br><br>



<h2 class="wp-block-heading hLBRed" id="set-up-a-word-press-plugin"><strong>Set up a WordPress Plugin</strong></h2>



<br>



<p>Go to &#8216;wp-content/plugins&#8217; directory of your WordPress and create a PHP file (e.g., CustomApi.php) to serve as a <strong>main plugin file</strong>. </p>



<div><b><i><u>cpanel &#8211; File Manger:</u></i></b></div>



<figure class="wp-block-image size-large"><img decoding="async" src="/img/wp/api/custom-wordpress-rest-api-cpanel-folder.jpg" alt="custom wordpress rest api plugin php file"/></figure>



<p>In this example, the plugin folder and PHP file <em>names</em> are the same. You can rename it.</p>



<p>You can follow simple 3 steps to create and activate a Custom Plugin in the WordPress Dashboard in a few minutes, check this link &#8211; <a href="https://www.codeindotnet.com/create-wordpress-custom-plugin-in-3-steps/" target="_blank" rel="noreferrer noopener"><span class="cLink3"><b>How to Create Custom WordPress Plugin: 3 Easy Steps</b></span></a>.</p>



<br>



<div class="note2">
<div style="color:#00008b; font-weight:bold; border-bottom:0.125rem #00008b solid; font-style:italic;">Note:</div>
<div style="padding-top:0.4375rem">You can use the function.php file but it&#8217;s best practice to use a separate Plugin for Custom API.</div>
</div>



<br><br><br>



<h2 class="wp-block-heading hLBRed" id="define-wp-api-route"><strong>Define WP API Route</strong>:</h2>



<br>



<p>In your plugin file, use the <span class="spanHT">add_action</span> function to hook into WordPress and register your custom API route. Here&#8217;s an example of how to add an API route:</p>



<div><b><i><u>.php file:</u></i></b></div>



<pre class="pchl"><code><span class="key">function</span> registe_api_routes() {
    <b>register_rest_route</b>('<span class="str">PublicAPIs/v1</span>', '<span class="str">/GetTop10Items'</span>,
						<span class="key">array</span>('<span class="str">methods</span>' =&gt; '<span class="str">GET</span>', '<span class="str">callback</span>' =&gt; '<span class="str">CallFun_GetTop10Items</span>',)
						);
}

<b>add_action</b>('<span class="str">rest_api_init</span>', '<span class="str">registe_api_routes</span>');

</code></pre>



<br><br>



<div><b><i><u>Parameter Description:</u></i></b></div>



<figure class="wp-block-table"><table><thead><tr><th>Parameters</th><th>Inputs</th></tr></thead><tbody><tr><td>Namespace</td><td>PublicAPIs/v1</td></tr><tr><td>Endpoint</td><td>GetTop10Items (Public URL)<br>https://yourdomain.com/wp-json/PublicAPIs/v1/GetTop10Items</td></tr><tr><td>Method</td><td>Get method</td></tr><tr><td>callback function name</td><td>CallFun_GetTop10Items<br>(Internal method that executes and sends back responses)</td></tr></tbody></table></figure>



<br><br><br>



<h2 class="wp-block-heading hLBRed" id="create-api-callback-function"><strong>Create API Callback Function</strong></h2>



<br>



<p>Define the callback function you specified in the <span class="spanHT">register_rest_route</span> for your API route. This function will handle the request and return the data you want to show via the API.</p>



<p class="custp1">In our example, whenever public API is called by an external source then the below code will be executed internally. </p>



<div><b><i><u>.php file:</u></i></b></div>



<pre class="pchl"><code><span class="key">function</span> CallFun_GetTop10Items() {
	<span class="com">// Your API logic here</span>
	<span class="com">// Example:</span>
	$args =  <span class="key">array</span>('showposts' =&gt; 10, 'orderby' =&gt; 'post_date', 'order' =&gt; 'DESC','post_status' =&gt; 'publish');

	$query_result = query_posts($args);

	$postList = [];

	<span class="key">foreach</span> ($query_result as $result) {
	  $postList[] = array( "post_title" =&gt; $result-&gt;post_title, "post_name" =&gt; $result-&gt;post_name);
	}

	<span class="key">return</span> $postList;
	<span class="com">// or</span>
	<span class="com">// return new WP_REST_Response($postList, 200);</span>
}</code></pre>



<br><br><div><b><i><u>.php code file &#8211; screenshots:</u></i></b></div>



<br><div><b><i><u>Method 1:</u></i></b></div>



<figure class="wp-block-image size-large"><img decoding="async" src="/img/wp/api/cpanel-php-editor-register-wordpress-rest-route.jpg" alt="create wordpress rest api callback function and register routes"/></figure>



<br><div>You can write the same code in a shorter way.</div>



<div><b><i><u>Method 2:</u></i></b></div>



<figure class="wp-block-image size-large"><img decoding="async" src="/img/wp/api/cpanel-php-editor-register-wordpress-rest-route-2.jpg" alt="create wordpress rest api callback function and register routes method 2"/></figure>



<br><br><br>



<h2 class="wp-block-heading hLBRed" id="test-your-api-endpoint"><strong>Test Your API Endpoint</strong></h2>



<br>



<p>You can now access your API endpoint and check if it is working as accepted.</p>



<br>



<h3 class="wp-block-heading" id="how-to-find-wp-api-endpoints-or-ur-ls"><strong>How to find WP API endpoints or URLs?</strong></h3>



<ul class="wp-block-list">
<li>Open the browser and open the <strong>Inspect </strong>element developer tool as well. (press f12 or right-click &amp; click Inspect)</li>



<li>Go to <strong>https://yourdomain.com/wp-json/</strong> to get wp-json list. </li>



<li>Once it is loaded, navigate and go to <strong>routes</strong></li>



<li>expand and go to the path (namespace/endpoint) that is defined in <span class="spanHT">register_rest_route</span> method, that is &#8216;<strong>PublicAPIs/v1/GetTop10Items</strong>&#8216;</li>



<li>Get the API (full URL) as shown in the below screenshot. <br><em><strong>example:</strong></em> https://yourdomain.com/wp-json/PublicAPIs/v1/GetTop10Items</li>
</ul>



<br>



<figure class="wp-block-image size-large"><img decoding="async" src="/img/wp/api/find-wordpress-api-list-wp-json.jpg" alt="find wp rest api list wp-json"/></figure>



<br><br>



<h3 class="wp-block-heading" id="test-wp-web-api-get-method"><strong>Test WP Web API &#8211; Get Method()</strong></h3>



<p class="custp1">Get API can be executed directly on the browser but for demo purposes, we will use the Postman tool to test our API.</p>



<p>The below screenshot demonstrates that a Get API request sends back a response as a JSON result via Postman tool.</p>



<p><strong><em>Test API:</em></strong> https://yourdomain.com/wp-json/PublicAPIs/v1/GetTop10Items</p>



<div><b><i><u>wordpress api get posts:</u></i></b></div>



<figure class="wp-block-image size-large"><img decoding="async" src="/img/wp/api/wordpress-rest-api-response-result.jpg" alt="wordpress rest api response result"/></figure>



<br><br><br>



<h2 class="wp-block-heading hLBRed" id="calling-word-press-custom-rest-api-from-javascript"><strong>Calling WordPress Custom Rest API from Javascript</strong></h2>



<br>



<p>You can use the <span class="spanHT">fetch</span> method in Javascript to call and get the response from the WordPress Custom Rest API, as demonstrated below.</p>



<pre class="pchl"><code>&lt;script>

document.addEventListener("DOMContentLoaded", LoadLatestPosts);

<span class="key">async function</span> LoadLatestPosts() {

	<span class="key">const</span> response = <span class="key">await</span> fetch('<span class="str" style="background:#fafbbb;">/wp-json/PublicAPIs/v1/GetTop10Items</span>');
	<span class="key">const</span> data = <span class="key">await</span> response.json();

	data.<span class="key">forEach</span>(obj => {
		// your logic
	});

}

&lt;/script></code></pre>



<br><div class="note2">
<div style="color:#00008b; font-weight:bold; border-bottom:0.125rem #00008b solid; font-style:italic;">Note:</div>
<div style="padding-top:0.375rem">You might get an error if the full URL is given with the domain name, so specify the internal URL in the fetch method as mentioned in the code.</div>
</div>



<div id="PageInAd1"></div>
<script>
fetch('https://www.codeindotnet.com/gads/PageInAd1.txt')
	.then(response => response.text())
	.then(text => {
		document.getElementById('PageInAd1').innerHTML = text;
	})
	.catch(error => {
		console.error('Error fetching manual PageInAd1:', error);
	});
</script>



<br>
<script src="/my-js/latesttop10post.js" type="text/javascript"></script>
<input type="hidden" id="cids" value="3,59,71">
<div id="latestPostlist"></div>
<br><br>



<p>for more details check this link: <a href="https://developer.wordpress.org/rest-api/extending-the-rest-api/adding-custom-endpoints/" target="_blank" rel="noopener"><strong>https://developer.wordpress.org/rest-api/extending-the-rest-api/adding-custom-endpoints/</strong></a></p>



<style>
.toc-cust{
border:1px solid #add8e6;
padding-top: 15px;
padding-left:15px;
}
.toc-cust h2{
font-weight:bold;
font-size: 1.5rem;
color:#ba3925e3;
}
</style>
]]></content:encoded>
					
					<wfw:commentRss>https://www.codeindotnet.com/wordpress-custom-rest-api-plugin-endpoints/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>[C#] calendar invite/appointment as email attachment (.net)</title>
		<link>https://www.codeindotnet.com/send-calendar-invite-appointment-attachment/</link>
					<comments>https://www.codeindotnet.com/send-calendar-invite-appointment-attachment/#respond</comments>
		
		<dc:creator><![CDATA[admin]]></dc:creator>
		<pubDate>Mon, 21 Aug 2023 05:09:52 +0000</pubDate>
				<category><![CDATA[C#]]></category>
		<category><![CDATA[.Net Core]]></category>
		<category><![CDATA[calendar invite .ics attachment C#]]></category>
		<category><![CDATA[calendar meeting request via C# code]]></category>
		<guid isPermaLink="false">https://www.codeindotnet.com/?p=4517</guid>

					<description><![CDATA[Create Calendar Invite Content &#8211; C# code 1) Just &#8220;copy &#38; paste&#8221; the below code and modify &#8211; Start &#38; End meeting datetime, meeting link/ location, body content, subject text, sender &#38; attendee email ids. Copy code StringBuilder strInvite = new StringBuilder(); strInvite.AppendLine("BEGIN:VCALENDAR"); strInvite.AppendLine("PRODID:-//Microsoft Corporation//Outlook 12.0 MIMEDIR//EN"); strInvite.AppendLine("VERSION:2.0"); strInvite.AppendLine(string.Format("METHOD:{0}", (isCancel ? "CANCEL" : "REQUEST"))); strInvite.AppendLine("METHOD:REQUEST"); [&#8230;]]]></description>
										<content:encoded><![CDATA[
<br>



<h2 class="wp-block-heading"><strong>Create Calendar Invite Content &#8211; C# code</strong></h2>



<br>



<p>1) Just &#8220;copy &amp; paste&#8221; the below code and modify &#8211; Start &amp; End meeting datetime, meeting link/ location, body content, subject text, sender &amp; attendee email ids.</p>



<button class="c-b-s-f-r" onclick="ctc('div1',this)">Copy code</button>
<br>
<div id="div1">
<pre class="pchl"><code>
<span class="key">StringBuilder</span> <span style="background:#f2f19d;">strInvite</span> = new <span class="key">StringBuilder</span>();

strInvite.AppendLine(<span class="str">"BEGIN:VCALENDAR"</span>);
strInvite.AppendLine(<span class="str">"PRODID:-//Microsoft Corporation//Outlook 12.0 MIMEDIR//EN"</span>);
strInvite.AppendLine(<span class="str">"VERSION:2.0"</span>);
strInvite.AppendLine(<span class="key">string</span>.Format("METHOD:{0}", (isCancel ? "CANCEL" : "REQUEST")));
strInvite.AppendLine(<span class="str">"METHOD:REQUEST"</span>);
strInvite.AppendLine(<span class="str">"BEGIN:VEVENT"</span>);

strInvite.AppendLine(<span class="key">string</span>.Format("CREATED:{0:yyyyMMddTHHmmssZ}", DateTime.Now.ToUniversalTime()));

<span class="com">// Meeting Start DateTime</span>
strInvite.AppendLine(<span class="key">string</span>.Format("DTSTART:{0}", <span class="custkey">DateTime</span>.Now.ToUniversalTime().ToString(<span class="str">"yyyyMMddTHHmmssZ"</span>)));

strInvite.AppendLine(<span class="key">string</span>.Format("DTSTAMP:{0:yyyyMMddTHHmmss}", DateTime.Now.ToUniversalTime()));

<span class="com">// Meeting End DateTime</span>
strInvite.AppendLine(<span class="key">string</span>.Format("DTEND:{0:}", <span class="custkey">DateTime</span>.Now.AddHours(1).ToUniversalTime().ToString(<span class="str">"yyyyMMddTHHmmssZ"</span>)));

strInvite.AppendLine(<span class="key">string</span>.Format("LAST-MODIFIED:{0:yyyyMMddTHHmmssZ}", DateTime.Now.ToUniversalTime()));

<span class="com">// web meeting link</span>
strInvite.AppendLine(<span class="key">string</span>.Format("LOCATION: {0}", eventUrlLink));
//or
//strInvite.AppendLine(<span class="key">string</span>.Format("LOCATION: {0}", eventLocationLink));

strInvite.AppendLine("PRIORITY: 5");
strInvite.AppendLine("SEQUENCE: 0");

strInvite.AppendLine(<span class="key">string</span>.Format("UID:{0}", (eventID.HasValue ? "EventId" + eventID : Guid.NewGuid().To<span class="key">string</span>())));

<span class="com">// meeting realted message body content</span>
strInvite.AppendLine(<span class="key">string</span>.Format("DESCRIPTION:{0}", strMessageBody.Replace("\n", "<br>")));
strInvite.AppendLine(<span class="key">string</span>.Format("X-ALT-DESC;FMTTYPE=text/html:{0}", strMessageBody.Replace("\n", "<br>")));

<span class="com">// meeging subject text</span>
strInvite.AppendLine(<span class="key">string</span>.Format("SUMMARY:{0}", subjectText));
strInvite.AppendLine("STATUS:CONFIRMED"); 

<span class="com">// sender email id</span>
strInvite.AppendLine(<span class="key">string</span>.Format("ORGANIZER;CN={0}:MAILTO:{1}", strMailFrom, strMailFrom));

<span class="com">// attendee email ids for meeting</span>
strInvite.AppendLine(<span class="key">string</span>.Format("ATTENDEE;CN={0};RSVP=TRUE:mailto:{1}", <span class="key">string</span>.Join(",", strAttendeeMailTo), <span class="key">string</span>.Join(",", strAttendeeMailTo)));

strInvite.AppendLine("BEGIN:VALARM");
strInvite.AppendLine("TRIGGER:-PT15M");
strInvite.AppendLine("ACTION:DISPLAY");
strInvite.AppendLine("DESCRIPTION:Reminder");
strInvite.AppendLine("END:VALARM");
strInvite.AppendLine("END:VEVENT");
strInvite.AppendLine("END:VCALENDAR");
</code></pre>
</div>



<br><br>



<h2 class="wp-block-heading"><strong>2) Attach created Calendar invite to mail as <strong>(.ics) attachment</strong></strong></h2>



<button class="c-b-s-f-r" onclick="ctc('div2',this)">Copy code</button>
<br>
<div id="div2">
<pre class="pchl"><code>
<span class="com">// create instance of MailMessage object</span>
<span class="custkey">MailMessage</span> mailMessage = <span class="key">new</span> <span class="custkey">MailMessage</span>
{
	<span class="com">// fill normal mail body content</span>
	From = <span class="key">new</span> <span class="custkey">MailAddress</span>(strMailFrom, strSenderName),
	Subject = strSubject,
	Body = strBodyContent,
	IsBodyHtml = <span class="key">true</span>
};

<span class="com">// attach meeting request calendar invite .ics file</span>
<span class="key">byte</span>[] byteArray = <span class="custkey">Encoding</span>.ASCII.GetBytes(<span style="background:#f2f19d;">strInvite</span>);
<span class="custkey">MemoryStream</span> stream = <span class="key">new</span> <span class="custkey">MemoryStream</span>(byteArray);
<span class="custkey">Attachment</span> attach = <span class="key">new</span> <span class="custkey">Attachment</span>(stream, <span class="str">"event-meeting.<b>ics</b>"</span>);
mailMessage.Attachments.Add(attach);

<span class="com">// send mail</span>
<span class="custkey">SmtpClient</span> smtpClient = <span class="key">new</span> <span class="custkey">SmtpClient</span>
{
	<span class="com">// your credentials</span>
};

smtpClient.Send(mailMessage);

</code></pre>
</div>



<br>



<div class="note">
<div style="padding-top:0.375rem"> Looking for <b>full code</b>? Check this link &#8211; <a class="cLink" href="https://www.codeindotnet.com/send-email-attachment-footer-meeting-invite/" target="_blank" rel="noreferrer noopener nofollow"><strong>Sending email with file attachment, image as footer &amp; calendar invite attachment</strong></a></div>
</div>



<br>



<div><b><i><u>output:</u></i></b></div>



<figure class="wp-block-image size-full"><img decoding="async" width="369" height="412" src="https://www.codeindotnet.com/wp-content/uploads/2023/08/calendar-invite-appointment-ics-file.jpg" alt="calendar invite appointment .ics file C#" class="wp-image-4564" srcset="https://www.codeindotnet.com/wp-content/uploads/2023/08/calendar-invite-appointment-ics-file.jpg 369w, https://www.codeindotnet.com/wp-content/uploads/2023/08/calendar-invite-appointment-ics-file-269x300.jpg 269w" sizes="(max-width: 369px) 100vw, 369px" /></figure>



<br>
]]></content:encoded>
					
					<wfw:commentRss>https://www.codeindotnet.com/send-calendar-invite-appointment-attachment/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>[C#] Send email with attachment, footer &#038; calendar invite (.net)</title>
		<link>https://www.codeindotnet.com/send-email-attachment-footer-meeting-invite/</link>
					<comments>https://www.codeindotnet.com/send-email-attachment-footer-meeting-invite/#comments</comments>
		
		<dc:creator><![CDATA[admin]]></dc:creator>
		<pubDate>Sun, 20 Aug 2023 15:27:51 +0000</pubDate>
				<category><![CDATA[C#]]></category>
		<category><![CDATA[.Net Core]]></category>
		<category><![CDATA[adding calendar invite via C# code]]></category>
		<category><![CDATA[embed inline image in email .net]]></category>
		<category><![CDATA[gmail file attachment with using C# code]]></category>
		<category><![CDATA[smtp.gmail.com dot net core C#]]></category>
		<guid isPermaLink="false">https://www.codeindotnet.com/?p=3539</guid>

					<description><![CDATA[Sending emails with attachments is a common task in many applications, whether it&#8217;s for sharing documents, images, or other files with recipients. In this article, we will explore how to send an email with a file attachment including inserting an image as a footer after the HTML body content, as well as creating a meeting [&#8230;]]]></description>
										<content:encoded><![CDATA[
<div>
<script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8982643024325578"
     crossorigin="anonymous"></script>
<!-- PageInHoriAd1 -->
<ins class="adsbygoogle"
     style="width:728px;height:90px"
     data-ad-client="ca-pub-8982643024325578"
     data-ad-slot="5888630892"></ins>
<script>
     (adsbygoogle = window.adsbygoogle || []).push({});
</script>
</div>



<br>



<p>Sending emails with attachments is a common task in many applications, whether it&#8217;s for sharing documents, images, or other files with recipients. In this article, we will explore <strong>how to send an email with a file attachment</strong> including inserting an <strong>image as a footer</strong> after the HTML body content, as well as <strong>creating a meeting invitation through &#8216;.ICS&#8217; file attachment</strong> <strong>using C# code</strong>, making use of the built-in .NET framework classes.</p>



<p>The below screenshot shows a sample output generated through C# code which covers all the methods &amp; logic required for sending an email via the SMTP server.</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="574" height="488" src="https://www.codeindotnet.com/wp-content/uploads/2023/08/successful-sending-mail-received-sample-.net-code-C.jpg" alt="send smtp email with attachment using C# code in dotnet core" class="wp-image-4368" srcset="https://www.codeindotnet.com/wp-content/uploads/2023/08/successful-sending-mail-received-sample-.net-code-C.jpg 574w, https://www.codeindotnet.com/wp-content/uploads/2023/08/successful-sending-mail-received-sample-.net-code-C-300x255.jpg 300w" sizes="auto, (max-width: 574px) 100vw, 574px" /></figure>



<br><br>



<h2 class="wp-block-heading" id="for-sending-emails-we-need"><strong>For sending emails, we need:</strong></h2>



<ul class="wp-block-list">
<li>Email settings (SMTP server, port number, sender email credentials, recipient email addresses).</li>



<li>HTML Message/ body content.</li>



<li>File for Attachment.</li>



<li>File (Image) for adding logo in the footer section (using <a href="https://learn.microsoft.com/en-us/dotnet/api/system.net.mail.linkedresource?view=net-7.0" target="_blank" rel="noopener">LinkedResource</a> &amp; <a href="https://learn.microsoft.com/en-us/dotnet/api/system.net.mail.alternateview?view=net-7.0" target="_blank" rel="noopener">AlternateView</a> Classes).</li>



<li>Calendar invitations (.ics) file for a meeting request or Calendar invite. (Calendar Appointment As Email Attachment)</li>
</ul>



<br>



<p>Let&#8217;s start implementing sending-email functionality in the .Net project using <a href="https://www.codeindotnet.com/c-version-history-and-features/">C#</a> code, step-by-step.</p>



<br><br>



<h2 class="wp-block-heading" id="set-up-your-project"><strong>Set Up Your Project</strong></h2>



<br>



<p>First, create a new C# application project in your preferred development environment. </p>



<p>For demo purposes, we will implement this code in the Web API project. The folder and file structure of the solution project is shown below.</p>



<figure class="wp-block-image size-large"><img decoding="async" src="/img/1/sendmail/send-mail-dotnet-core-project-solution.jpg" alt=""/></figure>



<br><br><br>



<h2 class="wp-block-heading" id="configuring-email-settings"><strong>Configuring Email Settings</strong></h2>



<br>



<p>To send an email, you need a valid SMTP (Simple Mail Transfer Protocol) server address, a valid email address for the sender, and the recipient&#8217;s email address. </p>



<p>We will use Gmail as SMTP server in our example. Ensure you have access to this basic information before proceeding.   </p>



<pre class="pchl"><code>1) smtp server = <span class="str">"smtp.gmail.com"</span>;
2) port = 587; <span class="com">// Change if your SMTP server uses a different port</span>
3) sender email e.g., <span class="str">"sender_email@gmail.com"</span>;
4) sender app password e.g., <span class="str">"sender_app_password"</span>;
5) recipient email e.g., <span class="str">"recipient@outlook.com"</span>; </code></pre>



<br>



<div class="note">
<div style="color:#00008b; font-weight:bold; border-bottom:0.125rem #00008b solid; font-style:italic;">Important &#8211; Configure Google Security:</div>
<div style="padding-top:0.375rem"> Before proceeding further, please go to your google account and enable <b>2-Step Verification</b> &amp; generate an <b>app password</b> for authentication purpose as well as to establish a secure connection via code.<br>Check this link &#8211; <a class="cLink" href="https://www.codeindotnet.com/gmail-smtp-server-authentication-failed-response-code-5-7-0/#3-enable-2-step-verification-set-app-passwords-gmail-security" target="_blank" rel="noopener"><strong>How to enable 2-Step verification &amp; set app passwords in your Google account.</strong></a></div>
</div>
<br>



<div class="noteimpwar">
<div style="color:#dc2323; font-weight:bold; border-bottom:0.125rem #dc2323 solid; font-style:italic;">Note:</div>
<div style="padding-left:0.375rem; padding-top:0.375rem"> Gmail Authentication is required for sending emails. Make sure you have enabled SSL security in your Gmail Settings so that application(code) can access your mailbox.<br>If the connection is not established through a secure channel (<b>2-Step Verification</b>) then you will get an authentication failed error message &#8211; &#8220;<i>The SMTP server requires a secure connection or the client was not authenticated. The server response was: 5.5.1 Authentication Required</i>.&#8221;</div>
<br>
<div><center><img decoding="async" src="/img/1/sendmail/smtp-server-requires-a-secure-connection-or-the-client-was-not-authenticated.jpg" alt="SMTP server requires a secure connection or the client was not authenticated"/></center></div>
</div>



<br><br><br>



<h2 class="wp-block-heading" id="sending-email-with-content-attachments-calendar-invite-c-code"><strong>Sending Email With Content, Attachments &amp; calendar invite &#8211; C# code </strong></h2>



<br>



<p>Next, we&#8217;ll create separate classes and methods that send an email with attachments. In this example, we&#8217;ll send a simple text email with a single attachment, footer logo image &amp; meeting request(.ics file) but you can customize it to suit your needs.</p>



<br>



<h2 class="wp-block-heading" id="step-1-create-get-set-email-property-class"><strong>Step 1: Create {get set} email property class</strong></h2>



<br>



<p>Create a property class (<strong>MailTemplateProperty.cs</strong>) that will serve and get all the essential details for sending an email, such as the SMTP server address, valid email addresses for both the sender and recipient, as well as any attachments such as files, footers, and calendar invite/appointment information.</p>



<button class="c-b-s-f-r" onclick="ctc('div3',this)">Copy code</button>
<br>
<div id="div3">
<pre class="pchl"><code><span class="key">public</span> <span class="key">class</span> MailTemplateProperty
{
	<span class="com">// <b>"SMTP Configuration/Credential"</b></span>
	<span class="key">public</span> <span class="key">string</span> SmtpClientHost { get; set; }
	<span class="key">public</span> <span class="key">int</span> SmtpClientPort { get; set; }
	<span class="key">public</span> <span class="key">bool</span> SmtpClientEnableSSL { get; set; }
	<span class="key">public</span> <span class="key">string</span> CredentialUserName { get; set; }
	<span class="key">public</span> <span class="key">string</span> CredentialPass { get; set; }

	<span class="com">// <b>"Compose Email"</b></span>
	<span class="key">public</span> <span class="key">string</span> SenderName { get; set; }
	<span class="key">public</span> <span class="key">string</span> MailFrom { get; set; }
	<span class="key">public</span> <span class="key">string</span> MailTo { get; set; }
	<span class="key">public</span> <span class="key">string</span> MailCC { get; set; }
	<span class="key">public</span> <span class="key">string</span> Subject { get; set; }
	<span class="key">public</span> <span class="key">string</span> Body { get; set; }


	<span class="com">/* <b>===== Optional Setting ===== */</b></span>

	<span class="com">// <b>"File attachments"</b></span>
	<span class="key">public</span> <span class="custkey">Attachment</span> Attachment { get; set; } = null;

	<span class="com">// <b>"Adding logo/image on footer"</b></span>
	<span class="key">public</span> <span class="key">string</span> Footer { get; set; } = null;

	<span class="com">// <b>Attach Calendar or meeting properties</b></span>
	<span class="key">public</span> <span class="key">string</span> StartDateTime { get; set; }
	<span class="key">public</span> <span class="key">string</span> EndDateTime { get; set; }
	<span class="key">public</span> <span class="key">string</span> EventLink { get; set; }
	<span class="key">public</span> <span class="key">string</span> EventLocation { get; set; }
	<span class="key">public</span> <span class="key">string</span> Attendee { get; set; }
} 
</code></pre>
</div>



<br><br>



<h2 class="wp-block-heading" id="step-2-create-a-class-methods-to-send-mail"><strong>Step 2: Create a Class &amp; methods to send mail</strong></h2>



<br>



<p>It is a good practice to keep all email-sending related functionalities in a separate Class. We create a class called &#8216;<strong>Mail.cs</strong>&#8216; with a function called &#8216;<strong>Send()</strong>&#8216; inside. This function sends an email using the details you provide.</p>



<p>We need to implement all mail-related logic and code implementation in this class, such as:</p>



<h3 class="wp-block-heading" id="a-file-attachment"><strong>a) File attachment</strong></h3>



<p>Use the <a href="https://learn.microsoft.com/en-us/dotnet/api/system.net.mail.attachment?view=net-7.0" target="_blank" rel="noopener">Attachment</a> Class from &#8216;System.Net.Mail&#8217; Namespace. In this example, the code shows that you can pass a file as a parameter either by passing &#8216;file as MemoryStream with the name&#8217; or mentioning the full physical path &amp; name of the file. </p>



<h3 class="wp-block-heading" id="b-attaching-logo-image-as-footer-note-inline"><strong>b) Attaching Logo Image as footer note(inline)</strong></h3>



<p>We need to use LinkedResource &amp; AlternateView Classes in the mail code to display embedded image(s) in the footer section. How to work with Alternate view &#8211; To add an alternate view to a MailMessage object, create an Attachment for the view, and then add it to the collection returned by AlternateViews. Use the Body property to specify the text version and use the AlternateViews collection to specify views with other MIME types.</p>



<h3 class="wp-block-heading" id="c-calendar-appointment-as-email-attachment-ics"><strong>c) Calendar Appointment As Email Attachment (.ics)</strong></h3>



<p>Calendar invitation or &#8216;. ics&#8217; file is a calendar file saved in a universal calendar format used by several email and calendar programs, including Google Calendar, Microsoft Outlook, and Apple Calendar. It allows adding a calendar link in an email message and users to share the event information on the web and over email which will alert/ remind recipients prior to scheduled meeting time.</p>



<h3 class="wp-block-heading" id="d-common-logic"><strong>d) <span style="text-decoration: underline;">Common logic</span></strong></h3>



<ul class="wp-block-list">
<li>accepting mail body (plain text or HTML as string) and subject text</li>



<li>Getting mandatory credential info so that mail can be sent without any failure </li>
</ul>



<p>All of these functionalities &amp; logic have been incorporated in the code provided below. </p>



<br><br>



<p><span><span style="font-weight: bold; font-style: italic; text-decoration: underline;">Mail.cs &#8211; full code</span></span> &#8211; just copy &amp; paste</p>



<p>Ensure you have added the necessary namespace for email functionality.</p>



<button class="c-b-s-f-r" onclick="ctc('div1',this)">Copy code</button>
<br>
<div id="div1">
<pre class="pchl"><code><span class="key">using</span> System.Net;
<span class="key">using</span> System.Net.Mail;
<span class="key">using</span> System.Net.Mime;
<span class="key">using</span> System.Text; </code></pre>
</div>



<br>



<div>Code implementation.</div>



<button class="c-b-s-f-r" onclick="ctc('div4',this)">Copy code</button>
<br>
<div id="div4"><pre class="pchl"><code><span class="key">public</span> <span class="key">class</span> Mail
{
	<h3 style="padding-left:25px;"><span style="color:#19ad19;"><b>// Main method for sending mail</b></span></h3>	<span class="key">public</span> <span class="key">static</span> <span class="key">bool</span> Send(MailTemplateProperty mailTemplate)
	{
		<span class="key">string</span> meetingMessageBody = mailTemplate.Body;

		mailTemplate.MailFrom = mailTemplate.MailFrom.Trim(',').Trim(';');

		<span class="key">if</span> (string.IsNullOrEmpty(mailTemplate.MailFrom))
			<span class="key">return</span> false;
		<span class="key">try</span>
		{
			<span class="custkey">MailMessage</span> mailMessage = <span class="key">new</span> <span class="custkey">MailMessage</span>
			{
				From = <span class="key">new</span> <span class="custkey">MailAddress</span>(mailTemplate.MailFrom,
								string.IsNullOrEmpty(mailTemplate.SenderName) ? mailTemplate.MailFrom : mailTemplate.SenderName),
				Subject = mailTemplate.Subject,
				Body = mailTemplate.Body,
				IsBodyHtml = <span class="key">true</span>
			};

			<h3 style="padding-left:25px;"><span style="color:#19ad19;"><b>// Adding File Attachment</b></span></h3>
			<span class="key">if</span> (<span class="key">null</span> != mailTemplate.Attachment)
				mailMessage.Attachments.Add(mailTemplate.Attachment);

<h3 style="padding-left:25px;"><span style="color:#19ad19;"><b>// Adding To &amp; CC email addresses, </b></span></h3>
			mailTemplate.MailTo = mailTemplate.MailTo.Trim();
			mailMessage.To.Add(mailTemplate.MailTo);
			<span class="key">if</span> (!string.IsNullOrEmpty(mailTemplate.MailCC) &amp;&amp; mailTemplate.MailCC.Length &gt; 0)
				mailMessage.CC.Add(mailTemplate.MailCC);

<h3 style="padding-left:25px;"><span style="color:#19ad19;"><b>// Adding logo-Image as Footer</b></span></h3>
			<span class="key">if</span> (mailTemplate.Footer != <span class="key">null</span>)
			{
				<span class="custkey">LinkedResource</span> res = <span class="key">new</span> <span class="custkey">LinkedResource</span>(mailTemplate.Footer)
				{
					ContentId = Guid.NewGuid().ToString()
				};
				mailTemplate.Body += @<span class="str">"&lt;img src='cid:"</span> + res.ContentId + @<span class="str">"'/&gt;"</span>;
				<span class="custkey">AlternateView</span> avHtml = <span class="custkey">AlternateView</span>.CreateAlternateViewFromString(mailTemplate.Body, <span class="key">null</span>, <span class="custkey">MediaTypeNames</span>.<span class="custkey">Text</span>.Html);
				avHtml.LinkedResources.Add(res);
				mailMessage.AlternateViews.Add(avHtml);
			}

<h3 style="padding-left:25px;"><span style="color:#19ad19;"><b>// Adding Meeting Request</b></span></h3>
			<span class="key">byte</span>[] byteArray = <span class="custkey">Encoding</span>.ASCII.GetBytes(MeetingRequestString(mailTemplate.Subject, meetingMessageBody, mailTemplate));
			<span class="custkey">MemoryStream</span> stream = <span class="key">new</span> <span class="custkey">MemoryStream</span>(byteArray);
			<span class="custkey">Attachment</span> attach = <span class="key">new</span> <span class="custkey">Attachment</span>(stream, <span class="str">"event-meeting.ics"</span>);
			mailMessage.Attachments.Add(attach);

<h3 style="padding-left:25px;"><span style="color:#19ad19;"><b>// Finally, sending mail via Gmail, SMTP client info with credentials.</b></span></h3>
			<span class="custkey">SmtpClient</span> smtpClient = <span class="key">new</span> <span class="custkey">SmtpClient</span>
			{
				Host = mailTemplate.SmtpClientHost,
				Port = mailTemplate.SmtpClientPort,
				EnableSsl = mailTemplate.SmtpClientEnableSSL,
				Credentials = <span class="key">new</span> <span class="custkey">NetworkCredential</span>(mailTemplate.CredentialUserName, mailTemplate.CredentialPass),
			};

<h3 style="padding-left:25px;"><span style="color:#19ad19;"><b>// Send mail by SMTP.</b></span></h3>
			smtpClient.Send(mailMessage);

			<span class="key">return</span> true;
		}
		<span class="key">catch</span> (SmtpFailedRecipientException ex)
		{
			<span class="com">// LogError(ex.ToString());</span>
			<span class="key">return</span> false;
			<span class="com">//throw new Exception();</span>
		}
		<span class="key">catch</span> (SmtpException ex)
		{
			<span class="com">// LogError(ex.ToString());</span>
			<span class="key">return</span> false;
			<span class="com">//throw new Exception();</span>
		}
		<span class="key">catch</span> (Exception ex)
		{
			<span class="com">// LogError(ex.ToString());</span>
			<span class="key">return</span> false;
			<span class="com">//throw new Exception();</span>
		}
	}


<h3 style="padding-left:25px;"><span style="color:#19ad19;"><b>// Email Meeting Request- ics meeting/ Calendar invite Code</b></span></h3><h3 style="padding-left:25px;"><span style="color:#19ad19;"><b>// Attaching calendar appointment</b></span></h3>
	<span class="key">private</span> <span class="key">static</span> <span class="key">string</span> MeetingRequestString(<span class="key">string</span> subject, <span class="key">string</span> messageBody, MailTemplateProperty mailTemplate, int? eventID = <span class="key">null</span>, <span class="key">bool</span> isCancel = <span class="key">false</span>)
	{
		StringBuilder str = <span class="key">new</span> StringBuilder();

		str.AppendLine(<span class="str">"BEGIN:VCALENDAR"</span>);
		str.AppendLine(<span class="str">"PRODID:-//Microsoft Corporation//Outlook 12.0 MIMEDIR//EN"</span>);
		str.AppendLine(<span class="str">"VERSION:2.0"</span>);
		str.AppendLine(string.Format(<span class="str">"METHOD:{0}"</span>, (isCancel ? <span class="str">"CANCEL"</span> : <span class="str">"REQUEST"</span>)));
		str.AppendLine(<span class="str">"METHOD:REQUEST"</span>);
		str.AppendLine(<span class="str">"BEGIN:VEVENT"</span>);

		str.AppendLine(string.Format(<span class="str">"CREATED:{0:yyyyMMddTHHmmssZ}"</span>, DateTime.Now.ToUniversalTime()));

		<span class="com">// Date format - yyyyMMddTHHmmssZ</span>
		str.AppendLine(string.Format(<span class="str">"DTSTART:{0}"</span>, mailTemplate.StartDateTime));
		str.AppendLine(string.Format(<span class="str">"DTSTAMP:{0:yyyyMMddTHHmmss}"</span>, DateTime.Now.ToUniversalTime()));
		str.AppendLine(string.Format(<span class="str">"DTEND:{0:}"</span>, mailTemplate.EndDateTime));

		str.AppendLine(string.Format(<span class="str">"LAST-MODIFIED:{0:yyyyMMddTHHmmssZ}"</span>, DateTime.Now.ToUniversalTime()));

		<span class="com">// web meeting link</span>
		str.AppendLine(string.Format(<span class="str">"LOCATION: {0}"</span>, mailTemplate.EventLink));
		<span class="com">//or</span>
		<span class="com">//str.AppendLine(string.Format("LOCATION: {0}", mailTemplate.EventLocation));</span>

		str.AppendLine(<span class="str">"PRIORITY: 5"</span>);
		str.AppendLine(<span class="str">"SEQUENCE: 0"</span>);

		str.AppendLine(string.Format(<span class="str">"UID:{0}"</span>, (eventID.HasValue ? <span class="str">"EventId"</span> + eventID : Guid.NewGuid().ToString())));
		str.AppendLine(string.Format(<span class="str">"DESCRIPTION:{0}"</span>, messageBody.Replace(<span class="str">"\n"</span>, <span class="str">"&lt;br&gt;"</span>)));
		str.AppendLine(string.Format(<span class="str">"X-ALT-DESC;FMTTYPE=text/html:{0}"</span>, messageBody.Replace(<span class="str">"\n"</span>, <span class="str">"&lt;br&gt;"</span>)));
		str.AppendLine(string.Format(<span class="str">"SUMMARY:{0}"</span>, subject));
		str.AppendLine(<span class="str">"STATUS:CONFIRMED"</span>); 
		str.AppendLine(string.Format(<span class="str">"ORGANIZER;CN={0}:MAILTO:{1}"</span>, mailTemplate.MailFrom, mailTemplate.MailFrom));
		str.AppendLine(string.Format(<span class="str">"ATTENDEE;CN={0};RSVP=TRUE:mailto:{1}"</span>, string.Join(<span class="str">","</span>, mailTemplate.Attendee), string.Join(<span class="str">","</span>, mailTemplate.Attendee)));

		str.AppendLine(<span class="str">"BEGIN:VALARM"</span>);
		str.AppendLine(<span class="str">"TRIGGER:-PT15M"</span>);
		str.AppendLine(<span class="str">"ACTION:DISPLAY"</span>);
		str.AppendLine(<span class="str">"DESCRIPTION:Reminder"</span>);
		str.AppendLine(<span class="str">"END:VALARM"</span>);
		str.AppendLine(<span class="str">"END:VEVENT"</span>);
		str.AppendLine(<span class="str">"END:VCALENDAR"</span>);

		<span class="key">return</span> str.ToString();
	}
} 
</code></pre>
</div>



<br>



<div class="note">
<div style="color:#00008b; font-weight:bold; border-bottom:0.125rem #00008b solid; font-style:italic;">Note:</div>
<div style="padding-top:0.375rem; padding-left:1.25rem"> In this example, code will return a true (bool) value if mail is sent successfully else a false value in case of any exception(failure). You can log errors or implement other logic in the catch{} section or modify method behaviour as per your need.</div>
</div>



<br><br>



<h2 class="wp-block-heading" id="step-3-call-execute-mail-send-method"><strong>Step 3: Call &amp; execute Mail.Send() Method</strong></h2>



<br>



<p>Common C# code for sending email via SMTP is completed. Now we can call &amp; execute this Mail.Send() method from <strong>Controller (SendEmails.cs)</strong> or another code page in two steps: </p>



<h3 class="wp-block-heading" id="a-set-all-property-values"><strong>a) Set all Property values</strong></h3>



<p>Before calling the Mail.Send() method, set all necessary property values (get all input &amp; assign its values), see the sample below.</p>



<button class="c-b-s-f-r" onclick="ctc('div5',this)">Copy code</button>
<br>
<div id="div5"><pre class="pchl"><code><span class="custkey">MailTemplateProperty</span> mailTemplate = <span class="key">new</span> <span class="custkey">MailTemplateProperty</span>
{
	<span class="com">// <b>"Gmail SMTP Configuration/Credential"</b></span>
	SmtpClientHost = <span class="str">"smtp.gmail.com"</span>,
	SmtpClientPort = 587,
	SmtpClientEnableSSL = <span class="key">true</span>,
	CredentialUserName = <span class="str">"sender_emailId@example.com"</span>,
	CredentialPass = <span class="str">"google_app_password"</span>,

	<span class="com">// <b>"Compose Email"</b></span>
	SenderName = <span class="str">"Admin"</span>,
	MailFrom = <span class="str">"sender_emailId@gmail.com"</span>,
	MailTo = <span class="str">"recipient_emailId@outlook.com"</span>,
	MailCC = string.Empty,
	Subject = <span class="str">"Next Team Meeting"</span>,
	Body = <span class="str">"This is a test mail from admin.",</span>

	<span class="com">// <b>"File attachments"</b></span>
	<span class="com">//Attachment = new System.Net.Mail.Attachment(mailAttachmentFile.OpenReadStream(), "Meeging.pdf"),</span>
	<span class="com">// or</span>
	Attachment = <span class="key">new</span> System.Net.Mail.<span class="custkey">Attachment</span>(<span class="custkey">Path</span>.GetDirectoryName(<span class="custkey">Assembly</span>.GetEntryAssembly().Location) + <span class="str">"/Files/Meeting.pdf"</span>),

	<span class="com">// <b>"Adding logo/image on footer"</b></span>
	Footer = <span class="custkey">Path</span>.GetDirectoryName(<span class="custkey">Assembly</span>.GetEntryAssembly().Location) + <span class="str">"/Images/MailFooterLogo.png"</span>,

	<span class="com">// <b>Attach Calendar or meeting properties</b></span>
	StartDateTime = <span class="custkey">DateTime</span>.Now.ToUniversalTime().ToString(<span class="str">"yyyyMMddTHHmmssZ"</span>),
	EndDateTime = <span class="custkey">DateTime</span>.Now.AddHours(1).ToUniversalTime().ToString(<span class="str">"yyyyMMddTHHmmssZ"</span>),
	<span class="com">// MS Teams or Skype or webex meeting link</span>
	EventLink = <span class="str">"https://www.webex.com/test-meeting.html"</span>,
	EventLocation = <span class="str">"Online"</span>,
	Attendee = <span class="str">"recipient_emailId@outlook.com"</span>
};

</code></pre>
</div>



<br>



<h3 class="wp-block-heading" id="b-finally-call-mail-send-method"><strong>b) Finally, Call Mail.Send() Method</strong></h3>



<p>Now, call Mail.Send() method by passing &#8216;<strong>mailTemplate</strong>&#8216; object as a parameter.</p>



<button class="c-b-s-f-r" onclick="ctc('div6',this)">Copy code</button>
<br>
<div id="div6"><pre class="pchl"><code>
<span class="key">Mail</span>.Send(<b>mailTemplate</b>); 

</code></pre>
</div>



<br>



<p>That&#8217;s it, test the code. if sending mail is successful then the recipient(s) will receive the email in a few seconds. In case of failure, it will return false status as a bool value.<br>But you can also log an error or throw an exception based on your requirement.</p>



<br>



<div style="font-size:20px;"><b>Screenshots</b></div><br>



<p><strong><em><span style="text-decoration: underline;">Method 1:</span></em></strong></p>



<p>You can get the file attachment from Azure blob storage but in this example, the <strong>Meeting.pdf</strong> file is attached from the Root folder, see the below screenshot.</p>



<figure class="wp-block-image size-large"><img decoding="async" src="/img/1/sendmail/send-mail-attachment-controller-class.jpg" alt="send mail attachment from solution root folder"/></figure>



<br><br>



<p><strong><em><span style="text-decoration: underline;">Method 2:</span></em></strong></p>



<p>You can use <span class="spanHT">IFormFile</span> to receive a file as input from the front-end application and send it as an attachment, please see the implementation in the screenshot.</p>



<figure class="wp-block-image size-large"><img decoding="async" src="/img/1/sendmail/upload-and-send-mail-attachment-controller-class.jpg" alt=""/></figure>



<br><br>



<p class="brgrey" id="download-source-code"><a href="/img/1/sendmail/SendEmailWithAttachmentFooterCalendarInvite.zip"><span class="cLink3"><strong>Download Source Code</strong></span></a> and try it yourself (open sample project using Visual Studio 2022)</p>



<div>
<script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8982643024325578"
     crossorigin="anonymous"></script>
<!-- PageInAd1 -->
<ins class="adsbygoogle"
     style="display:block"
     data-ad-client="ca-pub-8982643024325578"
     data-ad-slot="3814999883"
     data-ad-format="auto"
     data-full-width-responsive="true"></ins>
<script>
     (adsbygoogle = window.adsbygoogle || []).push({});
</script>
</div>



<br><br>



<div style="padding: 0.625rem 1.25rem 1.25rem 1.25rem; box-shadow: 0.0625rem 0.0625rem 0.9375rem 0rem lightgrey; margin-bottom: 1.25rem; border-radius: 0.625rem;">
	<div><span style="border-bottom: 0.0625rem solid #cd5c5c; color:#cd5c5c;"><b><i>popular readings:</i></b></span>
		<div style="padding-left:0.9375rem; padding-top:0.625rem; line-height: 1.9;">
			<div><b>&#8211; <a href="https://www.codeindotnet.com/install-cloudflare-free-ssl-certificate-on-godaddy/">Configure free Cloudflare SSL certificate for Godaddy Shared Webhosting</a></b></div><div><b>&#8211; <a href="https://www.codeindotnet.com/create-wordpress-custom-plugin-in-3-steps/">How to Create Custom WordPress Plugin: 3 Easy Steps</a></b></div><div><b>&#8211; <a href="https://www.codeindotnet.com/how-to-create-mime-types-class-in-c-net-core/">How to Create MIME Types Custom Class in C#</a></b></div><div><b>&#8211; <a href="https://www.codeindotnet.com/extract-images-from-pdf-using-itext7-c-net/">How to extract images from PDF using iText7 in [C#] .Net</a></b></div><div><b>&#8211; <a href="https://www.codeindotnet.com/wordpress-rest-api-c-wordpresspcl-example/">Easy Integration of WordPress API in C# .Net</a></b></div><div><b>&#8211; <a href="https://www.codeindotnet.com/find-sitemap-website-url-link-is-exists-valid-c-dot-net-core/">Check SiteMaps XML URL Nodes for broken links C#</a></b></div><div><b>&#8211; <a href="https://www.codeindotnet.com/csharp-keywords-reserved-contextual/">C# Keywords (Reserved and Contextual)</a></b></div><div><b>&#8211; <a href="https://www.codeindotnet.com/what-is-dapper-micro-orm-in-c/">What is Dapper micro-ORM in C#?</a></b></div><div><b>&#8211; <a href="https://www.codeindotnet.com/c-version-history-and-features/">C# Version History and features</a></b></div>
<div><b>&#8211; <a href="https://www.codeindotnet.com/how-to-integrate-mailchimp-v3-0-api-in-dotnet-core-c/">How to Integrate MailChimp v3.0 API in DotNet Core C#</a></b></div>

		</div>
	</div>
</div>



<br>



<div class="wp-block-rank-math-toc-block toc-cust" id="rank-math-toc"><h2>Table of Contents</h2><nav><ul><li><a href="#for-sending-emails-we-need">For sending emails, we need:</a></li><li><a href="#set-up-your-project">Set Up Your Project</a></li><li><a href="#configuring-email-settings">Configuring Email Settings</a></li><li><a href="#sending-email-with-content-attachments-calendar-invite-c-code">Sending Email With Content, Attachments &amp; calendar invite &#8211; C# code </a></li><li><a href="#step-1-create-get-set-email-property-class">Step 1: Create {get set} email property class</a></li><li><a href="#step-2-create-a-class-methods-to-send-mail">Step 2: Create a Class &amp; methods to send mail</a><ul><li><a href="#a-file-attachment">a) File attachment</a></li><li><a href="#b-attaching-logo-image-as-footer-note-inline">b) Attaching Logo Image as footer note(inline)</a></li><li><a href="#c-calendar-appointment-as-email-attachment-ics">c) Calendar Appointment As Email Attachment (.ics)</a></li><li><a href="#d-common-logic">d) Common logic</a></li></ul></li><li><a href="#step-3-call-execute-mail-send-method">Step 3: Call &amp; execute Mail.Send() Method</a><ul><li><a href="#a-set-all-property-values">a) Set all Property values</a></li><li><a href="#b-finally-call-mail-send-method">b) Finally, Call Mail.Send() Method</a></li></ul></li></ul></nav></div>
]]></content:encoded>
					
					<wfw:commentRss>https://www.codeindotnet.com/send-email-attachment-footer-meeting-invite/feed/</wfw:commentRss>
			<slash:comments>6</slash:comments>
		
		
			</item>
		<item>
		<title>How to Create Custom WordPress Plugin: 3 Easy Steps</title>
		<link>https://www.codeindotnet.com/create-wordpress-custom-plugin-in-3-steps/</link>
					<comments>https://www.codeindotnet.com/create-wordpress-custom-plugin-in-3-steps/#comments</comments>
		
		<dc:creator><![CDATA[admin]]></dc:creator>
		<pubDate>Tue, 02 May 2023 08:57:00 +0000</pubDate>
				<category><![CDATA[WordPress]]></category>
		<category><![CDATA[plugin]]></category>
		<guid isPermaLink="false">https://www.codeindotnet.com/?p=3575</guid>

					<description><![CDATA[A custom plugin is an alternative method of storing functions for your website. WordPress is so popular because of its open-source content management system (CMS) and there are over millions of plugins widely available but we will see how to create plugin in WordPress with examples and adding custom codes instead of using a function.php [&#8230;]]]></description>
										<content:encoded><![CDATA[
<br>



<p>A custom plugin is an alternative method of storing functions for your website. WordPress is so popular because of its open-source content management system (CMS) and there are over millions of plugins widely available but we will see how to create plugin in WordPress with examples and adding custom codes instead of using a function.php file</p>



<br>



<div class="wp-block-rank-math-toc-block toc-cust ul1"><h2><span style="text-decoration: underline;">Table of Contents</span></h2><nav><ul><li class=""><a href="#reason-to-avoid-function-php-file">Reason to avoid function.php file</a></li><li class=""><a href="#how-to-create-a-word-press-plugin-in-3-steps">How to Create a WordPress Plugin (In 3 Steps)</a><ul><li class=""><a href="#step-1-create-the-plugin-file">Step 1: Create the Plugin File</a></li><li class=""><a href="#step-2-install-custom-plugin-into-word-press">Step 2: Install Custom Plugin into WordPress</a></li><li class=""><a href="#step-3-edit-plugin-add-code">Step 3: Edit Plugin &amp; Add Code</a></li></ul></li></ul></nav></div>



<br><br>



<h2 class="wp-block-heading" id="reason-to-avoid-function-php-file"><strong>Reason to avoid function.php file</strong></h2>



<br>



<p>You can also include additional code in the theme’s functions.php file but whenever there is a theme update or switching to a different theme in the future, you will lose these changes(additional codes). And every time you must back up your custom codes whenever there is a theme update. </p>



<p>To avoid such a problem, you can create your own plugin and use custom code in that. <strong>Benefit </strong>&#8211; The theme update won&#8217;t affect the plugin code.</p>



<p>Now, we will see how to create plugin in PHP (text file) and add it in WordPress. </p>



<br><br>



<h2 class="wp-block-heading" id="how-to-create-a-word-press-plugin-in-3-steps"><strong>How to Create a WordPress Plugin (In 3 Steps)</strong></h2>



<br>



<p>Recommendation &#8211; It is best practice to create a new Plugin in the local environment first and after successful testing deploy it in the live environment. </p>



<p>Let’s look at how to create a plugin for a website from scratch in 3 steps</p>



<br>



<h3 class="wp-block-heading" id="step-1-create-the-plugin-file"><strong>Step 1: Create the Plugin File</strong></h3>



<br>



<p>Open a new Notepad or text file.</p>



<p>Provide basic information for a new plugin, mentioned below:</p>



<figure class="wp-block-table is-style-regular"><table><tbody><tr><td>Plugin Name</td><td>any name, e.g., MyPlugin</td></tr><tr><td>Plugin URI</td><td>give your URL, e.g., https://google.com/</td></tr><tr><td>Description</td><td>Short note</td></tr><tr><td>Version</td><td>any number, e.g., 1</td></tr><tr><td>Author</td><td>any name</td></tr></tbody></table></figure>



<br>



<p>Copy &amp; paste the below code into the notepad. Code should start with <span class="spanHT">&lt;?php</span></p>



<pre class="wp-block-code"><code>&lt;?php
/*
Plugin Name: <strong>MyPlugin</strong>
Plugin URI: https://google.com/
Description: My custom functions
Version: 1
Author: Myself
*/
</code></pre>



<p>Save the file, example &#8211; <strong>MyPlugin.php</strong>. </p>



<br>



<div><b><i>Screenshot</i></b></div>



<figure class="wp-block-image size-large"><img decoding="async" src="https://www.codeindotnet.com/img/wp/create_custom_plugin_wordpress.jpg" alt="create custom plugin wordpress"/></figure>



<br><br>



<div>
Next, <strong><span style="text-decoration: underline;">zip the php file</span></strong> (MyPlugin.php)
<br>
<div style="padding-left:10px">
<strong>&#8211;</strong> right-click on file <br><strong>&#8211;</strong> go to &#8216;<strong>Send to</strong>&#8216; <br><strong>&#8211;</strong> click on <strong>Compressed (zipped) folder</strong>.
</div>
</div>



<br><br><div><b><i>Screenshot</i></b></div>



<figure class="wp-block-image size-large"><img decoding="async" src="https://www.codeindotnet.com/img/wp/zip-custom_plugin_php_file.jpg" alt="zip custom plugin php file"/></figure>



<br><br>



<h3 class="wp-block-heading" id="step-2-install-custom-plugin-into-word-press"><strong>Step 2: Install Custom Plugin into WordPress</strong></h3>



<br>



<p>1. Go to WordPress admin (https://www.yoursite.com/wp-admin)</p>



<p>2. go to &#8211; <strong>Plugin </strong>&gt;&gt; <strong>Add New</strong></p>



<p>3. Click on &#8216;<strong>Upload Plugin</strong>&#8216;</p>



<p>4. &#8216;<strong>Choose file</strong>&#8216; and upload the zip file (MyPlugin.zip) </p>



<p>5. Click on &#8216;<strong>Install Now</strong>&#8216;</p>



<p>6. After successful Installation, click on &#8216;<strong>Activate Plugin</strong>&#8216;</p>



<p>Click on <strong>Plugins</strong>, you can see the newly created custom Plugin with the description as shown in the below screenshot. </p>



<figure class="wp-block-image size-large"><img decoding="async" src="https://www.codeindotnet.com/img/wp/custom_plugin_screenshot.jpg" alt="custom plugin screenshot"/></figure>



<br><br>



<h3 class="wp-block-heading" id="step-3-edit-plugin-add-code"><strong>Step 3: Edit <strong>Plugin</strong> &amp; Add Code</strong></h3>



<br>



<p>Next, go to <strong>Plugin</strong> &gt;&gt; <strong>Plugin File Editor</strong> </p>



<p>On the top-right,  select the custom plugin &#8216;<strong>MyPlugin</strong>&#8216; from the dropdown and click the &#8216;<strong>Select</strong>&#8216; button.</p>



<figure class="wp-block-image size-large"><img decoding="async" src="https://www.codeindotnet.com/img/wp/edit_custom_plugin_wordpress.jpg" alt="edit_custom_plugin_wordpress"/></figure>



<br>



<p>Write your php code in the editor and click on &#8216;<strong>Update</strong> <strong>File</strong>&#8216; </p>



<p>That&#8217;s it, test your code if it is working as expected.</p>



<br><br>



<div style="padding: 0.625rem 1.25rem 1.25rem 1.25rem; box-shadow: 0.0625rem 0.0625rem 0.9375rem 0rem lightgrey; margin-bottom: 1.25rem; border-radius: 0.625rem;">
<div><span style="border-bottom: 0.0625rem solid #cd5c5c; color:#cd5c5c;"><b><i>read also:</i></b></span>
<div style="padding-left:0.9375rem; padding-top:0.625rem; line-height: 1.9;">
<div><b>– <a href="https://www.codeindotnet.com/extract-images-from-pdf-using-itext7-c-net/">How to extract images from PDF using iText7 in C# .Net Code</a></b></div>
<div><b>– <a href="https://www.codeindotnet.com/what-is-dapper-micro-orm-in-c/">What is Dapper micro-ORM in C#?</a></b></div>
<div><b>– <a href="https://www.codeindotnet.com/how-to-integrate-mailchimp-v3-0-api-in-dotnet-core-c/">How to Integrate MailChimp v3.0 API in DotNet Core C#</a></b></div>
<div><b>– <a href="https://www.codeindotnet.com/export-dataset-to-excel-in-c-net-core-openxml/">Export DataSet To Excel in C# .Net Core – OpenXml</a></b></div>
<div><b>– <a href="https://www.codeindotnet.com/dynamically-add-anchor-tag-in-div-html-javascript/">Dynamically generate anchor tag in div HTML  javascript</a></b></div>
<div><b>– <a href="https://www.codeindotnet.com/wordpress-rest-api-c-wordpresspcl-example/">Easy Integration of WordPress API in C# .Net</a></b></div>
<div><b>– <a href="https://www.codeindotnet.com/find-sitemap-website-url-link-is-exists-valid-c-dot-net-core/">Check SiteMaps XML URL Nodes for broken links C#</a></b></div>
<div><b>– <a href="https://www.codeindotnet.com/insert-tab-white-spaces-in-text-html-css-code/">Insert tab spaces characters in text – HTML CSS</a></b></div>
<div><b>– <a href="https://www.codeindotnet.com/create-image-tag-after-countdown-timer-finishes-javascript/">Display an Image tag after countdown timer finishes JavaScript</a></b></div>
<div><b>– <a href="https://www.codeindotnet.com/how-to-use-dynamic-parameters-in-dapper-2-0-in-c-net-core/">How To Use Dynamic Parameters In Dapper 2.0 In C# .Net Core?</a></b></div>
<div><b>– <a href="https://www.codeindotnet.com/what-is-api-application-programming-interface/">What is an API – Application Programming Interface</a></b></div>
<div><b>– <a href="https://www.codeindotnet.com/sonarlint-code-clean-up-for-ms-visual-studio-cyclomatic-complexity-explained/">SonarLint Code Clean-up for MS Visual Studio &amp; Cyclomatic Complexity Explained</a></b></div>
</div>
</div>
</div>



<p>Reference: <a href="https://wordpress.org/documentation/article/plugins-editor-screen/" target="_blank" rel="noopener">WordPress</a></p>



<p></p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.codeindotnet.com/create-wordpress-custom-plugin-in-3-steps/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
			</item>
		<item>
		<title>How to Create MIME Types Custom Class in C#</title>
		<link>https://www.codeindotnet.com/how-to-create-mime-types-class-in-c-net-core/</link>
					<comments>https://www.codeindotnet.com/how-to-create-mime-types-class-in-c-net-core/#respond</comments>
		
		<dc:creator><![CDATA[admin]]></dc:creator>
		<pubDate>Sat, 08 Apr 2023 14:21:09 +0000</pubDate>
				<category><![CDATA[C#]]></category>
		<guid isPermaLink="false">https://www.codeindotnet.com/?p=3458</guid>

					<description><![CDATA[This post explains, how to create a custom class and methods to get MIME type by file name or extension and vice-versa. MediaTypeNames class is also available that exists in System.Net.Mime namespace but the listed mime types or extensions are very limited. But I have mentioned more than 1300 MIME Types in the mapping list. [&#8230;]]]></description>
										<content:encoded><![CDATA[
<br>



<p>This post explains, how to create a custom class and methods to get MIME type by file name or extension and vice-versa. MediaTypeNames class is also available that exists in System.Net.Mime namespace but the listed mime types or extensions are very limited. But I have mentioned more than 1300 MIME Types in the mapping list.</p>



<h2 class="h2Cust1"><strong>Steps to Create Mime Type Custom Class</strong></h2>



<ul class="wp-block-list">
<li>Create a Static class called MimeType (.cs file)</li>



<li>give a unique name for the namespace as well.</li>



<li>declare a read-only dictionary field that contains the list of all MIME types.</li>



<li>Create two public static methods:
<ul class="wp-block-list">
<li>1) GetMimeType(): to get MIME type by file name or extension</li>



<li>2) GetExtension(): to get file extension by mime type</li>
</ul>
</li>
</ul>



<br>



<h2 class="h2Cust1"><strong>Mime Type Class &#8211; full C# code</strong></h2>



<p>Simply copy &amp; paste the entire code in MimeType.cs file, given below. </p>



<div><b><i><span style="border-bottom:0.1875rem solid #ba3925;">code usage &amp; output &#8211; example</span></i></b></div>



<figure class="wp-block-image size-large"><img decoding="async" src="https://www.codeindotnet.com/img/1/create-mime-type-custom-class-c-dot-net.jpg" alt="create-mime-type-custom-class-c-dot-net"/></figure>



<br><br>



<div><b><i><span style="border-bottom:0.1875rem solid #ba3925;">Full code</span></i></b></div>



<button class="c-b-s-f-r" onclick="ctc('div1',this)">Copy code</button>
<br>
<div id="div1">
<pre class="pchl"><code><span class="key">namespace</span> Utility
{
    <span class="key">public</span> <span class="key">static</span> <span class="key">class</span> MimeType
    {
        <span class="key">private</span> <span class="key">const</span> <span class="key">string</span> Dot = <span class="str">"."</span>;
        <span class="key">private</span> <span class="key">static</span> <span class="key">readonly</span> Lazy&lt;IDictionary&lt;<span class="key">string</span>, <span class="key">string</span>&gt;&gt; _mappings = <span class="key">new</span> Lazy&lt;IDictionary&lt;<span class="key">string</span>, <span class="key">string</span>&gt;&gt;
        (() =&gt; <span class="key">new</span> Dictionary&lt;<span class="key">string</span>, <span class="key">string</span>&gt;(StringComparer.OrdinalIgnoreCase)
        {
            #region 
            [<span class="str">".123"</span>] = <span class="str">"application/vnd.lotus-1-2-3"</span>,
            [<span class="str">".323"</span>] = <span class="str">"text/h323"</span>,
            [<span class="str">".3dml"</span>] = <span class="str">"text/vnd.in3d.3dml"</span>,
            [<span class="str">".3ds"</span>] = <span class="str">"image/x-3ds"</span>,
            [<span class="str">".3g2"</span>] = <span class="str">"video/3gpp2"</span>,
            [<span class="str">".3gp"</span>] = <span class="str">"video/3gpp"</span>,
            [<span class="str">".3gp2"</span>] = <span class="str">"video/3gpp2"</span>,
            [<span class="str">".3gpp"</span>] = <span class="str">"video/3gpp"</span>,
            [<span class="str">".7z"</span>] = <span class="str">"application/x-7z-compressed"</span>,
            [<span class="str">".aa"</span>] = <span class="str">"audio/audible"</span>,
            [<span class="str">".aab"</span>] = <span class="str">"application/x-authorware-bin"</span>,
            [<span class="str">".aac"</span>] = <span class="str">"audio/x-aac"</span>,
            [<span class="str">".AAC"</span>] = <span class="str">"audio/aac"</span>,
            [<span class="str">".aaf"</span>] = <span class="str">"application/octet-stream"</span>,
            [<span class="str">".aam"</span>] = <span class="str">"application/x-authorware-map"</span>,
            [<span class="str">".aas"</span>] = <span class="str">"application/x-authorware-seg"</span>,
            [<span class="str">".aax"</span>] = <span class="str">"audio/vnd.audible.aax"</span>,
            [<span class="str">".abw"</span>] = <span class="str">"application/x-abiword"</span>,
            [<span class="str">".ac"</span>] = <span class="str">"application/pkix-attr-cert"</span>,
            [<span class="str">".ac3"</span>] = <span class="str">"audio/ac3"</span>,
            [<span class="str">".aca"</span>] = <span class="str">"application/octet-stream"</span>,
            [<span class="str">".acc"</span>] = <span class="str">"application/vnd.americandynamics.acc"</span>,
            [<span class="str">".accda"</span>] = <span class="str">"application/msaccess.addin"</span>,
            [<span class="str">".accdb"</span>] = <span class="str">"application/msaccess"</span>,
            [<span class="str">".accdc"</span>] = <span class="str">"application/msaccess.cab"</span>,
            [<span class="str">".accde"</span>] = <span class="str">"application/msaccess"</span>,
            [<span class="str">".accdr"</span>] = <span class="str">"application/msaccess.runtime"</span>,
            [<span class="str">".accdt"</span>] = <span class="str">"application/msaccess"</span>,
            [<span class="str">".accdw"</span>] = <span class="str">"application/msaccess.webapplication"</span>,
            [<span class="str">".accft"</span>] = <span class="str">"application/msaccess.ftemplate"</span>,
            [<span class="str">".ace"</span>] = <span class="str">"application/x-ace-compressed"</span>,
            [<span class="str">".acu"</span>] = <span class="str">"application/vnd.acucobol"</span>,
            [<span class="str">".acutc"</span>] = <span class="str">"application/vnd.acucorp"</span>,
            [<span class="str">".acx"</span>] = <span class="str">"application/internet-property-stream"</span>,
            [<span class="str">".AddIn"</span>] = <span class="str">"text/xml"</span>,
            [<span class="str">".ade"</span>] = <span class="str">"application/msaccess"</span>,
            [<span class="str">".adobebridge"</span>] = <span class="str">"application/x-bridge-url"</span>,
            [<span class="str">".adp"</span>] = <span class="str">"application/msaccess"</span>,
            [<span class="str">".ADT"</span>] = <span class="str">"audio/vnd.dlna.adts"</span>,
            [<span class="str">".ADTS"</span>] = <span class="str">"audio/aac"</span>,
            [<span class="str">".aep"</span>] = <span class="str">"application/vnd.audiograph"</span>,
            [<span class="str">".afm"</span>] = <span class="str">"application/octet-stream"</span>,
            [<span class="str">".afp"</span>] = <span class="str">"application/vnd.ibm.modcap"</span>,
            [<span class="str">".ahead"</span>] = <span class="str">"application/vnd.ahead.space"</span>,
            [<span class="str">".ai"</span>] = <span class="str">"application/postscript"</span>,
            [<span class="str">".aif"</span>] = <span class="str">"audio/aiff"</span>,
            [<span class="str">".aifc"</span>] = <span class="str">"audio/aiff"</span>,
            [<span class="str">".aiff"</span>] = <span class="str">"audio/aiff"</span>,
            [<span class="str">".air"</span>] = <span class="str">"application/vnd.adobe.air-application-installer-package+zip"</span>,
            [<span class="str">".ait"</span>] = <span class="str">"application/vnd.dvb.ait"</span>,
            [<span class="str">".amc"</span>] = <span class="str">"application/mpeg"</span>,
            [<span class="str">".ami"</span>] = <span class="str">"application/vnd.amiga.ami"</span>,
            [<span class="str">".anx"</span>] = <span class="str">"application/annodex"</span>,
            [<span class="str">".apk"</span>] = <span class="str">"application/vnd.android.package-archive"</span>,
            [<span class="str">".apng"</span>] = <span class="str">"image/apng"</span>,
            [<span class="str">".appcache"</span>] = <span class="str">"text/cache-manifest"</span>,
            [<span class="str">".application"</span>] = <span class="str">"application/x-ms-application"</span>,
            [<span class="str">".apr"</span>] = <span class="str">"application/vnd.lotus-approach"</span>,
            [<span class="str">".arc"</span>] = <span class="str">"application/x-freearc"</span>,
            [<span class="str">".art"</span>] = <span class="str">"image/x-jg"</span>,
            [<span class="str">".asa"</span>] = <span class="str">"application/xml"</span>,
            [<span class="str">".asax"</span>] = <span class="str">"application/xml"</span>,
            [<span class="str">".asc"</span>] = <span class="str">"application/pgp-signature"</span>,
            [<span class="str">".ascx"</span>] = <span class="str">"application/xml"</span>,
            [<span class="str">".asd"</span>] = <span class="str">"application/octet-stream"</span>,
            [<span class="str">".asf"</span>] = <span class="str">"video/x-ms-asf"</span>,
            [<span class="str">".ashx"</span>] = <span class="str">"application/xml"</span>,
            [<span class="str">".asi"</span>] = <span class="str">"application/octet-stream"</span>,
            [<span class="str">".asm"</span>] = <span class="str">"text/plain"</span>,
            [<span class="str">".asmx"</span>] = <span class="str">"application/xml"</span>,
            [<span class="str">".aso"</span>] = <span class="str">"application/vnd.accpac.simply.aso"</span>,
            [<span class="str">".aspx"</span>] = <span class="str">"application/xml"</span>,
            [<span class="str">".asr"</span>] = <span class="str">"video/x-ms-asf"</span>,
            [<span class="str">".asx"</span>] = <span class="str">"video/x-ms-asf"</span>,
            [<span class="str">".atc"</span>] = <span class="str">"application/vnd.acucorp"</span>,
            [<span class="str">".atom"</span>] = <span class="str">"application/atom+xml"</span>,
            [<span class="str">".atomcat"</span>] = <span class="str">"application/atomcat+xml"</span>,
            [<span class="str">".atomsvc"</span>] = <span class="str">"application/atomsvc+xml"</span>,
            [<span class="str">".atx"</span>] = <span class="str">"application/vnd.antix.game-component"</span>,
            [<span class="str">".au"</span>] = <span class="str">"audio/basic"</span>,
            [<span class="str">".avci"</span>] = <span class="str">"image/avci"</span>,
            [<span class="str">".avcs"</span>] = <span class="str">"image/avcs"</span>,
            [<span class="str">".avi"</span>] = <span class="str">"video/x-msvideo"</span>,
            [<span class="str">".avif"</span>] = <span class="str">"image/avif"</span>,
            [<span class="str">".avifs"</span>] = <span class="str">"image/avif-sequence"</span>,
            [<span class="str">".aw"</span>] = <span class="str">"application/applixware"</span>,
            [<span class="str">".axa"</span>] = <span class="str">"audio/annodex"</span>,
            [<span class="str">".axs"</span>] = <span class="str">"application/olescript"</span>,
            [<span class="str">".axv"</span>] = <span class="str">"video/annodex"</span>,
            [<span class="str">".azf"</span>] = <span class="str">"application/vnd.airzip.filesecure.azf"</span>,
            [<span class="str">".azs"</span>] = <span class="str">"application/vnd.airzip.filesecure.azs"</span>,
            [<span class="str">".azw"</span>] = <span class="str">"application/vnd.amazon.ebook"</span>,
            [<span class="str">".bas"</span>] = <span class="str">"text/plain"</span>,
            [<span class="str">".bat"</span>] = <span class="str">"application/x-msdownload"</span>,
            [<span class="str">".bcpio"</span>] = <span class="str">"application/x-bcpio"</span>,
            [<span class="str">".bdf"</span>] = <span class="str">"application/x-font-bdf"</span>,
            [<span class="str">".bdm"</span>] = <span class="str">"application/vnd.syncml.dm+wbxml"</span>,
            [<span class="str">".bed"</span>] = <span class="str">"application/vnd.realvnc.bed"</span>,
            [<span class="str">".bh2"</span>] = <span class="str">"application/vnd.fujitsu.oasysprs"</span>,
            [<span class="str">".bin"</span>] = <span class="str">"application/octet-stream"</span>,
            [<span class="str">".blb"</span>] = <span class="str">"application/x-blorb"</span>,
            [<span class="str">".blorb"</span>] = <span class="str">"application/x-blorb"</span>,
            [<span class="str">".bmi"</span>] = <span class="str">"application/vnd.bmi"</span>,
            [<span class="str">".bmp"</span>] = <span class="str">"image/bmp"</span>,
            [<span class="str">".book"</span>] = <span class="str">"application/vnd.framemaker"</span>,
            [<span class="str">".box"</span>] = <span class="str">"application/vnd.previewsystems.box"</span>,
            [<span class="str">".boz"</span>] = <span class="str">"application/x-bzip2"</span>,
            [<span class="str">".bpk"</span>] = <span class="str">"application/octet-stream"</span>,
            [<span class="str">".btif"</span>] = <span class="str">"image/prs.btif"</span>,
            [<span class="str">".bz"</span>] = <span class="str">"application/x-bzip"</span>,
            [<span class="str">".bz2"</span>] = <span class="str">"application/x-bzip2"</span>,
            [<span class="str">".c"</span>] = <span class="str">"text/plain"</span>,
            [<span class="str">".c11amc"</span>] = <span class="str">"application/vnd.cluetrust.cartomobile-config"</span>,
            [<span class="str">".c11amz"</span>] = <span class="str">"application/vnd.cluetrust.cartomobile-config-pkg"</span>,
            [<span class="str">".c4d"</span>] = <span class="str">"application/vnd.clonk.c4group"</span>,
            [<span class="str">".c4f"</span>] = <span class="str">"application/vnd.clonk.c4group"</span>,
            [<span class="str">".c4g"</span>] = <span class="str">"application/vnd.clonk.c4group"</span>,
            [<span class="str">".c4p"</span>] = <span class="str">"application/vnd.clonk.c4group"</span>,
            [<span class="str">".c4u"</span>] = <span class="str">"application/vnd.clonk.c4group"</span>,
            [<span class="str">".cab"</span>] = <span class="str">"application/octet-stream"</span>,
            [<span class="str">".caf"</span>] = <span class="str">"audio/x-caf"</span>,
            [<span class="str">".calx"</span>] = <span class="str">"application/vnd.ms-office.calx"</span>,
            [<span class="str">".cap"</span>] = <span class="str">"application/vnd.tcpdump.pcap"</span>,
            [<span class="str">".car"</span>] = <span class="str">"application/vnd.curl.car"</span>,
            [<span class="str">".cat"</span>] = <span class="str">"application/vnd.ms-pki.seccat"</span>,
            [<span class="str">".cb7"</span>] = <span class="str">"application/x-cbr"</span>,
            [<span class="str">".cba"</span>] = <span class="str">"application/x-cbr"</span>,
            [<span class="str">".cbr"</span>] = <span class="str">"application/x-cbr"</span>,
            [<span class="str">".cbt"</span>] = <span class="str">"application/x-cbr"</span>,
            [<span class="str">".cbz"</span>] = <span class="str">"application/x-cbr"</span>,
            [<span class="str">".cc"</span>] = <span class="str">"text/plain"</span>,
            [<span class="str">".cct"</span>] = <span class="str">"application/x-director"</span>,
            [<span class="str">".ccxml"</span>] = <span class="str">"application/ccxml+xml"</span>,
            [<span class="str">".cd"</span>] = <span class="str">"text/plain"</span>,
            [<span class="str">".cdbcmsg"</span>] = <span class="str">"application/vnd.contact.cmsg"</span>,
            [<span class="str">".cdda"</span>] = <span class="str">"audio/aiff"</span>,
            [<span class="str">".cdf"</span>] = <span class="str">"application/x-cdf"</span>,
            [<span class="str">".cdkey"</span>] = <span class="str">"application/vnd.mediastation.cdkey"</span>,
            [<span class="str">".cdmia"</span>] = <span class="str">"application/cdmi-capability"</span>,
            [<span class="str">".cdmic"</span>] = <span class="str">"application/cdmi-container"</span>,
            [<span class="str">".cdmid"</span>] = <span class="str">"application/cdmi-domain"</span>,
            [<span class="str">".cdmio"</span>] = <span class="str">"application/cdmi-object"</span>,
            [<span class="str">".cdmiq"</span>] = <span class="str">"application/cdmi-queue"</span>,
            [<span class="str">".cdx"</span>] = <span class="str">"chemical/x-cdx"</span>,
            [<span class="str">".cdxml"</span>] = <span class="str">"application/vnd.chemdraw+xml"</span>,
            [<span class="str">".cdy"</span>] = <span class="str">"application/vnd.cinderella"</span>,
            [<span class="str">".cer"</span>] = <span class="str">"application/x-x509-ca-cert"</span>,
            [<span class="str">".cfg"</span>] = <span class="str">"text/plain"</span>,
            [<span class="str">".cfs"</span>] = <span class="str">"application/x-cfs-compressed"</span>,
            [<span class="str">".cgm"</span>] = <span class="str">"image/cgm"</span>,
            [<span class="str">".chat"</span>] = <span class="str">"application/x-chat"</span>,
            [<span class="str">".chm"</span>] = <span class="str">"application/octet-stream"</span>,
            [<span class="str">".chrt"</span>] = <span class="str">"application/vnd.kde.kchart"</span>,
            [<span class="str">".cif"</span>] = <span class="str">"chemical/x-cif"</span>,
            [<span class="str">".cii"</span>] = <span class="str">"application/vnd.anser-web-certificate-issue-initiation"</span>,
            [<span class="str">".cil"</span>] = <span class="str">"application/vnd.ms-artgalry"</span>,
            [<span class="str">".cla"</span>] = <span class="str">"application/vnd.claymore"</span>,
            [<span class="str">".class"</span>] = <span class="str">"application/x-java-applet"</span>,
            [<span class="str">".clkk"</span>] = <span class="str">"application/vnd.crick.clicker.keyboard"</span>,
            [<span class="str">".clkp"</span>] = <span class="str">"application/vnd.crick.clicker.palette"</span>,
            [<span class="str">".clkt"</span>] = <span class="str">"application/vnd.crick.clicker.template"</span>,
            [<span class="str">".clkw"</span>] = <span class="str">"application/vnd.crick.clicker.wordbank"</span>,
            [<span class="str">".clkx"</span>] = <span class="str">"application/vnd.crick.clicker"</span>,
            [<span class="str">".clp"</span>] = <span class="str">"application/x-msclip"</span>,
            [<span class="str">".cmc"</span>] = <span class="str">"application/vnd.cosmocaller"</span>,
            [<span class="str">".cmd"</span>] = <span class="str">"text/plain"</span>,
            [<span class="str">".cmdf"</span>] = <span class="str">"chemical/x-cmdf"</span>,
            [<span class="str">".cml"</span>] = <span class="str">"chemical/x-cml"</span>,
            [<span class="str">".cmp"</span>] = <span class="str">"application/vnd.yellowriver-custom-menu"</span>,
            [<span class="str">".cmx"</span>] = <span class="str">"image/x-cmx"</span>,
            [<span class="str">".cnf"</span>] = <span class="str">"text/plain"</span>,
            [<span class="str">".cod"</span>] = <span class="str">"image/cis-cod"</span>,
            [<span class="str">".com"</span>] = <span class="str">"application/x-msdownload"</span>,
            [<span class="str">".conf"</span>] = <span class="str">"text/plain"</span>,
            [<span class="str">".config"</span>] = <span class="str">"application/xml"</span>,
            [<span class="str">".contact"</span>] = <span class="str">"text/x-ms-contact"</span>,
            [<span class="str">".coverage"</span>] = <span class="str">"application/xml"</span>,
            [<span class="str">".cpio"</span>] = <span class="str">"application/x-cpio"</span>,
            [<span class="str">".cpp"</span>] = <span class="str">"text/plain"</span>,
            [<span class="str">".cpt"</span>] = <span class="str">"application/mac-compactpro"</span>,
            [<span class="str">".crd"</span>] = <span class="str">"application/x-mscardfile"</span>,
            [<span class="str">".crl"</span>] = <span class="str">"application/pkix-crl"</span>,
            [<span class="str">".crt"</span>] = <span class="str">"application/x-x509-ca-cert"</span>,
            [<span class="str">".cryptonote"</span>] = <span class="str">"application/vnd.rig.cryptonote"</span>,
            [<span class="str">".cs"</span>] = <span class="str">"text/plain"</span>,
            [<span class="str">".csdproj"</span>] = <span class="str">"text/plain"</span>,
            [<span class="str">".csh"</span>] = <span class="str">"application/x-csh"</span>,
            [<span class="str">".csml"</span>] = <span class="str">"chemical/x-csml"</span>,
            [<span class="str">".csp"</span>] = <span class="str">"application/vnd.commonspace"</span>,
            [<span class="str">".csproj"</span>] = <span class="str">"text/plain"</span>,
            [<span class="str">".css"</span>] = <span class="str">"text/css"</span>,
            [<span class="str">".cst"</span>] = <span class="str">"application/x-director"</span>,
            [<span class="str">".csv"</span>] = <span class="str">"text/csv"</span>,
            [<span class="str">".cu"</span>] = <span class="str">"application/cu-seeme"</span>,
            [<span class="str">".cur"</span>] = <span class="str">"application/octet-stream"</span>,
            [<span class="str">".curl"</span>] = <span class="str">"text/vnd.curl"</span>,
            [<span class="str">".cww"</span>] = <span class="str">"application/prs.cww"</span>,
            [<span class="str">".cxt"</span>] = <span class="str">"application/x-director"</span>,
            [<span class="str">".cxx"</span>] = <span class="str">"text/plain"</span>,
            [<span class="str">".czx"</span>] = <span class="str">"application/x-czx"</span>,
            [<span class="str">".dae"</span>] = <span class="str">"model/vnd.collada+xml"</span>,
            [<span class="str">".daf"</span>] = <span class="str">"application/vnd.mobius.daf"</span>,
            [<span class="str">".dart"</span>] = <span class="str">"application/vnd.dart"</span>,
            [<span class="str">".dat"</span>] = <span class="str">"application/octet-stream"</span>,
            [<span class="str">".dataless"</span>] = <span class="str">"application/vnd.fdsn.seed"</span>,
            [<span class="str">".datasource"</span>] = <span class="str">"application/xml"</span>,
            [<span class="str">".davmount"</span>] = <span class="str">"application/davmount+xml"</span>,
            [<span class="str">".dbk"</span>] = <span class="str">"application/docbook+xml"</span>,
            [<span class="str">".dbproj"</span>] = <span class="str">"text/plain"</span>,
            [<span class="str">".dcr"</span>] = <span class="str">"application/x-director"</span>,
            [<span class="str">".dcurl"</span>] = <span class="str">"text/vnd.curl.dcurl"</span>,
            [<span class="str">".dd2"</span>] = <span class="str">"application/vnd.oma.dd2+xml"</span>,
            [<span class="str">".ddd"</span>] = <span class="str">"application/vnd.fujixerox.ddd"</span>,
            [<span class="str">".deb"</span>] = <span class="str">"application/x-debian-package"</span>,
            [<span class="str">".def"</span>] = <span class="str">"text/plain"</span>,
            [<span class="str">".deploy"</span>] = <span class="str">"application/octet-stream"</span>,
            [<span class="str">".der"</span>] = <span class="str">"application/x-x509-ca-cert"</span>,
            [<span class="str">".dfac"</span>] = <span class="str">"application/vnd.dreamfactory"</span>,
            [<span class="str">".dgc"</span>] = <span class="str">"application/x-dgc-compressed"</span>,
            [<span class="str">".dgml"</span>] = <span class="str">"application/xml"</span>,
            [<span class="str">".dib"</span>] = <span class="str">"image/bmp"</span>,
            [<span class="str">".dic"</span>] = <span class="str">"text/x-c"</span>,
            [<span class="str">".dif"</span>] = <span class="str">"video/x-dv"</span>,
            [<span class="str">".dir"</span>] = <span class="str">"application/x-director"</span>,
            [<span class="str">".dis"</span>] = <span class="str">"application/vnd.mobius.dis"</span>,
            [<span class="str">".disco"</span>] = <span class="str">"text/xml"</span>,
            [<span class="str">".dist"</span>] = <span class="str">"application/octet-stream"</span>,
            [<span class="str">".distz"</span>] = <span class="str">"application/octet-stream"</span>,
            [<span class="str">".divx"</span>] = <span class="str">"video/divx"</span>,
            [<span class="str">".djv"</span>] = <span class="str">"image/vnd.djvu"</span>,
            [<span class="str">".djvu"</span>] = <span class="str">"image/vnd.djvu"</span>,
            [<span class="str">".dll"</span>] = <span class="str">"application/x-msdownload"</span>,
            [<span class="str">".dll.config"</span>] = <span class="str">"text/xml"</span>,
            [<span class="str">".dlm"</span>] = <span class="str">"text/dlm"</span>,
            [<span class="str">".dmg"</span>] = <span class="str">"application/x-apple-diskimage"</span>,
            [<span class="str">".dmp"</span>] = <span class="str">"application/vnd.tcpdump.pcap"</span>,
            [<span class="str">".dms"</span>] = <span class="str">"application/octet-stream"</span>,
            [<span class="str">".dna"</span>] = <span class="str">"application/vnd.dna"</span>,
            [<span class="str">".doc"</span>] = <span class="str">"application/msword"</span>,
            [<span class="str">".docm"</span>] = <span class="str">"application/vnd.ms-word.document.macroEnabled.12"</span>,
            [<span class="str">".docx"</span>] = <span class="str">"application/vnd.openxmlformats-officedocument.wordprocessingml.document"</span>,
            [<span class="str">".dot"</span>] = <span class="str">"application/msword"</span>,
            [<span class="str">".dotm"</span>] = <span class="str">"application/vnd.ms-word.template.macroEnabled.12"</span>,
            [<span class="str">".dotx"</span>] = <span class="str">"application/vnd.openxmlformats-officedocument.wordprocessingml.template"</span>,
            [<span class="str">".dp"</span>] = <span class="str">"application/vnd.osgi.dp"</span>,
            [<span class="str">".dpg"</span>] = <span class="str">"application/vnd.dpgraph"</span>,
            [<span class="str">".dra"</span>] = <span class="str">"audio/vnd.dra"</span>,
            [<span class="str">".dsc"</span>] = <span class="str">"text/prs.lines.tag"</span>,
            [<span class="str">".dsp"</span>] = <span class="str">"application/octet-stream"</span>,
            [<span class="str">".dssc"</span>] = <span class="str">"application/dssc+der"</span>,
            [<span class="str">".dsw"</span>] = <span class="str">"text/plain"</span>,
            [<span class="str">".dtb"</span>] = <span class="str">"application/x-dtbook+xml"</span>,
            [<span class="str">".dtd"</span>] = <span class="str">"text/xml"</span>,
            [<span class="str">".dts"</span>] = <span class="str">"audio/vnd.dts"</span>,
            [<span class="str">".dtsConfig"</span>] = <span class="str">"text/xml"</span>,
            [<span class="str">".dtshd"</span>] = <span class="str">"audio/vnd.dts.hd"</span>,
            [<span class="str">".dump"</span>] = <span class="str">"application/octet-stream"</span>,
            [<span class="str">".dv"</span>] = <span class="str">"video/x-dv"</span>,
            [<span class="str">".dvb"</span>] = <span class="str">"video/vnd.dvb.file"</span>,
            [<span class="str">".dvi"</span>] = <span class="str">"application/x-dvi"</span>,
            [<span class="str">".dwf"</span>] = <span class="str">"drawing/x-dwf"</span>,
            [<span class="str">".dwg"</span>] = <span class="str">"application/acad"</span>,
            [<span class="str">".dwp"</span>] = <span class="str">"application/octet-stream"</span>,
            [<span class="str">".dxf"</span>] = <span class="str">"application/x-dxf"</span>,
            [<span class="str">".dxp"</span>] = <span class="str">"application/vnd.spotfire.dxp"</span>,
            [<span class="str">".dxr"</span>] = <span class="str">"application/x-director"</span>,
            [<span class="str">".ecelp4800"</span>] = <span class="str">"audio/vnd.nuera.ecelp4800"</span>,
            [<span class="str">".ecelp7470"</span>] = <span class="str">"audio/vnd.nuera.ecelp7470"</span>,
            [<span class="str">".ecelp9600"</span>] = <span class="str">"audio/vnd.nuera.ecelp9600"</span>,
            [<span class="str">".ecma"</span>] = <span class="str">"application/ecmascript"</span>,
            [<span class="str">".edm"</span>] = <span class="str">"application/vnd.novadigm.edm"</span>,
            [<span class="str">".edx"</span>] = <span class="str">"application/vnd.novadigm.edx"</span>,
            [<span class="str">".efif"</span>] = <span class="str">"application/vnd.picsel"</span>,
            [<span class="str">".ei6"</span>] = <span class="str">"application/vnd.pg.osasli"</span>,
            [<span class="str">".elc"</span>] = <span class="str">"application/octet-stream"</span>,
            [<span class="str">".emf"</span>] = <span class="str">"image/emf"</span>,
            [<span class="str">".eml"</span>] = <span class="str">"message/rfc822"</span>,
            [<span class="str">".emma"</span>] = <span class="str">"application/emma+xml"</span>,
            [<span class="str">".emz"</span>] = <span class="str">"application/octet-stream"</span>,
            [<span class="str">".eol"</span>] = <span class="str">"audio/vnd.digital-winds"</span>,
            [<span class="str">".eot"</span>] = <span class="str">"application/vnd.ms-fontobject"</span>,
            [<span class="str">".eps"</span>] = <span class="str">"application/postscript"</span>,
            [<span class="str">".epub"</span>] = <span class="str">"application/epub+zip"</span>,
            [<span class="str">".es"</span>] = <span class="str">"application/ecmascript"</span>,
            [<span class="str">".es3"</span>] = <span class="str">"application/vnd.eszigno3+xml"</span>,
            [<span class="str">".esa"</span>] = <span class="str">"application/vnd.osgi.subsystem"</span>,
            [<span class="str">".esf"</span>] = <span class="str">"application/vnd.epson.esf"</span>,
            [<span class="str">".et3"</span>] = <span class="str">"application/vnd.eszigno3+xml"</span>,
            [<span class="str">".etl"</span>] = <span class="str">"application/etl"</span>,
            [<span class="str">".etx"</span>] = <span class="str">"text/x-setext"</span>,
            [<span class="str">".eva"</span>] = <span class="str">"application/x-eva"</span>,
            [<span class="str">".evy"</span>] = <span class="str">"application/envoy"</span>,
            [<span class="str">".exe"</span>] = <span class="str">"application/vnd.microsoft.portable-executable"</span>,
            [<span class="str">".exe.config"</span>] = <span class="str">"text/xml"</span>,
            [<span class="str">".exi"</span>] = <span class="str">"application/exi"</span>,
            [<span class="str">".ext"</span>] = <span class="str">"application/vnd.novadigm.ext"</span>,
            [<span class="str">".ez"</span>] = <span class="str">"application/andrew-inset"</span>,
            [<span class="str">".ez2"</span>] = <span class="str">"application/vnd.ezpix-album"</span>,
            [<span class="str">".ez3"</span>] = <span class="str">"application/vnd.ezpix-package"</span>,
            [<span class="str">".f"</span>] = <span class="str">"text/x-fortran"</span>,
            [<span class="str">".f4v"</span>] = <span class="str">"video/mp4"</span>,
            [<span class="str">".f77"</span>] = <span class="str">"text/x-fortran"</span>,
            [<span class="str">".f90"</span>] = <span class="str">"text/x-fortran"</span>,
            [<span class="str">".fbs"</span>] = <span class="str">"image/vnd.fastbidsheet"</span>,
            [<span class="str">".fcdt"</span>] = <span class="str">"application/vnd.adobe.formscentral.fcdt"</span>,
            [<span class="str">".fcs"</span>] = <span class="str">"application/vnd.isac.fcs"</span>,
            [<span class="str">".fdf"</span>] = <span class="str">"application/vnd.fdf"</span>,
            [<span class="str">".fe_launch"</span>] = <span class="str">"application/vnd.denovo.fcselayout-link"</span>,
            [<span class="str">".fg5"</span>] = <span class="str">"application/vnd.fujitsu.oasysgp"</span>,
            [<span class="str">".fgd"</span>] = <span class="str">"application/x-director"</span>,
            [<span class="str">".fh"</span>] = <span class="str">"image/x-freehand"</span>,
            [<span class="str">".fh4"</span>] = <span class="str">"image/x-freehand"</span>,
            [<span class="str">".fh5"</span>] = <span class="str">"image/x-freehand"</span>,
            [<span class="str">".fh7"</span>] = <span class="str">"image/x-freehand"</span>,
            [<span class="str">".fhc"</span>] = <span class="str">"image/x-freehand"</span>,
            [<span class="str">".fif"</span>] = <span class="str">"application/fractals"</span>,
            [<span class="str">".fig"</span>] = <span class="str">"application/x-xfig"</span>,
            [<span class="str">".filters"</span>] = <span class="str">"application/xml"</span>,
            [<span class="str">".fla"</span>] = <span class="str">"application/octet-stream"</span>,
            [<span class="str">".flac"</span>] = <span class="str">"audio/flac"</span>,
            [<span class="str">".fli"</span>] = <span class="str">"video/x-fli"</span>,
            [<span class="str">".flo"</span>] = <span class="str">"application/vnd.micrografx.flo"</span>,
            [<span class="str">".flr"</span>] = <span class="str">"x-world/x-vrml"</span>,
            [<span class="str">".flv"</span>] = <span class="str">"video/x-flv"</span>,
            [<span class="str">".flw"</span>] = <span class="str">"application/vnd.kde.kivio"</span>,
            [<span class="str">".flx"</span>] = <span class="str">"text/vnd.fmi.flexstor"</span>,
            [<span class="str">".fly"</span>] = <span class="str">"text/vnd.fly"</span>,
            [<span class="str">".fm"</span>] = <span class="str">"application/vnd.framemaker"</span>,
            [<span class="str">".fnc"</span>] = <span class="str">"application/vnd.frogans.fnc"</span>,
            [<span class="str">".for"</span>] = <span class="str">"text/x-fortran"</span>,
            [<span class="str">".fpx"</span>] = <span class="str">"image/vnd.fpx"</span>,
            [<span class="str">".frame"</span>] = <span class="str">"application/vnd.framemaker"</span>,
            [<span class="str">".fsc"</span>] = <span class="str">"application/vnd.fsc.weblaunch"</span>,
            [<span class="str">".fsscript"</span>] = <span class="str">"application/fsharp-script"</span>,
            [<span class="str">".fst"</span>] = <span class="str">"image/vnd.fst"</span>,
            [<span class="str">".fsx"</span>] = <span class="str">"application/fsharp-script"</span>,
            [<span class="str">".ftc"</span>] = <span class="str">"application/vnd.fluxtime.clip"</span>,
            [<span class="str">".fti"</span>] = <span class="str">"application/vnd.anser-web-funds-transfer-initiation"</span>,
            [<span class="str">".fvt"</span>] = <span class="str">"video/vnd.fvt"</span>,
            [<span class="str">".fxp"</span>] = <span class="str">"application/vnd.adobe.fxp"</span>,
            [<span class="str">".fxpl"</span>] = <span class="str">"application/vnd.adobe.fxp"</span>,
            [<span class="str">".fzs"</span>] = <span class="str">"application/vnd.fuzzysheet"</span>,
            [<span class="str">".g2w"</span>] = <span class="str">"application/vnd.geoplan"</span>,
            [<span class="str">".g3"</span>] = <span class="str">"image/g3fax"</span>,
            [<span class="str">".g3w"</span>] = <span class="str">"application/vnd.geospace"</span>,
            [<span class="str">".gac"</span>] = <span class="str">"application/vnd.groove-account"</span>,
            [<span class="str">".gam"</span>] = <span class="str">"application/x-tads"</span>,
            [<span class="str">".gbr"</span>] = <span class="str">"application/rpki-ghostbusters"</span>,
            [<span class="str">".gca"</span>] = <span class="str">"application/x-gca-compressed"</span>,
            [<span class="str">".gdl"</span>] = <span class="str">"model/vnd.gdl"</span>,
            [<span class="str">".generictest"</span>] = <span class="str">"application/xml"</span>,
            [<span class="str">".geo"</span>] = <span class="str">"application/vnd.dynageo"</span>,
            [<span class="str">".geojson"</span>] = <span class="str">"application/geo+json"</span>,
            [<span class="str">".gex"</span>] = <span class="str">"application/vnd.geometry-explorer"</span>,
            [<span class="str">".ggb"</span>] = <span class="str">"application/vnd.geogebra.file"</span>,
            [<span class="str">".ggt"</span>] = <span class="str">"application/vnd.geogebra.tool"</span>,
            [<span class="str">".ghf"</span>] = <span class="str">"application/vnd.groove-help"</span>,
            [<span class="str">".gif"</span>] = <span class="str">"image/gif"</span>,
            [<span class="str">".gim"</span>] = <span class="str">"application/vnd.groove-identity-message"</span>,
            [<span class="str">".gml"</span>] = <span class="str">"application/gml+xml"</span>,
            [<span class="str">".gmx"</span>] = <span class="str">"application/vnd.gmx"</span>,
            [<span class="str">".gnumeric"</span>] = <span class="str">"application/x-gnumeric"</span>,
            [<span class="str">".gph"</span>] = <span class="str">"application/vnd.flographit"</span>,
            [<span class="str">".gpx"</span>] = <span class="str">"application/gpx+xml"</span>,
            [<span class="str">".gqf"</span>] = <span class="str">"application/vnd.grafeq"</span>,
            [<span class="str">".gqs"</span>] = <span class="str">"application/vnd.grafeq"</span>,
            [<span class="str">".gram"</span>] = <span class="str">"application/srgs"</span>,
            [<span class="str">".gramps"</span>] = <span class="str">"application/x-gramps-xml"</span>,
            [<span class="str">".gre"</span>] = <span class="str">"application/vnd.geometry-explorer"</span>,
            [<span class="str">".group"</span>] = <span class="str">"text/x-ms-group"</span>,
            [<span class="str">".grv"</span>] = <span class="str">"application/vnd.groove-injector"</span>,
            [<span class="str">".grxml"</span>] = <span class="str">"application/srgs+xml"</span>,
            [<span class="str">".gsf"</span>] = <span class="str">"application/x-font-ghostscript"</span>,
            [<span class="str">".gsm"</span>] = <span class="str">"audio/x-gsm"</span>,
            [<span class="str">".gtar"</span>] = <span class="str">"application/x-gtar"</span>,
            [<span class="str">".gtm"</span>] = <span class="str">"application/vnd.groove-tool-message"</span>,
            [<span class="str">".gtw"</span>] = <span class="str">"model/vnd.gtw"</span>,
            [<span class="str">".gv"</span>] = <span class="str">"text/vnd.graphviz"</span>,
            [<span class="str">".gxf"</span>] = <span class="str">"application/gxf"</span>,
            [<span class="str">".gxt"</span>] = <span class="str">"application/vnd.geonext"</span>,
            [<span class="str">".gz"</span>] = <span class="str">"application/x-gzip"</span>,
            [<span class="str">".h"</span>] = <span class="str">"text/plain"</span>,
            [<span class="str">".h261"</span>] = <span class="str">"video/h261"</span>,
            [<span class="str">".h263"</span>] = <span class="str">"video/h263"</span>,
            [<span class="str">".h264"</span>] = <span class="str">"video/h264"</span>,
            [<span class="str">".hal"</span>] = <span class="str">"application/vnd.hal+xml"</span>,
            [<span class="str">".hbci"</span>] = <span class="str">"application/vnd.hbci"</span>,
            [<span class="str">".hdf"</span>] = <span class="str">"application/x-hdf"</span>,
            [<span class="str">".hdml"</span>] = <span class="str">"text/x-hdml"</span>,
            [<span class="str">".heic"</span>] = <span class="str">"image/heic"</span>,
            [<span class="str">".heics"</span>] = <span class="str">"image/heic-sequence"</span>,
            [<span class="str">".heif"</span>] = <span class="str">"image/heif"</span>,
            [<span class="str">".heifs"</span>] = <span class="str">"image/heif-sequence"</span>,
            [<span class="str">".hh"</span>] = <span class="str">"text/x-c"</span>,
            [<span class="str">".hhc"</span>] = <span class="str">"application/x-oleobject"</span>,
            [<span class="str">".hhk"</span>] = <span class="str">"application/octet-stream"</span>,
            [<span class="str">".hhp"</span>] = <span class="str">"application/octet-stream"</span>,
            [<span class="str">".hlp"</span>] = <span class="str">"application/winhlp"</span>,
            [<span class="str">".hpgl"</span>] = <span class="str">"application/vnd.hp-hpgl"</span>,
            [<span class="str">".hpid"</span>] = <span class="str">"application/vnd.hp-hpid"</span>,
            [<span class="str">".hpp"</span>] = <span class="str">"text/plain"</span>,
            [<span class="str">".hps"</span>] = <span class="str">"application/vnd.hp-hps"</span>,
            [<span class="str">".hqx"</span>] = <span class="str">"application/mac-binhex40"</span>,
            [<span class="str">".hta"</span>] = <span class="str">"application/hta"</span>,
            [<span class="str">".htc"</span>] = <span class="str">"text/x-component"</span>,
            [<span class="str">".htke"</span>] = <span class="str">"application/vnd.kenameaapp"</span>,
            [<span class="str">".htm"</span>] = <span class="str">"text/html"</span>,
            [<span class="str">".html"</span>] = <span class="str">"text/html"</span>,
            [<span class="str">".htt"</span>] = <span class="str">"text/webviewhtml"</span>,
            [<span class="str">".hvd"</span>] = <span class="str">"application/vnd.yamaha.hv-dic"</span>,
            [<span class="str">".hvp"</span>] = <span class="str">"application/vnd.yamaha.hv-voice"</span>,
            [<span class="str">".hvs"</span>] = <span class="str">"application/vnd.yamaha.hv-script"</span>,
            [<span class="str">".hxa"</span>] = <span class="str">"application/xml"</span>,
            [<span class="str">".hxc"</span>] = <span class="str">"application/xml"</span>,
            [<span class="str">".hxd"</span>] = <span class="str">"application/octet-stream"</span>,
            [<span class="str">".hxe"</span>] = <span class="str">"application/xml"</span>,
            [<span class="str">".hxf"</span>] = <span class="str">"application/xml"</span>,
            [<span class="str">".hxh"</span>] = <span class="str">"application/octet-stream"</span>,
            [<span class="str">".hxi"</span>] = <span class="str">"application/octet-stream"</span>,
            [<span class="str">".hxk"</span>] = <span class="str">"application/xml"</span>,
            [<span class="str">".hxq"</span>] = <span class="str">"application/octet-stream"</span>,
            [<span class="str">".hxr"</span>] = <span class="str">"application/octet-stream"</span>,
            [<span class="str">".hxs"</span>] = <span class="str">"application/octet-stream"</span>,
            [<span class="str">".hxt"</span>] = <span class="str">"text/html"</span>,
            [<span class="str">".hxv"</span>] = <span class="str">"application/xml"</span>,
            [<span class="str">".hxw"</span>] = <span class="str">"application/octet-stream"</span>,
            [<span class="str">".hxx"</span>] = <span class="str">"text/plain"</span>,
            [<span class="str">".i"</span>] = <span class="str">"text/plain"</span>,
            [<span class="str">".i2g"</span>] = <span class="str">"application/vnd.intergeo"</span>,
            [<span class="str">".ical"</span>] = <span class="str">"text/calendar"</span>,
            [<span class="str">".icalendar"</span>] = <span class="str">"text/calendar"</span>,
            [<span class="str">".icc"</span>] = <span class="str">"application/vnd.iccprofile"</span>,
            [<span class="str">".ice"</span>] = <span class="str">"x-conference/x-cooltalk"</span>,
            [<span class="str">".icm"</span>] = <span class="str">"application/vnd.iccprofile"</span>,
            [<span class="str">".ico"</span>] = <span class="str">"image/x-icon"</span>,
            [<span class="str">".ics"</span>] = <span class="str">"text/calendar"</span>,
            [<span class="str">".idl"</span>] = <span class="str">"text/plain"</span>,
            [<span class="str">".ief"</span>] = <span class="str">"image/ief"</span>,
            [<span class="str">".ifb"</span>] = <span class="str">"text/calendar"</span>,
            [<span class="str">".ifm"</span>] = <span class="str">"application/vnd.shana.informed.formdata"</span>,
            [<span class="str">".iges"</span>] = <span class="str">"model/iges"</span>,
            [<span class="str">".igl"</span>] = <span class="str">"application/vnd.igloader"</span>,
            [<span class="str">".igm"</span>] = <span class="str">"application/vnd.insors.igm"</span>,
            [<span class="str">".igs"</span>] = <span class="str">"model/iges"</span>,
            [<span class="str">".igx"</span>] = <span class="str">"application/vnd.micrografx.igx"</span>,
            [<span class="str">".iif"</span>] = <span class="str">"application/vnd.shana.informed.interchange"</span>,
            [<span class="str">".iii"</span>] = <span class="str">"application/x-iphone"</span>,
            [<span class="str">".imp"</span>] = <span class="str">"application/vnd.accpac.simply.imp"</span>,
            [<span class="str">".ims"</span>] = <span class="str">"application/vnd.ms-ims"</span>,
            [<span class="str">".in"</span>] = <span class="str">"text/plain"</span>,
            [<span class="str">".inc"</span>] = <span class="str">"text/plain"</span>,
            [<span class="str">".inf"</span>] = <span class="str">"application/octet-stream"</span>,
            [<span class="str">".ini"</span>] = <span class="str">"text/plain"</span>,
            [<span class="str">".ink"</span>] = <span class="str">"application/inkml+xml"</span>,
            [<span class="str">".inkml"</span>] = <span class="str">"application/inkml+xml"</span>,
            [<span class="str">".inl"</span>] = <span class="str">"text/plain"</span>,
            [<span class="str">".ins"</span>] = <span class="str">"application/x-internet-signup"</span>,
            [<span class="str">".install"</span>] = <span class="str">"application/x-install-instructions"</span>,
            [<span class="str">".iota"</span>] = <span class="str">"application/vnd.astraea-software.iota"</span>,
            [<span class="str">".ipa"</span>] = <span class="str">"application/x-itunes-ipa"</span>,
            [<span class="str">".ipfix"</span>] = <span class="str">"application/ipfix"</span>,
            [<span class="str">".ipg"</span>] = <span class="str">"application/x-itunes-ipg"</span>,
            [<span class="str">".ipk"</span>] = <span class="str">"application/vnd.shana.informed.package"</span>,
            [<span class="str">".ipproj"</span>] = <span class="str">"text/plain"</span>,
            [<span class="str">".ipsw"</span>] = <span class="str">"application/x-itunes-ipsw"</span>,
            [<span class="str">".iqy"</span>] = <span class="str">"text/x-ms-iqy"</span>,
            [<span class="str">".irm"</span>] = <span class="str">"application/vnd.ibm.rights-management"</span>,
            [<span class="str">".irp"</span>] = <span class="str">"application/vnd.irepository.package+xml"</span>,
            [<span class="str">".isma"</span>] = <span class="str">"application/octet-stream"</span>,
            [<span class="str">".ismv"</span>] = <span class="str">"application/octet-stream"</span>,
            [<span class="str">".iso"</span>] = <span class="str">"application/x-iso9660-image"</span>,
            [<span class="str">".isp"</span>] = <span class="str">"application/x-internet-signup"</span>,
            [<span class="str">".ite"</span>] = <span class="str">"application/x-itunes-ite"</span>,
            [<span class="str">".itlp"</span>] = <span class="str">"application/x-itunes-itlp"</span>,
            [<span class="str">".itms"</span>] = <span class="str">"application/x-itunes-itms"</span>,
            [<span class="str">".itp"</span>] = <span class="str">"application/vnd.shana.informed.formtemplate"</span>,
            [<span class="str">".itpc"</span>] = <span class="str">"application/x-itunes-itpc"</span>,
            [<span class="str">".IVF"</span>] = <span class="str">"video/x-ivf"</span>,
            [<span class="str">".ivp"</span>] = <span class="str">"application/vnd.immervision-ivp"</span>,
            [<span class="str">".ivu"</span>] = <span class="str">"application/vnd.immervision-ivu"</span>,
            [<span class="str">".jad"</span>] = <span class="str">"text/vnd.sun.j2me.app-descriptor"</span>,
            [<span class="str">".jam"</span>] = <span class="str">"application/vnd.jam"</span>,
            [<span class="str">".jar"</span>] = <span class="str">"application/java-archive"</span>,
            [<span class="str">".java"</span>] = <span class="str">"application/octet-stream"</span>,
            [<span class="str">".jck"</span>] = <span class="str">"application/liquidmotion"</span>,
            [<span class="str">".jcz"</span>] = <span class="str">"application/liquidmotion"</span>,
            [<span class="str">".jfif"</span>] = <span class="str">"image/pjpeg"</span>,
            [<span class="str">".jisp"</span>] = <span class="str">"application/vnd.jisp"</span>,
            [<span class="str">".jlt"</span>] = <span class="str">"application/vnd.hp-jlyt"</span>,
            [<span class="str">".jnlp"</span>] = <span class="str">"application/x-java-jnlp-file"</span>,
            [<span class="str">".joda"</span>] = <span class="str">"application/vnd.joost.joda-archive"</span>,
            [<span class="str">".jpb"</span>] = <span class="str">"application/octet-stream"</span>,
            [<span class="str">".jpe"</span>] = <span class="str">"image/jpeg"</span>,
            [<span class="str">".jpeg"</span>] = <span class="str">"image/jpeg"</span>,
            [<span class="str">".jpg"</span>] = <span class="str">"image/jpeg"</span>,
            [<span class="str">".jpgm"</span>] = <span class="str">"video/jpm"</span>,
            [<span class="str">".jpgv"</span>] = <span class="str">"video/jpeg"</span>,
            [<span class="str">".jpm"</span>] = <span class="str">"video/jpm"</span>,
            [<span class="str">".js"</span>] = <span class="str">"application/javascript"</span>,
            [<span class="str">".json"</span>] = <span class="str">"application/json"</span>,
            [<span class="str">".jsonml"</span>] = <span class="str">"application/jsonml+json"</span>,
            [<span class="str">".jsx"</span>] = <span class="str">"text/jscript"</span>,
            [<span class="str">".jsxbin"</span>] = <span class="str">"text/plain"</span>,
            [<span class="str">".kar"</span>] = <span class="str">"audio/midi"</span>,
            [<span class="str">".karbon"</span>] = <span class="str">"application/vnd.kde.karbon"</span>,
            [<span class="str">".key"</span>] = <span class="str">"application/vnd.apple.keynote"</span>,
            [<span class="str">".kfo"</span>] = <span class="str">"application/vnd.kde.kformula"</span>,
            [<span class="str">".kia"</span>] = <span class="str">"application/vnd.kidspiration"</span>,
            [<span class="str">".kml"</span>] = <span class="str">"application/vnd.google-earth.kml+xml"</span>,
            [<span class="str">".kmz"</span>] = <span class="str">"application/vnd.google-earth.kmz"</span>,
            [<span class="str">".kne"</span>] = <span class="str">"application/vnd.kinar"</span>,
            [<span class="str">".knp"</span>] = <span class="str">"application/vnd.kinar"</span>,
            [<span class="str">".kon"</span>] = <span class="str">"application/vnd.kde.kontour"</span>,
            [<span class="str">".kpr"</span>] = <span class="str">"application/vnd.kde.kpresenter"</span>,
            [<span class="str">".kpt"</span>] = <span class="str">"application/vnd.kde.kpresenter"</span>,
            [<span class="str">".kpxx"</span>] = <span class="str">"application/vnd.ds-keypoint"</span>,
            [<span class="str">".ksp"</span>] = <span class="str">"application/vnd.kde.kspread"</span>,
            [<span class="str">".ktr"</span>] = <span class="str">"application/vnd.kahootz"</span>,
            [<span class="str">".ktx"</span>] = <span class="str">"image/ktx"</span>,
            [<span class="str">".ktz"</span>] = <span class="str">"application/vnd.kahootz"</span>,
            [<span class="str">".kwd"</span>] = <span class="str">"application/vnd.kde.kword"</span>,
            [<span class="str">".kwt"</span>] = <span class="str">"application/vnd.kde.kword"</span>,
            [<span class="str">".lasxml"</span>] = <span class="str">"application/vnd.las.las+xml"</span>,
            [<span class="str">".latex"</span>] = <span class="str">"application/x-latex"</span>,
            [<span class="str">".lbd"</span>] = <span class="str">"application/vnd.llamagraphics.life-balance.desktop"</span>,
            [<span class="str">".lbe"</span>] = <span class="str">"application/vnd.llamagraphics.life-balance.exchange+xml"</span>,
            [<span class="str">".les"</span>] = <span class="str">"application/vnd.hhe.lesson-player"</span>,
            [<span class="str">".lha"</span>] = <span class="str">"application/x-lzh-compressed"</span>,
            [<span class="str">".library-ms"</span>] = <span class="str">"application/windows-library+xml"</span>,
            [<span class="str">".link66"</span>] = <span class="str">"application/vnd.route66.link66+xml"</span>,
            [<span class="str">".list"</span>] = <span class="str">"text/plain"</span>,
            [<span class="str">".list3820"</span>] = <span class="str">"application/vnd.ibm.modcap"</span>,
            [<span class="str">".listafp"</span>] = <span class="str">"application/vnd.ibm.modcap"</span>,
            [<span class="str">".lit"</span>] = <span class="str">"application/x-ms-reader"</span>,
            [<span class="str">".lnk"</span>] = <span class="str">"application/x-ms-shortcut"</span>,
            [<span class="str">".loadtest"</span>] = <span class="str">"application/xml"</span>,
            [<span class="str">".log"</span>] = <span class="str">"text/plain"</span>,
            [<span class="str">".lostxml"</span>] = <span class="str">"application/lost+xml"</span>,
            [<span class="str">".lpk"</span>] = <span class="str">"application/octet-stream"</span>,
            [<span class="str">".lrf"</span>] = <span class="str">"application/octet-stream"</span>,
            [<span class="str">".lrm"</span>] = <span class="str">"application/vnd.ms-lrm"</span>,
            [<span class="str">".lsf"</span>] = <span class="str">"video/x-la-asf"</span>,
            [<span class="str">".lst"</span>] = <span class="str">"text/plain"</span>,
            [<span class="str">".lsx"</span>] = <span class="str">"video/x-la-asf"</span>,
            [<span class="str">".ltf"</span>] = <span class="str">"application/vnd.frogans.ltf"</span>,
            [<span class="str">".lvp"</span>] = <span class="str">"audio/vnd.lucent.voice"</span>,
            [<span class="str">".lwp"</span>] = <span class="str">"application/vnd.lotus-wordpro"</span>,
            [<span class="str">".lzh"</span>] = <span class="str">"application/octet-stream"</span>,
            [<span class="str">".m13"</span>] = <span class="str">"application/x-msmediaview"</span>,
            [<span class="str">".m14"</span>] = <span class="str">"application/x-msmediaview"</span>,
            [<span class="str">".m1v"</span>] = <span class="str">"video/mpeg"</span>,
            [<span class="str">".m21"</span>] = <span class="str">"application/mp21"</span>,
            [<span class="str">".m2a"</span>] = <span class="str">"audio/mpeg"</span>,
            [<span class="str">".m2t"</span>] = <span class="str">"video/vnd.dlna.mpeg-tts"</span>,
            [<span class="str">".m2ts"</span>] = <span class="str">"video/vnd.dlna.mpeg-tts"</span>,
            [<span class="str">".m2v"</span>] = <span class="str">"video/mpeg"</span>,
            [<span class="str">".m3a"</span>] = <span class="str">"audio/mpeg"</span>,
            [<span class="str">".m3u"</span>] = <span class="str">"audio/x-mpegurl"</span>,
            [<span class="str">".m3u8"</span>] = <span class="str">"audio/x-mpegurl"</span>,
            [<span class="str">".m4a"</span>] = <span class="str">"audio/m4a"</span>,
            [<span class="str">".m4b"</span>] = <span class="str">"audio/m4b"</span>,
            [<span class="str">".m4p"</span>] = <span class="str">"audio/m4p"</span>,
            [<span class="str">".m4r"</span>] = <span class="str">"audio/x-m4r"</span>,
            [<span class="str">".m4u"</span>] = <span class="str">"video/vnd.mpegurl"</span>,
            [<span class="str">".m4v"</span>] = <span class="str">"video/x-m4v"</span>,
            [<span class="str">".ma"</span>] = <span class="str">"application/mathematica"</span>,
            [<span class="str">".mac"</span>] = <span class="str">"image/x-macpaint"</span>,
            [<span class="str">".mads"</span>] = <span class="str">"application/mads+xml"</span>,
            [<span class="str">".mag"</span>] = <span class="str">"application/vnd.ecowin.chart"</span>,
            [<span class="str">".mak"</span>] = <span class="str">"text/plain"</span>,
            [<span class="str">".maker"</span>] = <span class="str">"application/vnd.framemaker"</span>,
            [<span class="str">".man"</span>] = <span class="str">"application/x-troff-man"</span>,
            [<span class="str">".manifest"</span>] = <span class="str">"application/x-ms-manifest"</span>,
            [<span class="str">".map"</span>] = <span class="str">"text/plain"</span>,
            [<span class="str">".mar"</span>] = <span class="str">"application/octet-stream"</span>,
            [<span class="str">".master"</span>] = <span class="str">"application/xml"</span>,
            [<span class="str">".mathml"</span>] = <span class="str">"application/mathml+xml"</span>,
            [<span class="str">".mb"</span>] = <span class="str">"application/mathematica"</span>,
            [<span class="str">".mbk"</span>] = <span class="str">"application/vnd.mobius.mbk"</span>,
            [<span class="str">".mbox"</span>] = <span class="str">"application/mbox"</span>,
            [<span class="str">".mc1"</span>] = <span class="str">"application/vnd.medcalcdata"</span>,
            [<span class="str">".mcd"</span>] = <span class="str">"application/vnd.mcd"</span>,
            [<span class="str">".mcurl"</span>] = <span class="str">"text/vnd.curl.mcurl"</span>,
            [<span class="str">".mda"</span>] = <span class="str">"application/msaccess"</span>,
            [<span class="str">".mdb"</span>] = <span class="str">"application/x-msaccess"</span>,
            [<span class="str">".mde"</span>] = <span class="str">"application/msaccess"</span>,
            [<span class="str">".mdi"</span>] = <span class="str">"image/vnd.ms-modi"</span>,
            [<span class="str">".mdp"</span>] = <span class="str">"application/octet-stream"</span>,
            [<span class="str">".me"</span>] = <span class="str">"application/x-troff-me"</span>,
            [<span class="str">".mesh"</span>] = <span class="str">"model/mesh"</span>,
            [<span class="str">".meta4"</span>] = <span class="str">"application/metalink4+xml"</span>,
            [<span class="str">".metalink"</span>] = <span class="str">"application/metalink+xml"</span>,
            [<span class="str">".mets"</span>] = <span class="str">"application/mets+xml"</span>,
            [<span class="str">".mfm"</span>] = <span class="str">"application/vnd.mfmp"</span>,
            [<span class="str">".mfp"</span>] = <span class="str">"application/x-shockwave-flash"</span>,
            [<span class="str">".mft"</span>] = <span class="str">"application/rpki-manifest"</span>,
            [<span class="str">".mgp"</span>] = <span class="str">"application/vnd.osgeo.mapguide.package"</span>,
            [<span class="str">".mgz"</span>] = <span class="str">"application/vnd.proteus.magazine"</span>,
            [<span class="str">".mht"</span>] = <span class="str">"message/rfc822"</span>,
            [<span class="str">".mhtml"</span>] = <span class="str">"message/rfc822"</span>,
            [<span class="str">".mid"</span>] = <span class="str">"audio/mid"</span>,
            [<span class="str">".midi"</span>] = <span class="str">"audio/mid"</span>,
            [<span class="str">".mie"</span>] = <span class="str">"application/x-mie"</span>,
            [<span class="str">".mif"</span>] = <span class="str">"application/vnd.mif"</span>,
            [<span class="str">".mime"</span>] = <span class="str">"message/rfc822"</span>,
            [<span class="str">".mix"</span>] = <span class="str">"application/octet-stream"</span>,
            [<span class="str">".mj2"</span>] = <span class="str">"video/mj2"</span>,
            [<span class="str">".mjp2"</span>] = <span class="str">"video/mj2"</span>,
            [<span class="str">".mk"</span>] = <span class="str">"text/plain"</span>,
            [<span class="str">".mk3d"</span>] = <span class="str">"video/x-matroska-3d"</span>,
            [<span class="str">".mka"</span>] = <span class="str">"audio/x-matroska"</span>,
            [<span class="str">".mks"</span>] = <span class="str">"video/x-matroska"</span>,
            [<span class="str">".mkv"</span>] = <span class="str">"video/x-matroska"</span>,
            [<span class="str">".mlp"</span>] = <span class="str">"application/vnd.dolby.mlp"</span>,
            [<span class="str">".mmd"</span>] = <span class="str">"application/vnd.chipnuts.karaoke-mmd"</span>,
            [<span class="str">".mmf"</span>] = <span class="str">"application/x-smaf"</span>,
            [<span class="str">".mmr"</span>] = <span class="str">"image/vnd.fujixerox.edmics-mmr"</span>,
            [<span class="str">".mng"</span>] = <span class="str">"video/x-mng"</span>,
            [<span class="str">".mno"</span>] = <span class="str">"text/xml"</span>,
            [<span class="str">".mny"</span>] = <span class="str">"application/x-msmoney"</span>,
            [<span class="str">".mobi"</span>] = <span class="str">"application/x-mobipocket-ebook"</span>,
            [<span class="str">".mod"</span>] = <span class="str">"video/mpeg"</span>,
            [<span class="str">".mods"</span>] = <span class="str">"application/mods+xml"</span>,
            [<span class="str">".mov"</span>] = <span class="str">"video/quicktime"</span>,
            [<span class="str">".movie"</span>] = <span class="str">"video/x-sgi-movie"</span>,
            [<span class="str">".mp2"</span>] = <span class="str">"video/mpeg"</span>,
            [<span class="str">".mp21"</span>] = <span class="str">"application/mp21"</span>,
            [<span class="str">".mp2a"</span>] = <span class="str">"audio/mpeg"</span>,
            [<span class="str">".mp2v"</span>] = <span class="str">"video/mpeg"</span>,
            [<span class="str">".mp3"</span>] = <span class="str">"audio/mpeg"</span>,
            [<span class="str">".mp4"</span>] = <span class="str">"video/mp4"</span>,
            [<span class="str">".mp4a"</span>] = <span class="str">"audio/mp4"</span>,
            [<span class="str">".mp4s"</span>] = <span class="str">"application/mp4"</span>,
            [<span class="str">".mp4v"</span>] = <span class="str">"video/mp4"</span>,
            [<span class="str">".mpa"</span>] = <span class="str">"video/mpeg"</span>,
            [<span class="str">".mpc"</span>] = <span class="str">"application/vnd.mophun.certificate"</span>,
            [<span class="str">".mpe"</span>] = <span class="str">"video/mpeg"</span>,
            [<span class="str">".mpeg"</span>] = <span class="str">"video/mpeg"</span>,
            [<span class="str">".mpf"</span>] = <span class="str">"application/vnd.ms-mediapackage"</span>,
            [<span class="str">".mpg"</span>] = <span class="str">"video/mpeg"</span>,
            [<span class="str">".mpg4"</span>] = <span class="str">"video/mp4"</span>,
            [<span class="str">".mpga"</span>] = <span class="str">"audio/mpeg"</span>,
            [<span class="str">".mpkg"</span>] = <span class="str">"application/vnd.apple.installer+xml"</span>,
            [<span class="str">".mpm"</span>] = <span class="str">"application/vnd.blueice.multipass"</span>,
            [<span class="str">".mpn"</span>] = <span class="str">"application/vnd.mophun.application"</span>,
            [<span class="str">".mpp"</span>] = <span class="str">"application/vnd.ms-project"</span>,
            [<span class="str">".mpt"</span>] = <span class="str">"application/vnd.ms-project"</span>,
            [<span class="str">".mpv2"</span>] = <span class="str">"video/mpeg"</span>,
            [<span class="str">".mpy"</span>] = <span class="str">"application/vnd.ibm.minipay"</span>,
            [<span class="str">".mqv"</span>] = <span class="str">"video/quicktime"</span>,
            [<span class="str">".mqy"</span>] = <span class="str">"application/vnd.mobius.mqy"</span>,
            [<span class="str">".mrc"</span>] = <span class="str">"application/marc"</span>,
            [<span class="str">".mrcx"</span>] = <span class="str">"application/marcxml+xml"</span>,
            [<span class="str">".ms"</span>] = <span class="str">"application/x-troff-ms"</span>,
            [<span class="str">".mscml"</span>] = <span class="str">"application/mediaservercontrol+xml"</span>,
            [<span class="str">".mseed"</span>] = <span class="str">"application/vnd.fdsn.mseed"</span>,
            [<span class="str">".mseq"</span>] = <span class="str">"application/vnd.mseq"</span>,
            [<span class="str">".msf"</span>] = <span class="str">"application/vnd.epson.msf"</span>,
            [<span class="str">".msg"</span>] = <span class="str">"application/vnd.ms-outlook"</span>,
            [<span class="str">".msh"</span>] = <span class="str">"model/mesh"</span>,
            [<span class="str">".msi"</span>] = <span class="str">"application/octet-stream"</span>,
            [<span class="str">".msl"</span>] = <span class="str">"application/vnd.mobius.msl"</span>,
            [<span class="str">".mso"</span>] = <span class="str">"application/octet-stream"</span>,
            [<span class="str">".msty"</span>] = <span class="str">"application/vnd.muvee.style"</span>,
            [<span class="str">".mts"</span>] = <span class="str">"video/vnd.dlna.mpeg-tts"</span>,
            [<span class="str">".mtx"</span>] = <span class="str">"application/xml"</span>,
            [<span class="str">".mus"</span>] = <span class="str">"application/vnd.musician"</span>,
            [<span class="str">".musicxml"</span>] = <span class="str">"application/vnd.recordare.musicxml+xml"</span>,
            [<span class="str">".mvb"</span>] = <span class="str">"application/x-msmediaview"</span>,
            [<span class="str">".mvc"</span>] = <span class="str">"application/x-miva-compiled"</span>,
            [<span class="str">".mwf"</span>] = <span class="str">"application/vnd.mfer"</span>,
            [<span class="str">".mxf"</span>] = <span class="str">"application/mxf"</span>,
            [<span class="str">".mxl"</span>] = <span class="str">"application/vnd.recordare.musicxml"</span>,
            [<span class="str">".mxml"</span>] = <span class="str">"application/xv+xml"</span>,
            [<span class="str">".mxp"</span>] = <span class="str">"application/x-mmxp"</span>,
            [<span class="str">".mxs"</span>] = <span class="str">"application/vnd.triscape.mxs"</span>,
            [<span class="str">".mxu"</span>] = <span class="str">"video/vnd.mpegurl"</span>,
            [<span class="str">".n-gage"</span>] = <span class="str">"application/vnd.nokia.n-gage.symbian.install"</span>,
            [<span class="str">".n3"</span>] = <span class="str">"text/n3"</span>,
            [<span class="str">".nb"</span>] = <span class="str">"application/mathematica"</span>,
            [<span class="str">".nbp"</span>] = <span class="str">"application/vnd.wolfram.player"</span>,
            [<span class="str">".nc"</span>] = <span class="str">"application/x-netcdf"</span>,
            [<span class="str">".ncx"</span>] = <span class="str">"application/x-dtbncx+xml"</span>,
            [<span class="str">".nfo"</span>] = <span class="str">"text/x-nfo"</span>,
            [<span class="str">".ngdat"</span>] = <span class="str">"application/vnd.nokia.n-gage.data"</span>,
            [<span class="str">".nitf"</span>] = <span class="str">"application/vnd.nitf"</span>,
            [<span class="str">".nlu"</span>] = <span class="str">"application/vnd.neurolanguage.nlu"</span>,
            [<span class="str">".nml"</span>] = <span class="str">"application/vnd.enliven"</span>,
            [<span class="str">".nnd"</span>] = <span class="str">"application/vnd.noblenet-directory"</span>,
            [<span class="str">".nns"</span>] = <span class="str">"application/vnd.noblenet-sealer"</span>,
            [<span class="str">".nnw"</span>] = <span class="str">"application/vnd.noblenet-web"</span>,
            [<span class="str">".npx"</span>] = <span class="str">"image/vnd.net-fpx"</span>,
            [<span class="str">".nsc"</span>] = <span class="str">"video/x-ms-asf"</span>,
            [<span class="str">".nsf"</span>] = <span class="str">"application/vnd.lotus-notes"</span>,
            [<span class="str">".ntf"</span>] = <span class="str">"application/vnd.nitf"</span>,
            [<span class="str">".numbers"</span>] = <span class="str">"application/vnd.apple.numbers"</span>,
            [<span class="str">".nws"</span>] = <span class="str">"message/rfc822"</span>,
            [<span class="str">".nzb"</span>] = <span class="str">"application/x-nzb"</span>,
            [<span class="str">".oa2"</span>] = <span class="str">"application/vnd.fujitsu.oasys2"</span>,
            [<span class="str">".oa3"</span>] = <span class="str">"application/vnd.fujitsu.oasys3"</span>,
            [<span class="str">".oas"</span>] = <span class="str">"application/vnd.fujitsu.oasys"</span>,
            [<span class="str">".obd"</span>] = <span class="str">"application/x-msbinder"</span>,
            [<span class="str">".obj"</span>] = <span class="str">"application/x-tgif"</span>,
            [<span class="str">".ocx"</span>] = <span class="str">"application/octet-stream"</span>,
            [<span class="str">".oda"</span>] = <span class="str">"application/oda"</span>,
            [<span class="str">".odb"</span>] = <span class="str">"application/vnd.oasis.opendocument.database"</span>,
            [<span class="str">".odc"</span>] = <span class="str">"application/vnd.oasis.opendocument.chart"</span>,
            [<span class="str">".odf"</span>] = <span class="str">"application/vnd.oasis.opendocument.formula"</span>,
            [<span class="str">".odft"</span>] = <span class="str">"application/vnd.oasis.opendocument.formula-template"</span>,
            [<span class="str">".odg"</span>] = <span class="str">"application/vnd.oasis.opendocument.graphics"</span>,
            [<span class="str">".odh"</span>] = <span class="str">"text/plain"</span>,
            [<span class="str">".odi"</span>] = <span class="str">"application/vnd.oasis.opendocument.image"</span>,
            [<span class="str">".odl"</span>] = <span class="str">"text/plain"</span>,
            [<span class="str">".odm"</span>] = <span class="str">"application/vnd.oasis.opendocument.text-master"</span>,
            [<span class="str">".odp"</span>] = <span class="str">"application/vnd.oasis.opendocument.presentation"</span>,
            [<span class="str">".ods"</span>] = <span class="str">"application/vnd.oasis.opendocument.spreadsheet"</span>,
            [<span class="str">".odt"</span>] = <span class="str">"application/vnd.oasis.opendocument.text"</span>,
            [<span class="str">".oga"</span>] = <span class="str">"audio/ogg"</span>,
            [<span class="str">".ogg"</span>] = <span class="str">"audio/ogg"</span>,
            [<span class="str">".ogv"</span>] = <span class="str">"video/ogg"</span>,
            [<span class="str">".ogx"</span>] = <span class="str">"application/ogg"</span>,
            [<span class="str">".omdoc"</span>] = <span class="str">"application/omdoc+xml"</span>,
            [<span class="str">".one"</span>] = <span class="str">"application/onenote"</span>,
            [<span class="str">".onea"</span>] = <span class="str">"application/onenote"</span>,
            [<span class="str">".onepkg"</span>] = <span class="str">"application/onenote"</span>,
            [<span class="str">".onetmp"</span>] = <span class="str">"application/onenote"</span>,
            [<span class="str">".onetoc"</span>] = <span class="str">"application/onenote"</span>,
            [<span class="str">".onetoc2"</span>] = <span class="str">"application/onenote"</span>,
            [<span class="str">".opf"</span>] = <span class="str">"application/oebps-package+xml"</span>,
            [<span class="str">".opml"</span>] = <span class="str">"text/x-opml"</span>,
            [<span class="str">".oprc"</span>] = <span class="str">"application/vnd.palm"</span>,
            [<span class="str">".opus"</span>] = <span class="str">"audio/ogg"</span>,
            [<span class="str">".orderedtest"</span>] = <span class="str">"application/xml"</span>,
            [<span class="str">".org"</span>] = <span class="str">"application/vnd.lotus-organizer"</span>,
            [<span class="str">".osdx"</span>] = <span class="str">"application/opensearchdescription+xml"</span>,
            [<span class="str">".osf"</span>] = <span class="str">"application/vnd.yamaha.openscoreformat"</span>,
            [<span class="str">".osfpvg"</span>] = <span class="str">"application/vnd.yamaha.openscoreformat.osfpvg+xml"</span>,
            [<span class="str">".otc"</span>] = <span class="str">"application/vnd.oasis.opendocument.chart-template"</span>,
            [<span class="str">".otf"</span>] = <span class="str">"application/font-sfnt"</span>,
            [<span class="str">".otg"</span>] = <span class="str">"application/vnd.oasis.opendocument.graphics-template"</span>,
            [<span class="str">".oth"</span>] = <span class="str">"application/vnd.oasis.opendocument.text-web"</span>,
            [<span class="str">".oti"</span>] = <span class="str">"application/vnd.oasis.opendocument.image-template"</span>,
            [<span class="str">".otp"</span>] = <span class="str">"application/vnd.oasis.opendocument.presentation-template"</span>,
            [<span class="str">".ots"</span>] = <span class="str">"application/vnd.oasis.opendocument.spreadsheet-template"</span>,
            [<span class="str">".ott"</span>] = <span class="str">"application/vnd.oasis.opendocument.text-template"</span>,
            [<span class="str">".oxps"</span>] = <span class="str">"application/oxps"</span>,
            [<span class="str">".oxt"</span>] = <span class="str">"application/vnd.openofficeorg.extension"</span>,
            [<span class="str">".p"</span>] = <span class="str">"text/x-pascal"</span>,
            [<span class="str">".p10"</span>] = <span class="str">"application/pkcs10"</span>,
            [<span class="str">".p12"</span>] = <span class="str">"application/x-pkcs12"</span>,
            [<span class="str">".p7b"</span>] = <span class="str">"application/x-pkcs7-certificates"</span>,
            [<span class="str">".p7c"</span>] = <span class="str">"application/pkcs7-mime"</span>,
            [<span class="str">".p7m"</span>] = <span class="str">"application/pkcs7-mime"</span>,
            [<span class="str">".p7r"</span>] = <span class="str">"application/x-pkcs7-certreqresp"</span>,
            [<span class="str">".p7s"</span>] = <span class="str">"application/pkcs7-signature"</span>,
            [<span class="str">".p8"</span>] = <span class="str">"application/pkcs8"</span>,
            [<span class="str">".pages"</span>] = <span class="str">"application/vnd.apple.pages"</span>,
            [<span class="str">".pas"</span>] = <span class="str">"text/x-pascal"</span>,
            [<span class="str">".paw"</span>] = <span class="str">"application/vnd.pawaafile"</span>,
            [<span class="str">".pbd"</span>] = <span class="str">"application/vnd.powerbuilder6"</span>,
            [<span class="str">".pbm"</span>] = <span class="str">"image/x-portable-bitmap"</span>,
            [<span class="str">".pcap"</span>] = <span class="str">"application/vnd.tcpdump.pcap"</span>,
            [<span class="str">".pcast"</span>] = <span class="str">"application/x-podcast"</span>,
            [<span class="str">".pcf"</span>] = <span class="str">"application/x-font-pcf"</span>,
            [<span class="str">".pcl"</span>] = <span class="str">"application/vnd.hp-pcl"</span>,
            [<span class="str">".pclxl"</span>] = <span class="str">"application/vnd.hp-pclxl"</span>,
            [<span class="str">".pct"</span>] = <span class="str">"image/pict"</span>,
            [<span class="str">".pcurl"</span>] = <span class="str">"application/vnd.curl.pcurl"</span>,
            [<span class="str">".pcx"</span>] = <span class="str">"application/octet-stream"</span>,
            [<span class="str">".pcz"</span>] = <span class="str">"application/octet-stream"</span>,
            [<span class="str">".pdb"</span>] = <span class="str">"application/vnd.palm"</span>,
            [<span class="str">".pdf"</span>] = <span class="str">"application/pdf"</span>,
            [<span class="str">".pfa"</span>] = <span class="str">"application/x-font-type1"</span>,
            [<span class="str">".pfb"</span>] = <span class="str">"application/octet-stream"</span>,
            [<span class="str">".pfm"</span>] = <span class="str">"application/octet-stream"</span>,
            [<span class="str">".pfr"</span>] = <span class="str">"application/font-tdpfr"</span>,
            [<span class="str">".pfx"</span>] = <span class="str">"application/x-pkcs12"</span>,
            [<span class="str">".pgm"</span>] = <span class="str">"image/x-portable-graymap"</span>,
            [<span class="str">".pgn"</span>] = <span class="str">"application/x-chess-pgn"</span>,
            [<span class="str">".pgp"</span>] = <span class="str">"application/pgp-encrypted"</span>,
            [<span class="str">".pic"</span>] = <span class="str">"image/pict"</span>,
            [<span class="str">".pict"</span>] = <span class="str">"image/pict"</span>,
            [<span class="str">".pkg"</span>] = <span class="str">"application/octet-stream"</span>,
            [<span class="str">".pkgdef"</span>] = <span class="str">"text/plain"</span>,
            [<span class="str">".pkgundef"</span>] = <span class="str">"text/plain"</span>,
            [<span class="str">".pki"</span>] = <span class="str">"application/pkixcmp"</span>,
            [<span class="str">".pkipath"</span>] = <span class="str">"application/pkix-pkipath"</span>,
            [<span class="str">".pko"</span>] = <span class="str">"application/vnd.ms-pki.pko"</span>,
            [<span class="str">".plb"</span>] = <span class="str">"application/vnd.3gpp.pic-bw-large"</span>,
            [<span class="str">".plc"</span>] = <span class="str">"application/vnd.mobius.plc"</span>,
            [<span class="str">".plf"</span>] = <span class="str">"application/vnd.pocketlearn"</span>,
            [<span class="str">".pls"</span>] = <span class="str">"audio/scpls"</span>,
            [<span class="str">".pma"</span>] = <span class="str">"application/x-perfmon"</span>,
            [<span class="str">".pmc"</span>] = <span class="str">"application/x-perfmon"</span>,
            [<span class="str">".pml"</span>] = <span class="str">"application/x-perfmon"</span>,
            [<span class="str">".pmr"</span>] = <span class="str">"application/x-perfmon"</span>,
            [<span class="str">".pmw"</span>] = <span class="str">"application/x-perfmon"</span>,
            [<span class="str">".png"</span>] = <span class="str">"image/png"</span>,
            [<span class="str">".pnm"</span>] = <span class="str">"image/x-portable-anymap"</span>,
            [<span class="str">".pnt"</span>] = <span class="str">"image/x-macpaint"</span>,
            [<span class="str">".pntg"</span>] = <span class="str">"image/x-macpaint"</span>,
            [<span class="str">".pnz"</span>] = <span class="str">"image/png"</span>,
            [<span class="str">".portpkg"</span>] = <span class="str">"application/vnd.macports.portpkg"</span>,
            [<span class="str">".pot"</span>] = <span class="str">"application/vnd.ms-powerpoint"</span>,
            [<span class="str">".potm"</span>] = <span class="str">"application/vnd.ms-powerpoint.template.macroEnabled.12"</span>,
            [<span class="str">".potx"</span>] = <span class="str">"application/vnd.openxmlformats-officedocument.presentationml.template"</span>,
            [<span class="str">".ppa"</span>] = <span class="str">"application/vnd.ms-powerpoint"</span>,
            [<span class="str">".ppam"</span>] = <span class="str">"application/vnd.ms-powerpoint.addin.macroEnabled.12"</span>,
            [<span class="str">".ppd"</span>] = <span class="str">"application/vnd.cups-ppd"</span>,
            [<span class="str">".ppm"</span>] = <span class="str">"image/x-portable-pixmap"</span>,
            [<span class="str">".pps"</span>] = <span class="str">"application/vnd.ms-powerpoint"</span>,
            [<span class="str">".ppsm"</span>] = <span class="str">"application/vnd.ms-powerpoint.slideshow.macroEnabled.12"</span>,
            [<span class="str">".ppsx"</span>] = <span class="str">"application/vnd.openxmlformats-officedocument.presentationml.slideshow"</span>,
            [<span class="str">".ppt"</span>] = <span class="str">"application/vnd.ms-powerpoint"</span>,
            [<span class="str">".pptm"</span>] = <span class="str">"application/vnd.ms-powerpoint.presentation.macroEnabled.12"</span>,
            [<span class="str">".pptx"</span>] = <span class="str">"application/vnd.openxmlformats-officedocument.presentationml.presentation"</span>,
            [<span class="str">".pqa"</span>] = <span class="str">"application/vnd.palm"</span>,
            [<span class="str">".prc"</span>] = <span class="str">"application/x-mobipocket-ebook"</span>,
            [<span class="str">".pre"</span>] = <span class="str">"application/vnd.lotus-freelance"</span>,
            [<span class="str">".prf"</span>] = <span class="str">"application/pics-rules"</span>,
            [<span class="str">".prm"</span>] = <span class="str">"application/octet-stream"</span>,
            [<span class="str">".prx"</span>] = <span class="str">"application/octet-stream"</span>,
            [<span class="str">".ps"</span>] = <span class="str">"application/postscript"</span>,
            [<span class="str">".psb"</span>] = <span class="str">"application/vnd.3gpp.pic-bw-small"</span>,
            [<span class="str">".psc1"</span>] = <span class="str">"application/PowerShell"</span>,
            [<span class="str">".psd"</span>] = <span class="str">"application/octet-stream"</span>,
            [<span class="str">".psess"</span>] = <span class="str">"application/xml"</span>,
            [<span class="str">".psf"</span>] = <span class="str">"application/x-font-linux-psf"</span>,
            [<span class="str">".pskcxml"</span>] = <span class="str">"application/pskc+xml"</span>,
            [<span class="str">".psm"</span>] = <span class="str">"application/octet-stream"</span>,
            [<span class="str">".psp"</span>] = <span class="str">"application/octet-stream"</span>,
            [<span class="str">".pst"</span>] = <span class="str">"application/vnd.ms-outlook"</span>,
            [<span class="str">".ptid"</span>] = <span class="str">"application/vnd.pvi.ptid1"</span>,
            [<span class="str">".pub"</span>] = <span class="str">"application/x-mspublisher"</span>,
            [<span class="str">".pvb"</span>] = <span class="str">"application/vnd.3gpp.pic-bw-var"</span>,
            [<span class="str">".pwn"</span>] = <span class="str">"application/vnd.3m.post-it-notes"</span>,
            [<span class="str">".pwz"</span>] = <span class="str">"application/vnd.ms-powerpoint"</span>,
            [<span class="str">".pya"</span>] = <span class="str">"audio/vnd.ms-playready.media.pya"</span>,
            [<span class="str">".pyv"</span>] = <span class="str">"video/vnd.ms-playready.media.pyv"</span>,
            [<span class="str">".qam"</span>] = <span class="str">"application/vnd.epson.quickanime"</span>,
            [<span class="str">".qbo"</span>] = <span class="str">"application/vnd.intu.qbo"</span>,
            [<span class="str">".qfx"</span>] = <span class="str">"application/vnd.intu.qfx"</span>,
            [<span class="str">".qht"</span>] = <span class="str">"text/x-html-insertion"</span>,
            [<span class="str">".qhtm"</span>] = <span class="str">"text/x-html-insertion"</span>,
            [<span class="str">".qps"</span>] = <span class="str">"application/vnd.publishare-delta-tree"</span>,
            [<span class="str">".qt"</span>] = <span class="str">"video/quicktime"</span>,
            [<span class="str">".qti"</span>] = <span class="str">"image/x-quicktime"</span>,
            [<span class="str">".qtif"</span>] = <span class="str">"image/x-quicktime"</span>,
            [<span class="str">".qtl"</span>] = <span class="str">"application/x-quicktimeplayer"</span>,
            [<span class="str">".qwd"</span>] = <span class="str">"application/vnd.quark.quarkxpress"</span>,
            [<span class="str">".qwt"</span>] = <span class="str">"application/vnd.quark.quarkxpress"</span>,
            [<span class="str">".qxb"</span>] = <span class="str">"application/vnd.quark.quarkxpress"</span>,
            [<span class="str">".qxd"</span>] = <span class="str">"application/octet-stream"</span>,
            [<span class="str">".qxl"</span>] = <span class="str">"application/vnd.quark.quarkxpress"</span>,
            [<span class="str">".qxt"</span>] = <span class="str">"application/vnd.quark.quarkxpress"</span>,
            [<span class="str">".ra"</span>] = <span class="str">"audio/x-pn-realaudio"</span>,
            [<span class="str">".ram"</span>] = <span class="str">"audio/x-pn-realaudio"</span>,
            [<span class="str">".rar"</span>] = <span class="str">"application/x-rar-compressed"</span>,
            [<span class="str">".ras"</span>] = <span class="str">"image/x-cmu-raster"</span>,
            [<span class="str">".rat"</span>] = <span class="str">"application/rat-file"</span>,
            [<span class="str">".rc"</span>] = <span class="str">"text/plain"</span>,
            [<span class="str">".rc2"</span>] = <span class="str">"text/plain"</span>,
            [<span class="str">".rcprofile"</span>] = <span class="str">"application/vnd.ipunplugged.rcprofile"</span>,
            [<span class="str">".rct"</span>] = <span class="str">"text/plain"</span>,
            [<span class="str">".rdf"</span>] = <span class="str">"application/rdf+xml"</span>,
            [<span class="str">".rdlc"</span>] = <span class="str">"application/xml"</span>,
            [<span class="str">".rdz"</span>] = <span class="str">"application/vnd.data-vision.rdz"</span>,
            [<span class="str">".reg"</span>] = <span class="str">"text/plain"</span>,
            [<span class="str">".rep"</span>] = <span class="str">"application/vnd.businessobjects"</span>,
            [<span class="str">".res"</span>] = <span class="str">"application/x-dtbresource+xml"</span>,
            [<span class="str">".resx"</span>] = <span class="str">"application/xml"</span>,
            [<span class="str">".rf"</span>] = <span class="str">"image/vnd.rn-realflash"</span>,
            [<span class="str">".rgb"</span>] = <span class="str">"image/x-rgb"</span>,
            [<span class="str">".rgs"</span>] = <span class="str">"text/plain"</span>,
            [<span class="str">".rif"</span>] = <span class="str">"application/reginfo+xml"</span>,
            [<span class="str">".rip"</span>] = <span class="str">"audio/vnd.rip"</span>,
            [<span class="str">".ris"</span>] = <span class="str">"application/x-research-info-systems"</span>,
            [<span class="str">".rl"</span>] = <span class="str">"application/resource-lists+xml"</span>,
            [<span class="str">".rlc"</span>] = <span class="str">"image/vnd.fujixerox.edmics-rlc"</span>,
            [<span class="str">".rld"</span>] = <span class="str">"application/resource-lists-diff+xml"</span>,
            [<span class="str">".rm"</span>] = <span class="str">"application/vnd.rn-realmedia"</span>,
            [<span class="str">".rmi"</span>] = <span class="str">"audio/mid"</span>,
            [<span class="str">".rmp"</span>] = <span class="str">"application/vnd.rn-rn_music_package"</span>,
            [<span class="str">".rms"</span>] = <span class="str">"application/vnd.jcp.javame.midlet-rms"</span>,
            [<span class="str">".rmvb"</span>] = <span class="str">"application/vnd.rn-realmedia-vbr"</span>,
            [<span class="str">".rnc"</span>] = <span class="str">"application/relax-ng-compact-syntax"</span>,
            [<span class="str">".roa"</span>] = <span class="str">"application/rpki-roa"</span>,
            [<span class="str">".roff"</span>] = <span class="str">"application/x-troff"</span>,
            [<span class="str">".rp9"</span>] = <span class="str">"application/vnd.cloanto.rp9"</span>,
            [<span class="str">".rpm"</span>] = <span class="str">"audio/x-pn-realaudio-plugin"</span>,
            [<span class="str">".rpss"</span>] = <span class="str">"application/vnd.nokia.radio-presets"</span>,
            [<span class="str">".rpst"</span>] = <span class="str">"application/vnd.nokia.radio-preset"</span>,
            [<span class="str">".rq"</span>] = <span class="str">"application/sparql-query"</span>,
            [<span class="str">".rqy"</span>] = <span class="str">"text/x-ms-rqy"</span>,
            [<span class="str">".rs"</span>] = <span class="str">"application/rls-services+xml"</span>,
            [<span class="str">".rsd"</span>] = <span class="str">"application/rsd+xml"</span>,
            [<span class="str">".rss"</span>] = <span class="str">"application/rss+xml"</span>,
            [<span class="str">".rtf"</span>] = <span class="str">"application/rtf"</span>,
            [<span class="str">".rtx"</span>] = <span class="str">"text/richtext"</span>,
            [<span class="str">".ruleset"</span>] = <span class="str">"application/xml"</span>,
            [<span class="str">".rvt"</span>] = <span class="str">"application/octet-stream"</span>,
            [<span class="str">".s"</span>] = <span class="str">"text/plain"</span>,
            [<span class="str">".s3m"</span>] = <span class="str">"audio/s3m"</span>,
            [<span class="str">".saf"</span>] = <span class="str">"application/vnd.yamaha.smaf-audio"</span>,
            [<span class="str">".safariextz"</span>] = <span class="str">"application/x-safari-safariextz"</span>,
            [<span class="str">".sbml"</span>] = <span class="str">"application/sbml+xml"</span>,
            [<span class="str">".sc"</span>] = <span class="str">"application/vnd.ibm.secure-container"</span>,
            [<span class="str">".scd"</span>] = <span class="str">"application/x-msschedule"</span>,
            [<span class="str">".scm"</span>] = <span class="str">"application/vnd.lotus-screencam"</span>,
            [<span class="str">".scq"</span>] = <span class="str">"application/scvp-cv-request"</span>,
            [<span class="str">".scr"</span>] = <span class="str">"text/plain"</span>,
            [<span class="str">".scs"</span>] = <span class="str">"application/scvp-cv-response"</span>,
            [<span class="str">".sct"</span>] = <span class="str">"text/scriptlet"</span>,
            [<span class="str">".scurl"</span>] = <span class="str">"text/vnd.curl.scurl"</span>,
            [<span class="str">".sd2"</span>] = <span class="str">"audio/x-sd2"</span>,
            [<span class="str">".sda"</span>] = <span class="str">"application/vnd.stardivision.draw"</span>,
            [<span class="str">".sdc"</span>] = <span class="str">"application/vnd.stardivision.calc"</span>,
            [<span class="str">".sdd"</span>] = <span class="str">"application/vnd.stardivision.impress"</span>,
            [<span class="str">".sdkd"</span>] = <span class="str">"application/vnd.solent.sdkm+xml"</span>,
            [<span class="str">".sdkm"</span>] = <span class="str">"application/vnd.solent.sdkm+xml"</span>,
            [<span class="str">".sdp"</span>] = <span class="str">"application/sdp"</span>,
            [<span class="str">".sdw"</span>] = <span class="str">"application/vnd.stardivision.writer"</span>,
            [<span class="str">".sea"</span>] = <span class="str">"application/octet-stream"</span>,
            [<span class="str">".searchConnector-ms"</span>] = <span class="str">"application/windows-search-connector+xml"</span>,
            [<span class="str">".see"</span>] = <span class="str">"application/vnd.seemail"</span>,
            [<span class="str">".seed"</span>] = <span class="str">"application/vnd.fdsn.seed"</span>,
            [<span class="str">".sema"</span>] = <span class="str">"application/vnd.sema"</span>,
            [<span class="str">".semd"</span>] = <span class="str">"application/vnd.semd"</span>,
            [<span class="str">".semf"</span>] = <span class="str">"application/vnd.semf"</span>,
            [<span class="str">".ser"</span>] = <span class="str">"application/java-serialized-object"</span>,
            [<span class="str">".setpay"</span>] = <span class="str">"application/set-payment-initiation"</span>,
            [<span class="str">".setreg"</span>] = <span class="str">"application/set-registration-initiation"</span>,
            [<span class="str">".settings"</span>] = <span class="str">"application/xml"</span>,
            [<span class="str">".sfd-hdstx"</span>] = <span class="str">"application/vnd.hydrostatix.sof-data"</span>,
            [<span class="str">".sfs"</span>] = <span class="str">"application/vnd.spotfire.sfs"</span>,
            [<span class="str">".sfv"</span>] = <span class="str">"text/x-sfv"</span>,
            [<span class="str">".sgi"</span>] = <span class="str">"image/sgi"</span>,
            [<span class="str">".sgimb"</span>] = <span class="str">"application/x-sgimb"</span>,
            [<span class="str">".sgl"</span>] = <span class="str">"application/vnd.stardivision.writer-global"</span>,
            [<span class="str">".sgm"</span>] = <span class="str">"text/sgml"</span>,
            [<span class="str">".sgml"</span>] = <span class="str">"text/sgml"</span>,
            [<span class="str">".sh"</span>] = <span class="str">"application/x-sh"</span>,
            [<span class="str">".shar"</span>] = <span class="str">"application/x-shar"</span>,
            [<span class="str">".shf"</span>] = <span class="str">"application/shf+xml"</span>,
            [<span class="str">".shtml"</span>] = <span class="str">"text/html"</span>,
            [<span class="str">".sid"</span>] = <span class="str">"image/x-mrsid-image"</span>,
            [<span class="str">".sig"</span>] = <span class="str">"application/pgp-signature"</span>,
            [<span class="str">".sil"</span>] = <span class="str">"audio/silk"</span>,
            [<span class="str">".silo"</span>] = <span class="str">"model/mesh"</span>,
            [<span class="str">".sis"</span>] = <span class="str">"application/vnd.symbian.install"</span>,
            [<span class="str">".sisx"</span>] = <span class="str">"application/vnd.symbian.install"</span>,
            [<span class="str">".sit"</span>] = <span class="str">"application/x-stuffit"</span>,
            [<span class="str">".sitemap"</span>] = <span class="str">"application/xml"</span>,
            [<span class="str">".sitx"</span>] = <span class="str">"application/x-stuffitx"</span>,
            [<span class="str">".skd"</span>] = <span class="str">"application/vnd.koan"</span>,
            [<span class="str">".skin"</span>] = <span class="str">"application/xml"</span>,
            [<span class="str">".skm"</span>] = <span class="str">"application/vnd.koan"</span>,
            [<span class="str">".skp"</span>] = <span class="str">"application/x-koan"</span>,
            [<span class="str">".skt"</span>] = <span class="str">"application/vnd.koan"</span>,
            [<span class="str">".sldm"</span>] = <span class="str">"application/vnd.ms-powerpoint.slide.macroEnabled.12"</span>,
            [<span class="str">".sldx"</span>] = <span class="str">"application/vnd.openxmlformats-officedocument.presentationml.slide"</span>,
            [<span class="str">".slk"</span>] = <span class="str">"application/vnd.ms-excel"</span>,
            [<span class="str">".sln"</span>] = <span class="str">"text/plain"</span>,
            [<span class="str">".slt"</span>] = <span class="str">"application/vnd.epson.salt"</span>,
            [<span class="str">".slupkg-ms"</span>] = <span class="str">"application/x-ms-license"</span>,
            [<span class="str">".sm"</span>] = <span class="str">"application/vnd.stepmania.stepchart"</span>,
            [<span class="str">".smd"</span>] = <span class="str">"audio/x-smd"</span>,
            [<span class="str">".smf"</span>] = <span class="str">"application/vnd.stardivision.math"</span>,
            [<span class="str">".smi"</span>] = <span class="str">"application/octet-stream"</span>,
            [<span class="str">".smil"</span>] = <span class="str">"application/smil+xml"</span>,
            [<span class="str">".smv"</span>] = <span class="str">"video/x-smv"</span>,
            [<span class="str">".smx"</span>] = <span class="str">"audio/x-smd"</span>,
            [<span class="str">".smz"</span>] = <span class="str">"audio/x-smd"</span>,
            [<span class="str">".smzip"</span>] = <span class="str">"application/vnd.stepmania.package"</span>,
            [<span class="str">".snd"</span>] = <span class="str">"audio/basic"</span>,
            [<span class="str">".snf"</span>] = <span class="str">"application/x-font-snf"</span>,
            [<span class="str">".snippet"</span>] = <span class="str">"application/xml"</span>,
            [<span class="str">".snp"</span>] = <span class="str">"application/octet-stream"</span>,
            [<span class="str">".so"</span>] = <span class="str">"application/octet-stream"</span>,
            [<span class="str">".sol"</span>] = <span class="str">"text/plain"</span>,
            [<span class="str">".sor"</span>] = <span class="str">"text/plain"</span>,
            [<span class="str">".spc"</span>] = <span class="str">"application/x-pkcs7-certificates"</span>,
            [<span class="str">".spf"</span>] = <span class="str">"application/vnd.yamaha.smaf-phrase"</span>,
            [<span class="str">".spl"</span>] = <span class="str">"application/futuresplash"</span>,
            [<span class="str">".spot"</span>] = <span class="str">"text/vnd.in3d.spot"</span>,
            [<span class="str">".spp"</span>] = <span class="str">"application/scvp-vp-response"</span>,
            [<span class="str">".spq"</span>] = <span class="str">"application/scvp-vp-request"</span>,
            [<span class="str">".spx"</span>] = <span class="str">"audio/ogg"</span>,
            [<span class="str">".sql"</span>] = <span class="str">"application/sql"</span>,
            [<span class="str">".src"</span>] = <span class="str">"application/x-wais-source"</span>,
            [<span class="str">".srf"</span>] = <span class="str">"text/plain"</span>,
            [<span class="str">".srt"</span>] = <span class="str">"application/x-subrip"</span>,
            [<span class="str">".sru"</span>] = <span class="str">"application/sru+xml"</span>,
            [<span class="str">".srx"</span>] = <span class="str">"application/sparql-results+xml"</span>,
            [<span class="str">".ssdl"</span>] = <span class="str">"application/ssdl+xml"</span>,
            [<span class="str">".sse"</span>] = <span class="str">"application/vnd.kodak-descriptor"</span>,
            [<span class="str">".ssf"</span>] = <span class="str">"application/vnd.epson.ssf"</span>,
            [<span class="str">".SSISDeploymentManifest"</span>] = <span class="str">"text/xml"</span>,
            [<span class="str">".ssm"</span>] = <span class="str">"application/streamingmedia"</span>,
            [<span class="str">".ssml"</span>] = <span class="str">"application/ssml+xml"</span>,
            [<span class="str">".sst"</span>] = <span class="str">"application/vnd.ms-pki.certstore"</span>,
            [<span class="str">".st"</span>] = <span class="str">"application/vnd.sailingtracker.track"</span>,
            [<span class="str">".stc"</span>] = <span class="str">"application/vnd.sun.xml.calc.template"</span>,
            [<span class="str">".std"</span>] = <span class="str">"application/vnd.sun.xml.draw.template"</span>,
            [<span class="str">".step"</span>] = <span class="str">"application/step"</span>,
            [<span class="str">".stf"</span>] = <span class="str">"application/vnd.wt.stf"</span>,
            [<span class="str">".sti"</span>] = <span class="str">"application/vnd.sun.xml.impress.template"</span>,
            [<span class="str">".stk"</span>] = <span class="str">"application/hyperstudio"</span>,
            [<span class="str">".stl"</span>] = <span class="str">"application/vnd.ms-pki.stl"</span>,
            [<span class="str">".stp"</span>] = <span class="str">"application/step"</span>,
            [<span class="str">".str"</span>] = <span class="str">"application/vnd.pg.format"</span>,
            [<span class="str">".stw"</span>] = <span class="str">"application/vnd.sun.xml.writer.template"</span>,
            [<span class="str">".sub"</span>] = <span class="str">"image/vnd.dvb.subtitle"</span>,
            [<span class="str">".sus"</span>] = <span class="str">"application/vnd.sus-calendar"</span>,
            [<span class="str">".susp"</span>] = <span class="str">"application/vnd.sus-calendar"</span>,
            [<span class="str">".sv4cpio"</span>] = <span class="str">"application/x-sv4cpio"</span>,
            [<span class="str">".sv4crc"</span>] = <span class="str">"application/x-sv4crc"</span>,
            [<span class="str">".svc"</span>] = <span class="str">"application/xml"</span>,
            [<span class="str">".svd"</span>] = <span class="str">"application/vnd.svd"</span>,
            [<span class="str">".svg"</span>] = <span class="str">"image/svg+xml"</span>,
            [<span class="str">".svgz"</span>] = <span class="str">"image/svg+xml"</span>,
            [<span class="str">".swa"</span>] = <span class="str">"application/x-director"</span>,
            [<span class="str">".swf"</span>] = <span class="str">"application/x-shockwave-flash"</span>,
            [<span class="str">".swi"</span>] = <span class="str">"application/vnd.aristanetworks.swi"</span>,
            [<span class="str">".sxc"</span>] = <span class="str">"application/vnd.sun.xml.calc"</span>,
            [<span class="str">".sxd"</span>] = <span class="str">"application/vnd.sun.xml.draw"</span>,
            [<span class="str">".sxg"</span>] = <span class="str">"application/vnd.sun.xml.writer.global"</span>,
            [<span class="str">".sxi"</span>] = <span class="str">"application/vnd.sun.xml.impress"</span>,
            [<span class="str">".sxm"</span>] = <span class="str">"application/vnd.sun.xml.math"</span>,
            [<span class="str">".sxw"</span>] = <span class="str">"application/vnd.sun.xml.writer"</span>,
            [<span class="str">".t"</span>] = <span class="str">"application/x-troff"</span>,
            [<span class="str">".t3"</span>] = <span class="str">"application/x-t3vm-image"</span>,
            [<span class="str">".taglet"</span>] = <span class="str">"application/vnd.mynfc"</span>,
            [<span class="str">".tao"</span>] = <span class="str">"application/vnd.tao.intent-module-archive"</span>,
            [<span class="str">".tar"</span>] = <span class="str">"application/x-tar"</span>,
            [<span class="str">".tcap"</span>] = <span class="str">"application/vnd.3gpp2.tcap"</span>,
            [<span class="str">".tcl"</span>] = <span class="str">"application/x-tcl"</span>,
            [<span class="str">".teacher"</span>] = <span class="str">"application/vnd.smart.teacher"</span>,
            [<span class="str">".tei"</span>] = <span class="str">"application/tei+xml"</span>,
            [<span class="str">".teicorpus"</span>] = <span class="str">"application/tei+xml"</span>,
            [<span class="str">".testrunconfig"</span>] = <span class="str">"application/xml"</span>,
            [<span class="str">".testsettings"</span>] = <span class="str">"application/xml"</span>,
            [<span class="str">".tex"</span>] = <span class="str">"application/x-tex"</span>,
            [<span class="str">".texi"</span>] = <span class="str">"application/x-texinfo"</span>,
            [<span class="str">".texinfo"</span>] = <span class="str">"application/x-texinfo"</span>,
            [<span class="str">".text"</span>] = <span class="str">"text/plain"</span>,
            [<span class="str">".tfi"</span>] = <span class="str">"application/thraud+xml"</span>,
            [<span class="str">".tfm"</span>] = <span class="str">"application/x-tex-tfm"</span>,
            [<span class="str">".tga"</span>] = <span class="str">"image/x-tga"</span>,
            [<span class="str">".tgz"</span>] = <span class="str">"application/x-compressed"</span>,
            [<span class="str">".thmx"</span>] = <span class="str">"application/vnd.ms-officetheme"</span>,
            [<span class="str">".thn"</span>] = <span class="str">"application/octet-stream"</span>,
            [<span class="str">".tif"</span>] = <span class="str">"image/tiff"</span>,
            [<span class="str">".tiff"</span>] = <span class="str">"image/tiff"</span>,
            [<span class="str">".tlh"</span>] = <span class="str">"text/plain"</span>,
            [<span class="str">".tli"</span>] = <span class="str">"text/plain"</span>,
            [<span class="str">".tmo"</span>] = <span class="str">"application/vnd.tmobile-livetv"</span>,
            [<span class="str">".toc"</span>] = <span class="str">"application/octet-stream"</span>,
            [<span class="str">".torrent"</span>] = <span class="str">"application/x-bittorrent"</span>,
            [<span class="str">".tpl"</span>] = <span class="str">"application/vnd.groove-tool-template"</span>,
            [<span class="str">".tpt"</span>] = <span class="str">"application/vnd.trid.tpt"</span>,
            [<span class="str">".tr"</span>] = <span class="str">"application/x-troff"</span>,
            [<span class="str">".tra"</span>] = <span class="str">"application/vnd.trueapp"</span>,
            [<span class="str">".trm"</span>] = <span class="str">"application/x-msterminal"</span>,
            [<span class="str">".trx"</span>] = <span class="str">"application/xml"</span>,
            [<span class="str">".ts"</span>] = <span class="str">"video/vnd.dlna.mpeg-tts"</span>,
            [<span class="str">".tsd"</span>] = <span class="str">"application/timestamped-data"</span>,
            [<span class="str">".tsv"</span>] = <span class="str">"text/tab-separated-values"</span>,
            [<span class="str">".ttc"</span>] = <span class="str">"font/collection"</span>,
            [<span class="str">".ttf"</span>] = <span class="str">"application/font-sfnt"</span>,
            [<span class="str">".ttl"</span>] = <span class="str">"text/turtle"</span>,
            [<span class="str">".tts"</span>] = <span class="str">"video/vnd.dlna.mpeg-tts"</span>,
            [<span class="str">".twd"</span>] = <span class="str">"application/vnd.simtech-mindmapper"</span>,
            [<span class="str">".twds"</span>] = <span class="str">"application/vnd.simtech-mindmapper"</span>,
            [<span class="str">".txd"</span>] = <span class="str">"application/vnd.genomatix.tuxedo"</span>,
            [<span class="str">".txf"</span>] = <span class="str">"application/vnd.mobius.txf"</span>,
            [<span class="str">".txt"</span>] = <span class="str">"text/plain"</span>,
            [<span class="str">".u32"</span>] = <span class="str">"application/octet-stream"</span>,
            [<span class="str">".udeb"</span>] = <span class="str">"application/x-debian-package"</span>,
            [<span class="str">".ufd"</span>] = <span class="str">"application/vnd.ufdl"</span>,
            [<span class="str">".ufdl"</span>] = <span class="str">"application/vnd.ufdl"</span>,
            [<span class="str">".uls"</span>] = <span class="str">"text/iuls"</span>,
            [<span class="str">".ulx"</span>] = <span class="str">"application/x-glulx"</span>,
            [<span class="str">".umj"</span>] = <span class="str">"application/vnd.umajin"</span>,
            [<span class="str">".unityweb"</span>] = <span class="str">"application/vnd.unity"</span>,
            [<span class="str">".uoml"</span>] = <span class="str">"application/vnd.uoml+xml"</span>,
            [<span class="str">".uri"</span>] = <span class="str">"text/uri-list"</span>,
            [<span class="str">".uris"</span>] = <span class="str">"text/uri-list"</span>,
            [<span class="str">".urls"</span>] = <span class="str">"text/uri-list"</span>,
            [<span class="str">".user"</span>] = <span class="str">"text/plain"</span>,
            [<span class="str">".ustar"</span>] = <span class="str">"application/x-ustar"</span>,
            [<span class="str">".utz"</span>] = <span class="str">"application/vnd.uiq.theme"</span>,
            [<span class="str">".uu"</span>] = <span class="str">"text/x-uuencode"</span>,
            [<span class="str">".uva"</span>] = <span class="str">"audio/vnd.dece.audio"</span>,
            [<span class="str">".uvd"</span>] = <span class="str">"application/vnd.dece.data"</span>,
            [<span class="str">".uvf"</span>] = <span class="str">"application/vnd.dece.data"</span>,
            [<span class="str">".uvg"</span>] = <span class="str">"image/vnd.dece.graphic"</span>,
            [<span class="str">".uvh"</span>] = <span class="str">"video/vnd.dece.hd"</span>,
            [<span class="str">".uvi"</span>] = <span class="str">"image/vnd.dece.graphic"</span>,
            [<span class="str">".uvm"</span>] = <span class="str">"video/vnd.dece.mobile"</span>,
            [<span class="str">".uvp"</span>] = <span class="str">"video/vnd.dece.pd"</span>,
            [<span class="str">".uvs"</span>] = <span class="str">"video/vnd.dece.sd"</span>,
            [<span class="str">".uvt"</span>] = <span class="str">"application/vnd.dece.ttml+xml"</span>,
            [<span class="str">".uvu"</span>] = <span class="str">"video/vnd.uvvu.mp4"</span>,
            [<span class="str">".uvv"</span>] = <span class="str">"video/vnd.dece.video"</span>,
            [<span class="str">".uvva"</span>] = <span class="str">"audio/vnd.dece.audio"</span>,
            [<span class="str">".uvvd"</span>] = <span class="str">"application/vnd.dece.data"</span>,
            [<span class="str">".uvvf"</span>] = <span class="str">"application/vnd.dece.data"</span>,
            [<span class="str">".uvvg"</span>] = <span class="str">"image/vnd.dece.graphic"</span>,
            [<span class="str">".uvvh"</span>] = <span class="str">"video/vnd.dece.hd"</span>,
            [<span class="str">".uvvi"</span>] = <span class="str">"image/vnd.dece.graphic"</span>,
            [<span class="str">".uvvm"</span>] = <span class="str">"video/vnd.dece.mobile"</span>,
            [<span class="str">".uvvp"</span>] = <span class="str">"video/vnd.dece.pd"</span>,
            [<span class="str">".uvvs"</span>] = <span class="str">"video/vnd.dece.sd"</span>,
            [<span class="str">".uvvt"</span>] = <span class="str">"application/vnd.dece.ttml+xml"</span>,
            [<span class="str">".uvvu"</span>] = <span class="str">"video/vnd.uvvu.mp4"</span>,
            [<span class="str">".uvvv"</span>] = <span class="str">"video/vnd.dece.video"</span>,
            [<span class="str">".uvvx"</span>] = <span class="str">"application/vnd.dece.unspecified"</span>,
            [<span class="str">".uvvz"</span>] = <span class="str">"application/vnd.dece.zip"</span>,
            [<span class="str">".uvx"</span>] = <span class="str">"application/vnd.dece.unspecified"</span>,
            [<span class="str">".uvz"</span>] = <span class="str">"application/vnd.dece.zip"</span>,
            [<span class="str">".vb"</span>] = <span class="str">"text/plain"</span>,
            [<span class="str">".vbdproj"</span>] = <span class="str">"text/plain"</span>,
            [<span class="str">".vbk"</span>] = <span class="str">"video/mpeg"</span>,
            [<span class="str">".vbproj"</span>] = <span class="str">"text/plain"</span>,
            [<span class="str">".vbs"</span>] = <span class="str">"text/vbscript"</span>,
            [<span class="str">".vcard"</span>] = <span class="str">"text/vcard"</span>,
            [<span class="str">".vcd"</span>] = <span class="str">"application/x-cdlink"</span>,
            [<span class="str">".vcf"</span>] = <span class="str">"text/x-vcard"</span>,
            [<span class="str">".vcg"</span>] = <span class="str">"application/vnd.groove-vcard"</span>,
            [<span class="str">".vcproj"</span>] = <span class="str">"application/xml"</span>,
            [<span class="str">".vcs"</span>] = <span class="str">"text/plain"</span>,
            [<span class="str">".vcx"</span>] = <span class="str">"application/vnd.vcx"</span>,
            [<span class="str">".vcxproj"</span>] = <span class="str">"application/xml"</span>,
            [<span class="str">".vddproj"</span>] = <span class="str">"text/plain"</span>,
            [<span class="str">".vdp"</span>] = <span class="str">"text/plain"</span>,
            [<span class="str">".vdproj"</span>] = <span class="str">"text/plain"</span>,
            [<span class="str">".vdx"</span>] = <span class="str">"application/vnd.ms-visio.viewer"</span>,
            [<span class="str">".vis"</span>] = <span class="str">"application/vnd.visionary"</span>,
            [<span class="str">".viv"</span>] = <span class="str">"video/vnd.vivo"</span>,
            [<span class="str">".vml"</span>] = <span class="str">"text/xml"</span>,
            [<span class="str">".vob"</span>] = <span class="str">"video/x-ms-vob"</span>,
            [<span class="str">".vor"</span>] = <span class="str">"application/vnd.stardivision.writer"</span>,
            [<span class="str">".vox"</span>] = <span class="str">"application/x-authorware-bin"</span>,
            [<span class="str">".vrml"</span>] = <span class="str">"model/vrml"</span>,
            [<span class="str">".vscontent"</span>] = <span class="str">"application/xml"</span>,
            [<span class="str">".vsct"</span>] = <span class="str">"text/xml"</span>,
            [<span class="str">".vsd"</span>] = <span class="str">"application/vnd.visio"</span>,
            [<span class="str">".vsf"</span>] = <span class="str">"application/vnd.vsf"</span>,
            [<span class="str">".vsi"</span>] = <span class="str">"application/ms-vsi"</span>,
            [<span class="str">".vsix"</span>] = <span class="str">"application/vsix"</span>,
            [<span class="str">".vsixlangpack"</span>] = <span class="str">"text/xml"</span>,
            [<span class="str">".vsixmanifest"</span>] = <span class="str">"text/xml"</span>,
            [<span class="str">".vsmdi"</span>] = <span class="str">"application/xml"</span>,
            [<span class="str">".vspscc"</span>] = <span class="str">"text/plain"</span>,
            [<span class="str">".vss"</span>] = <span class="str">"application/vnd.visio"</span>,
            [<span class="str">".vsscc"</span>] = <span class="str">"text/plain"</span>,
            [<span class="str">".vssettings"</span>] = <span class="str">"text/xml"</span>,
            [<span class="str">".vssscc"</span>] = <span class="str">"text/plain"</span>,
            [<span class="str">".vst"</span>] = <span class="str">"application/vnd.visio"</span>,
            [<span class="str">".vstemplate"</span>] = <span class="str">"text/xml"</span>,
            [<span class="str">".vsto"</span>] = <span class="str">"application/x-ms-vsto"</span>,
            [<span class="str">".vsw"</span>] = <span class="str">"application/vnd.visio"</span>,
            [<span class="str">".vsx"</span>] = <span class="str">"application/vnd.visio"</span>,
            [<span class="str">".vtt"</span>] = <span class="str">"text/vtt"</span>,
            [<span class="str">".vtu"</span>] = <span class="str">"model/vnd.vtu"</span>,
            [<span class="str">".vtx"</span>] = <span class="str">"application/vnd.visio"</span>,
            [<span class="str">".vxml"</span>] = <span class="str">"application/voicexml+xml"</span>,
            [<span class="str">".w3d"</span>] = <span class="str">"application/x-director"</span>,
            [<span class="str">".wad"</span>] = <span class="str">"application/x-doom"</span>,
            [<span class="str">".wasm"</span>] = <span class="str">"application/wasm"</span>,
            [<span class="str">".wav"</span>] = <span class="str">"audio/wav"</span>,
            [<span class="str">".wave"</span>] = <span class="str">"audio/wav"</span>,
            [<span class="str">".wax"</span>] = <span class="str">"audio/x-ms-wax"</span>,
            [<span class="str">".wbk"</span>] = <span class="str">"application/msword"</span>,
            [<span class="str">".wbmp"</span>] = <span class="str">"image/vnd.wap.wbmp"</span>,
            [<span class="str">".wbs"</span>] = <span class="str">"application/vnd.criticaltools.wbs+xml"</span>,
            [<span class="str">".wbxml"</span>] = <span class="str">"application/vnd.wap.wbxml"</span>,
            [<span class="str">".wcm"</span>] = <span class="str">"application/vnd.ms-works"</span>,
            [<span class="str">".wdb"</span>] = <span class="str">"application/vnd.ms-works"</span>,
            [<span class="str">".wdp"</span>] = <span class="str">"image/vnd.ms-photo"</span>,
            [<span class="str">".weba"</span>] = <span class="str">"audio/webm"</span>,
            [<span class="str">".webarchive"</span>] = <span class="str">"application/x-safari-webarchive"</span>,
            [<span class="str">".webm"</span>] = <span class="str">"video/webm"</span>,
            [<span class="str">".webp"</span>] = <span class="str">"image/webp"</span>,
            [<span class="str">".webtest"</span>] = <span class="str">"application/xml"</span>,
            [<span class="str">".wg"</span>] = <span class="str">"application/vnd.pmi.widget"</span>,
            [<span class="str">".wgt"</span>] = <span class="str">"application/widget"</span>,
            [<span class="str">".wiq"</span>] = <span class="str">"application/xml"</span>,
            [<span class="str">".wiz"</span>] = <span class="str">"application/msword"</span>,
            [<span class="str">".wks"</span>] = <span class="str">"application/vnd.ms-works"</span>,
            [<span class="str">".WLMP"</span>] = <span class="str">"application/wlmoviemaker"</span>,
            [<span class="str">".wlpginstall"</span>] = <span class="str">"application/x-wlpg-detect"</span>,
            [<span class="str">".wlpginstall3"</span>] = <span class="str">"application/x-wlpg3-detect"</span>,
            [<span class="str">".wm"</span>] = <span class="str">"video/x-ms-wm"</span>,
            [<span class="str">".wma"</span>] = <span class="str">"audio/x-ms-wma"</span>,
            [<span class="str">".wmd"</span>] = <span class="str">"application/x-ms-wmd"</span>,
            [<span class="str">".wmf"</span>] = <span class="str">"application/x-msmetafile"</span>,
            [<span class="str">".wml"</span>] = <span class="str">"text/vnd.wap.wml"</span>,
            [<span class="str">".wmlc"</span>] = <span class="str">"application/vnd.wap.wmlc"</span>,
            [<span class="str">".wmls"</span>] = <span class="str">"text/vnd.wap.wmlscript"</span>,
            [<span class="str">".wmlsc"</span>] = <span class="str">"application/vnd.wap.wmlscriptc"</span>,
            [<span class="str">".wmp"</span>] = <span class="str">"video/x-ms-wmp"</span>,
            [<span class="str">".wmv"</span>] = <span class="str">"video/x-ms-wmv"</span>,
            [<span class="str">".wmx"</span>] = <span class="str">"video/x-ms-wmx"</span>,
            [<span class="str">".wmz"</span>] = <span class="str">"application/x-ms-wmz"</span>,
            [<span class="str">".woff"</span>] = <span class="str">"application/font-woff"</span>,
            [<span class="str">".woff2"</span>] = <span class="str">"application/font-woff2"</span>,
            [<span class="str">".wpd"</span>] = <span class="str">"application/vnd.wordperfect"</span>,
            [<span class="str">".wpl"</span>] = <span class="str">"application/vnd.ms-wpl"</span>,
            [<span class="str">".wps"</span>] = <span class="str">"application/vnd.ms-works"</span>,
            [<span class="str">".wqd"</span>] = <span class="str">"application/vnd.wqd"</span>,
            [<span class="str">".wri"</span>] = <span class="str">"application/x-mswrite"</span>,
            [<span class="str">".wrl"</span>] = <span class="str">"x-world/x-vrml"</span>,
            [<span class="str">".wrz"</span>] = <span class="str">"x-world/x-vrml"</span>,
            [<span class="str">".wsc"</span>] = <span class="str">"text/scriptlet"</span>,
            [<span class="str">".wsdl"</span>] = <span class="str">"text/xml"</span>,
            [<span class="str">".wspolicy"</span>] = <span class="str">"application/wspolicy+xml"</span>,
            [<span class="str">".wtb"</span>] = <span class="str">"application/vnd.webturbo"</span>,
            [<span class="str">".wvx"</span>] = <span class="str">"video/x-ms-wvx"</span>,
            [<span class="str">".x"</span>] = <span class="str">"application/directx"</span>,
            [<span class="str">".x32"</span>] = <span class="str">"application/x-authorware-bin"</span>,
            [<span class="str">".x3d"</span>] = <span class="str">"model/x3d+xml"</span>,
            [<span class="str">".x3db"</span>] = <span class="str">"model/x3d+binary"</span>,
            [<span class="str">".x3dbz"</span>] = <span class="str">"model/x3d+binary"</span>,
            [<span class="str">".x3dv"</span>] = <span class="str">"model/x3d+vrml"</span>,
            [<span class="str">".x3dvz"</span>] = <span class="str">"model/x3d+vrml"</span>,
            [<span class="str">".x3dz"</span>] = <span class="str">"model/x3d+xml"</span>,
            [<span class="str">".xaf"</span>] = <span class="str">"x-world/x-vrml"</span>,
            [<span class="str">".xaml"</span>] = <span class="str">"application/xaml+xml"</span>,
            [<span class="str">".xap"</span>] = <span class="str">"application/x-silverlight-app"</span>,
            [<span class="str">".xar"</span>] = <span class="str">"application/vnd.xara"</span>,
            [<span class="str">".xbap"</span>] = <span class="str">"application/x-ms-xbap"</span>,
            [<span class="str">".xbd"</span>] = <span class="str">"application/vnd.fujixerox.docuworks.binder"</span>,
            [<span class="str">".xbm"</span>] = <span class="str">"image/x-xbitmap"</span>,
            [<span class="str">".xdf"</span>] = <span class="str">"application/xcap-diff+xml"</span>,
            [<span class="str">".xdm"</span>] = <span class="str">"application/vnd.syncml.dm+xml"</span>,
            [<span class="str">".xdp"</span>] = <span class="str">"application/vnd.adobe.xdp+xml"</span>,
            [<span class="str">".xdr"</span>] = <span class="str">"text/plain"</span>,
            [<span class="str">".xdssc"</span>] = <span class="str">"application/dssc+xml"</span>,
            [<span class="str">".xdw"</span>] = <span class="str">"application/vnd.fujixerox.docuworks"</span>,
            [<span class="str">".xenc"</span>] = <span class="str">"application/xenc+xml"</span>,
            [<span class="str">".xer"</span>] = <span class="str">"application/patch-ops-error+xml"</span>,
            [<span class="str">".xfdf"</span>] = <span class="str">"application/vnd.adobe.xfdf"</span>,
            [<span class="str">".xfdl"</span>] = <span class="str">"application/vnd.xfdl"</span>,
            [<span class="str">".xht"</span>] = <span class="str">"application/xhtml+xml"</span>,
            [<span class="str">".xhtml"</span>] = <span class="str">"application/xhtml+xml"</span>,
            [<span class="str">".xhvml"</span>] = <span class="str">"application/xv+xml"</span>,
            [<span class="str">".xif"</span>] = <span class="str">"image/vnd.xiff"</span>,
            [<span class="str">".xla"</span>] = <span class="str">"application/vnd.ms-excel"</span>,
            [<span class="str">".xlam"</span>] = <span class="str">"application/vnd.ms-excel.addin.macroEnabled.12"</span>,
            [<span class="str">".xlc"</span>] = <span class="str">"application/vnd.ms-excel"</span>,
            [<span class="str">".xld"</span>] = <span class="str">"application/vnd.ms-excel"</span>,
            [<span class="str">".xlf"</span>] = <span class="str">"application/x-xliff+xml"</span>,
            [<span class="str">".xlk"</span>] = <span class="str">"application/vnd.ms-excel"</span>,
            [<span class="str">".xll"</span>] = <span class="str">"application/vnd.ms-excel"</span>,
            [<span class="str">".xlm"</span>] = <span class="str">"application/vnd.ms-excel"</span>,
            [<span class="str">".xls"</span>] = <span class="str">"application/vnd.ms-excel"</span>,
            [<span class="str">".xlsb"</span>] = <span class="str">"application/vnd.ms-excel.sheet.binary.macroEnabled.12"</span>,
            [<span class="str">".xlsm"</span>] = <span class="str">"application/vnd.ms-excel.sheet.macroEnabled.12"</span>,
            [<span class="str">".xlsx"</span>] = <span class="str">"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"</span>,
            [<span class="str">".xlt"</span>] = <span class="str">"application/vnd.ms-excel"</span>,
            [<span class="str">".xltm"</span>] = <span class="str">"application/vnd.ms-excel.template.macroEnabled.12"</span>,
            [<span class="str">".xltx"</span>] = <span class="str">"application/vnd.openxmlformats-officedocument.spreadsheetml.template"</span>,
            [<span class="str">".xlw"</span>] = <span class="str">"application/vnd.ms-excel"</span>,
            [<span class="str">".xm"</span>] = <span class="str">"audio/xm"</span>,
            [<span class="str">".xml"</span>] = <span class="str">"text/xml"</span>,
            [<span class="str">".xmp"</span>] = <span class="str">"application/octet-stream"</span>,
            [<span class="str">".xmta"</span>] = <span class="str">"application/xml"</span>,
            [<span class="str">".xo"</span>] = <span class="str">"application/vnd.olpc-sugar"</span>,
            [<span class="str">".xof"</span>] = <span class="str">"x-world/x-vrml"</span>,
            [<span class="str">".XOML"</span>] = <span class="str">"text/plain"</span>,
            [<span class="str">".xop"</span>] = <span class="str">"application/xop+xml"</span>,
            [<span class="str">".xpi"</span>] = <span class="str">"application/x-xpinstall"</span>,
            [<span class="str">".xpl"</span>] = <span class="str">"application/xproc+xml"</span>,
            [<span class="str">".xpm"</span>] = <span class="str">"image/x-xpixmap"</span>,
            [<span class="str">".xpr"</span>] = <span class="str">"application/vnd.is-xpr"</span>,
            [<span class="str">".xps"</span>] = <span class="str">"application/vnd.ms-xpsdocument"</span>,
            [<span class="str">".xpw"</span>] = <span class="str">"application/vnd.intercon.formnet"</span>,
            [<span class="str">".xpx"</span>] = <span class="str">"application/vnd.intercon.formnet"</span>,
            [<span class="str">".xrm-ms"</span>] = <span class="str">"text/xml"</span>,
            [<span class="str">".xsc"</span>] = <span class="str">"application/xml"</span>,
            [<span class="str">".xsd"</span>] = <span class="str">"text/xml"</span>,
            [<span class="str">".xsf"</span>] = <span class="str">"text/xml"</span>,
            [<span class="str">".xsl"</span>] = <span class="str">"text/xml"</span>,
            [<span class="str">".xslt"</span>] = <span class="str">"text/xml"</span>,
            [<span class="str">".xsm"</span>] = <span class="str">"application/vnd.syncml+xml"</span>,
            [<span class="str">".xsn"</span>] = <span class="str">"application/octet-stream"</span>,
            [<span class="str">".xspf"</span>] = <span class="str">"application/xspf+xml"</span>,
            [<span class="str">".xss"</span>] = <span class="str">"application/xml"</span>,
            [<span class="str">".xtp"</span>] = <span class="str">"application/octet-stream"</span>,
            [<span class="str">".xul"</span>] = <span class="str">"application/vnd.mozilla.xul+xml"</span>,
            [<span class="str">".xvm"</span>] = <span class="str">"application/xv+xml"</span>,
            [<span class="str">".xvml"</span>] = <span class="str">"application/xv+xml"</span>,
            [<span class="str">".xwd"</span>] = <span class="str">"image/x-xwindowdump"</span>,
            [<span class="str">".xyz"</span>] = <span class="str">"chemical/x-xyz"</span>,
            [<span class="str">".xz"</span>] = <span class="str">"application/x-xz"</span>,
            [<span class="str">".yang"</span>] = <span class="str">"application/yang"</span>,
            [<span class="str">".yin"</span>] = <span class="str">"application/yin+xml"</span>,
            [<span class="str">".z"</span>] = <span class="str">"application/x-compress"</span>,
            [<span class="str">".z1"</span>] = <span class="str">"application/x-zmachine"</span>,
            [<span class="str">".z2"</span>] = <span class="str">"application/x-zmachine"</span>,
            [<span class="str">".z3"</span>] = <span class="str">"application/x-zmachine"</span>,
            [<span class="str">".z4"</span>] = <span class="str">"application/x-zmachine"</span>,
            [<span class="str">".z5"</span>] = <span class="str">"application/x-zmachine"</span>,
            [<span class="str">".z6"</span>] = <span class="str">"application/x-zmachine"</span>,
            [<span class="str">".z7"</span>] = <span class="str">"application/x-zmachine"</span>,
            [<span class="str">".z8"</span>] = <span class="str">"application/x-zmachine"</span>,
            [<span class="str">".zaz"</span>] = <span class="str">"application/vnd.zzazz.deck+xml"</span>,
            [<span class="str">".zip"</span>] = <span class="str">"application/zip"</span>,
            [<span class="str">".zir"</span>] = <span class="str">"application/vnd.zul"</span>,
            [<span class="str">".zirz"</span>] = <span class="str">"application/vnd.zul"</span>,
            [<span class="str">".zmm"</span>] = <span class="str">"application/vnd.handheld-entertainment+xml"</span>,
            #endregion
        });


        <span class="com">/// &lt;summary&gt;</span>
        <span class="com">/// Tries to get the type of the MIME from the provided string.</span>
        <span class="com">/// &lt;/summary&gt;</span>
        <span class="com">/// &lt;param name="input"&gt;The filename or extension.&lt;/param&gt;</span>
        <span class="com">/// &lt;param name="mimeType"&gt;The variable to store the MIME type.&lt;/param&gt;</span>
        <span class="com">/// &lt;returns&gt;The MIME type.&lt;/returns&gt;</span>
        <span class="com">/// &lt;exception cref="ArgumentNullException" /&gt;</span>
        <span class="key">private</span> <span class="key">static</span> <span class="key">bool</span> TryGetMimeType(<span class="key">string</span> input, <span class="key">out</span> <span class="key">string</span> mimeType)
        {
            <span class="key">if</span> (input == <span class="key">null</span>)
            {
                <span class="key">throw</span> <span class="key">new</span> ArgumentNullException(nameof(input));
            }

            <span class="key">if</span> (!input.Contains(Dot))
            {
                input = Dot + input;
            }
            <span class="key">else</span> <span class="key">if</span> (input.Contains(Dot) &amp;&amp; !input.StartsWith(Dot))
            {
                <span class="key">var</span> index = input.LastIndexOf(Dot);
                <span class="key">if</span> (index != -1 &amp;&amp; input.Length &gt; index + 1)
                {
                    input = input.Substring(index + 1);
                }

                input = Dot + input;
            }

            <span class="key">return</span> _mappings.Value.TryGetValue(input, <span class="key">out</span> mimeType);
        }

        <span class="com">/// &lt;summary&gt;</span>
        <span class="com">/// Gets the type of the MIME from the provided string.</span>
        <span class="com">/// &lt;/summary&gt;</span>
        <span class="com">/// &lt;param name="fileName"&gt;The filename or extension.</span>
        <span class="com">/// &lt;returns&gt;The MIME type.&lt;/returns&gt;</span>
        <span class="com">/// &lt;exception cref="ArgumentNullException"&gt;</span>
        <span class="key">public</span> <span class="key">static</span> <span class="key">string</span> GetMimeType(<span class="key">string</span> fileName)
        {
            <span class="key">return</span> TryGetMimeType(fileName, <span class="key">out</span> <span class="key">var</span> result) ? result : string.Empty;
        }

        <span class="com">/// &lt;summary&gt;</span>
        <span class="com">/// Gets the extension from the provided MINE type.</span>
        <span class="com">/// &lt;/summary&gt;</span>
        <span class="com">/// &lt;param name="mimeType"&gt;Type of the MIME.&lt;/param&gt;</span>
        <span class="com">/// &lt;returns&gt;The extension.&lt;/returns&gt;</span>
        <span class="com">/// &lt;exception cref="ArgumentNullException"&gt;&lt;/exception&gt;</span>
        <span class="com">/// &lt;exception cref="ArgumentException"&gt;&lt;/exception&gt;</span>
        <span class="key">public</span> <span class="key">static</span> <span class="key">string</span> GetExtension(<span class="key">string</span> mimeType)
        {
            <span class="key">if</span> (mimeType == <span class="key">null</span>)
            {
                <span class="key">throw</span> <span class="key">new</span> ArgumentNullException(nameof(mimeType));
            }

            <span class="key">if</span> (mimeType.StartsWith(Dot))
            {
                <span class="key">throw</span> <span class="key">new</span> ArgumentException(<span class="str">"Requested mime type is not valid: "</span> + mimeType);
            }

            <span class="key">var</span> ext = _mappings.Value.FirstOrDefault(x =&gt; x.Value.Contains(mimeType)).Key;
            <span class="key">if</span> (ext != <span class="key">null</span>)
            {
                <span class="key">return</span> ext;
            }

            <span class="key">return</span> string.Empty;
        }
    }
} </code></pre>
</div>



<p>Reference: <a href="https://www.iana.org/assignments/media-types/media-types.xhtml" target="_blank" rel="noopener">iana.org</a></p>



<br>



<div style="padding: 0.625rem 1.25rem 1.25rem 1.25rem; box-shadow: 0.0625rem 0.0625rem 0.9375rem 0rem lightgrey; margin-bottom: 1.25rem; border-radius: 0.625rem;">
<div><span style="border-bottom: 0.0625rem solid #cd5c5c; color:#cd5c5c;"><b><i>read also:</i></b></span>
<div style="padding-left:0.9375rem; padding-top:0.625rem; line-height: 1.9;">
<div><b>– <a href="https://www.codeindotnet.com/what-is-dapper-micro-orm-in-c/">What is Dapper micro-ORM in C#?</a></b></div>
<div><b>– <a href="https://www.codeindotnet.com/how-to-integrate-mailchimp-v3-0-api-in-dotnet-core-c/">How to Integrate MailChimp v3.0 API in DotNet Core C#</a></b></div>
<div><b>– <a href="https://www.codeindotnet.com/export-dataset-to-excel-in-c-net-core-openxml/">Export DataSet To Excel in C# .Net Core – OpenXml</a></b></div>
<div><b>– <a href="https://www.codeindotnet.com/dynamically-add-anchor-tag-in-div-html-javascript/">Dynamically generate anchor tag in div HTML  javascript</a></b></div>
<div><b>– <a href="https://www.codeindotnet.com/wordpress-rest-api-c-wordpresspcl-example/">Easy Integration of WordPress API in C# .Net</a></b></div>
<div><b>– <a href="https://www.codeindotnet.com/find-sitemap-website-url-link-is-exists-valid-c-dot-net-core/">Check SiteMaps XML URL Nodes for broken links C#</a></b></div>
<div><b>– <a href="https://www.codeindotnet.com/insert-tab-white-spaces-in-text-html-css-code/">Insert tab spaces characters in text – HTML CSS</a></b></div>
<div><b>– <a href="https://www.codeindotnet.com/create-image-tag-after-countdown-timer-finishes-javascript/">Display an Image tag after countdown timer finishes JavaScript</a></b></div>
<div><b>– <a href="https://www.codeindotnet.com/how-to-use-dynamic-parameters-in-dapper-2-0-in-c-net-core/">How To Use Dynamic Parameters In Dapper 2.0 In C# .Net Core?</a></b></div>
<div><b>– <a href="https://www.codeindotnet.com/what-is-api-application-programming-interface/">What is an API – Application Programming Interface</a></b></div>
<div><b>– <a href="https://www.codeindotnet.com/sonarlint-code-clean-up-for-ms-visual-studio-cyclomatic-complexity-explained/">SonarLint Code Clean-up for MS Visual Studio &amp; Cyclomatic Complexity Explained</a></b></div>
<div><b>– <a href="https://www.codeindotnet.com/extract-images-from-pdf-using-itext7-c-net/">How to extract images from PDF using iText7 in C# .Net Code</a></b></div>
</div>
</div>
</div>
]]></content:encoded>
					
					<wfw:commentRss>https://www.codeindotnet.com/how-to-create-mime-types-class-in-c-net-core/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>How to extract images from PDF using iText7 in [C#] .Net</title>
		<link>https://www.codeindotnet.com/extract-images-from-pdf-using-itext7-c-net/</link>
					<comments>https://www.codeindotnet.com/extract-images-from-pdf-using-itext7-c-net/#respond</comments>
		
		<dc:creator><![CDATA[admin]]></dc:creator>
		<pubDate>Thu, 06 Apr 2023 09:59:03 +0000</pubDate>
				<category><![CDATA[C#]]></category>
		<category><![CDATA[itextsharp read image from pdf]]></category>
		<guid isPermaLink="false">https://www.codeindotnet.com/?p=3388</guid>

					<description><![CDATA[In today&#8217;s digital world, PDF (Portable Document Format) files have become a common medium for sharing and storing documents. Often, these PDF files contain important images that we may need to extract for various purposes. In this article, we will explore how to extract images from PDF files using iText7, a powerful and popular PDF [&#8230;]]]></description>
										<content:encoded><![CDATA[
<br>



<p>In today&#8217;s digital world, PDF (Portable Document Format) files have become a common medium for sharing and storing documents. Often, these PDF files contain important images that we may need to extract for various purposes. In this article, we will explore how to extract images from PDF files using iText7, a powerful and popular PDF library, in C# .NET.  </p>



<br>



<div class="wp-block-rank-math-toc-block toc-cust" id="rank-math-toc"><h2>Table of Contents</h2><nav><ul><li><a href="#install-i-text-7-package-in-net-application">Install iText7 package in .Net Application</a><ul><li><a href="#step-1-setting-up-the-project">Step 1: Setting up the Project: </a></li></ul></li><li><a href="#i-text-7-library-in-c-code-implementation">iText7 library in C# &#8211; code Implementation</a><ul><li><a href="#step-2-implement-i-event-listener">Step 2: Implement IEventListener</a></li></ul></li><li><a href="#how-to-invoke-i-event-listener-in-c-code">How to invoke IEventListener in C# code</a><ul><li><a href="#step-3-load-the-pdf-document-extracting-images-via-call-i-event-listener">Step 3: Load the PDF Document &amp; Extracting Images via Call IEventListener.</a></li></ul></li><li><a href="#code-explanation">Code Explanation:</a></li></ul></nav></div>



<br><br>



<h2 class="wp-block-heading" id="install-i-text-7-package-in-net-application"><strong>Install iText7 package in .Net Application</strong></h2>



<br>



<h3 class="wp-block-heading" id="step-1-setting-up-the-project"><strong><span style="color:#ba3925;"><b>Step 1:</b></span> Setting up the Project: </strong></h3>



<br>



<p>Create a new C# .NET project in your preferred development environment. Ensure that you have added the iText7 library to your project.</p>



<figure class="wp-block-image size-large"><img decoding="async" src="https://www.codeindotnet.com/img/1/itext7-nuget-package-pdf-reader.jpg" alt="Extract images from PDF using iText7 in C# code"/></figure>



<p>or use the following command line in Console to install the package</p>



<div style="background:#08090a; color:#f8f8f2; width:80%; border-radius: 0.375rem; padding-top: 10px; padding-bottom: 10px;">
<span style="padding-left:15px">Install-Package itext7 -Version 7.2.5</span>
</div>



<br><br><br>



<h2 class="wp-block-heading" id="i-text-7-library-in-c-code-implementation"><strong>iText7 library in C# &#8211; code Implementation</strong></h2>



<br>



<h3 class="wp-block-heading" id="step-2-implement-i-event-listener"><strong><span style="color:#ba3925;"><b>Step 2:</b></span> Implement IEventListener</strong></h3>



<br>



<p>Use <span class="spanHT">ImageRenderInfo</span> to capture images in <span class="spanHT">IEventListener</span> class. <br>Create a new class called &#8220;ImageEventListener&#8221; and implement the IEventListener event as shown in the below code. While processing PDF pages, this event will get fired if the EventData is an Image type. Implement logic as per your requirement. Sample code shows saving all images in an output folder.</p>



<pre class="pchl"><code><span class="key">using</span> iText.Kernel.Pdf.Canvas.Parser.Data;
<span class="key">using</span> iText.Kernel.Pdf.Canvas.Parser.Listener;
<span class="key">using</span> iText.Kernel.Pdf.Canvas.Parser;
<span class="key">using</span> iText.Kernel.Pdf.Xobject;

<span class="key">public</span> <span class="key">class</span> <span class="custkey">ImageEventListener</span> : <span class="custkey">IEventListener</span>
{
	<span class="key">public</span> <span class="key">void</span> EventOccurred(<span class="custkey">IEventData</span> eventData, <span class="custkey">EventType</span> type)
	{
		<span class="key">if</span> (eventData <span class="key">is</span> <span class="custkey">ImageRenderInfo</span> imageRenderInfo)
		{
			<span class="key">try</span>
			{
				<span class="key">string</span> extractImagToDir = <span class="str">"C:\\Users\\Desktop\\OutputFiles\\"</span>;

				<span class="key">if</span> (imageRenderInfo.GetImage() != <span class="key">null</span>)
				{
					<span class="custkey">PdfImageXObject</span> imageXObject = imageRenderInfo.GetImage();
					
					<span class="custkey"><span class="custkey">File</span></span>.WriteAllBytes(extractImagToDir + <span class="custkey">DateTime</span>.Now.ToString(<span class="str">"yyyyMMddHHmmssfff"</span>) + <span class="str">".jpg"</span>, imageXObject.GetImageBytes());
				}
			}
			<span class="key">catch</span> (Exception ex)
			{
				<span class="com">//LogError(ex.Message);</span>
			}
		}
	}

	<span class="key">public</span> <span class="custkey">ICollection</span>&lt;<span class="custkey">EventType</span>&gt; GetSupportedEvents()
	{
		<span class="key">return</span> null;
	}
} </code></pre>



<br><br>



<h2 class="wp-block-heading" id="how-to-invoke-i-event-listener-in-c-code"><strong>How to invoke IEventListener in C# code</strong></h2>



<br>



<h3 class="wp-block-heading" id="step-3-load-the-pdf-document-extracting-images-via-call-i-event-listener"><strong><span style="color:#ba3925;"><b>Step 3:</b></span> Load the PDF Document &amp; Extracting Images via Call IEventListener.</strong></h3>



<br>



<p>The below code shows how to open &amp; read a PDF document and process each page&#8217;s contents using PdfCanvasProcessor which will trigger <span class="spanHT">ImageEventListener</span> class.</p>



<pre class="pchl"><code><span class="key">using</span> iText.Kernel.Geom;
<span class="key">using</span> iText.Kernel.Pdf.Xobject;
<span class="key">using</span> iText.Kernel.Pdf;
<span class="key">using</span> iText.Layout.Element;
<span class="key">using</span> iText.Kernel.Pdf.Canvas.Parser; 

<span class="key">public</span> <span class="key">static</span> <span class="key">void</span> ExtractAllImagesFromPDF(<span class="key">string</span> filePath)
{
	<span class="com">//filePath= "C:\\Users\\Desktop\\TestFile.PDF";</span>

	<span class="key">using</span> (<span class="custkey">FileStream</span> fs = <span class="custkey">File</span>.Open(filePath, <span class="custkey">File</span>Mode.Open))
	{
		<span class="custkey">PdfReader</span> pdfReader = <span class="key">new</span> <span class="custkey">PdfReader</span>(fs);
		<span class="custkey">PdfDocument</span> pdfDocument = <span class="key">new</span> <span class="custkey">PdfDocument</span>(pdfReader);

		<span class="key">var</span> eventListener = <span class="key">new</span> <span class="custkey">ImageEventListener</span>();
		<span class="custkey">PdfCanvasProcessor</span> canvasProcessor = <span class="key">new</span> <span class="custkey">PdfCanvasProcessor</span>(eventListener);

		<span class="key">for</span> (<span class="key">int</span> pageNumber = 1; pageNumber &lt;= pdfDocument.GetNumberOfPages(); pageNumber++)
		{
			<span class="com">// this will invoke ImageEventListener</span>
			canvasProcessor.ProcessPageContent(pdfDocument.GetPage(pageNumber));
		}
	}
} </code></pre>



<br>



<h2 class="wp-block-heading" id="code-explanation">Code Explanation:</h2>



<ul class="wp-block-list">
<li>Open a PDF file using <strong>FileStream</strong></li>



<li>Create an instance of <strong>PdfReader </strong>and <strong>PdfDocument</strong> class to read a file.</li>



<li>Create an <strong>EventListener </strong>and pass it as a parameter in <strong>PdfCanvasProcessor </strong>class instance.</li>



<li>go through each page via for loop and process the page&#8217;s content which will invoke the <strong>EventListener </strong>event.</li>



<li>In <strong>ImageEventListener </strong>class, check if EventData is an Image type</li>



<li>If it is <strong>ImageRenderInfo </strong>type then get the image using <strong>PdfImageXObject</strong></li>



<li>get all image bytes by <strong>GetImageBytes()</strong> method and save it in the output directory.</li>
</ul>



<br>



<p>iText7 uses an <a href="https://itextpdf.com/en/how-buy/agpl-license" target="_blank" rel="noreferrer noopener">AGPL license</a> which is a free/open source software (F/OSS). See also <a href="https://www.gnu.org/licenses/licenses.html#GPL" target="_blank" rel="noopener">GNU General Public License</a>&nbsp;(GNU GPL) Supported by the Free Software Foundation. However, a commercial license is also available if you want to commercialize your project.</p>



<br><br>



<div style="padding: 0.625rem 1.25rem 1.25rem 1.25rem; box-shadow: 0.0625rem 0.0625rem 0.9375rem 0rem lightgrey; margin-bottom: 1.25rem; border-radius: 0.625rem;">
<div><span style="border-bottom: 0.0625rem solid #cd5c5c; color:#cd5c5c;"><b><i>read also:</i></b></span>
<div style="padding-left:0.9375rem; padding-top:0.625rem; line-height: 1.9;">
<div><b>– <a href="https://www.codeindotnet.com/what-is-dapper-micro-orm-in-c/">What is Dapper micro-ORM in C#?</a></b></div>
<div><b>– <a href="https://www.codeindotnet.com/how-to-integrate-mailchimp-v3-0-api-in-dotnet-core-c/">How to Integrate MailChimp v3.0 API in DotNet Core C#</a></b></div>
<div><b>– <a href="https://www.codeindotnet.com/export-dataset-to-excel-in-c-net-core-openxml/">Export DataSet To Excel in C# .Net Core – OpenXml</a></b></div>
<div><b>– <a href="https://www.codeindotnet.com/dynamically-add-anchor-tag-in-div-html-javascript/">Dynamically generate anchor tag in div HTML  javascript</a></b></div>
<div><b>– <a href="https://www.codeindotnet.com/wordpress-rest-api-c-wordpresspcl-example/">Easy Integration of WordPress API in C# .Net</a></b></div>
<div><b>– <a href="https://www.codeindotnet.com/find-sitemap-website-url-link-is-exists-valid-c-dot-net-core/">Check SiteMaps XML URL Nodes for broken links C#</a></b></div>
<div><b>– <a href="https://www.codeindotnet.com/insert-tab-white-spaces-in-text-html-css-code/">Insert tab spaces characters in text – HTML CSS</a></b></div>
<div><b>– <a href="https://www.codeindotnet.com/create-image-tag-after-countdown-timer-finishes-javascript/">Display an Image tag after countdown timer finishes JavaScript</a></b></div>
<div><b>– <a href="https://www.codeindotnet.com/how-to-use-dynamic-parameters-in-dapper-2-0-in-c-net-core/">How To Use Dynamic Parameters In Dapper 2.0 In C# .Net Core?</a></b></div>
<div><b>– <a href="https://www.codeindotnet.com/what-is-api-application-programming-interface/">What is an API – Application Programming Interface</a></b></div>
<div><b>– <a href="https://www.codeindotnet.com/sonarlint-code-clean-up-for-ms-visual-studio-cyclomatic-complexity-explained/">SonarLint Code Clean-up for MS Visual Studio &amp; Cyclomatic Complexity Explained</a></b></div>
</div>
</div>
</div>



<style>
.toc-cust{
border:1px solid #add8e6;
padding-top: 15px;
padding-left:15px;
}
</style>



<br>
]]></content:encoded>
					
					<wfw:commentRss>https://www.codeindotnet.com/extract-images-from-pdf-using-itext7-c-net/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
