C# HTTP 文件上傳、下載服務器

程序需要管理員權限,vs需要管理員打開

首次運行需要執行以下命令注冊URL(管理員命令行)在這里插入圖片描述

netsh advfirewall firewall add rule name="FileShare" dir=in action=allow protocol=TCP localport=8000
ipconfig | findstr "IPv4"

在這里插入圖片描述

在這里插入圖片描述

using System;
using System.IO;
using System.Net;
using System.Text;
using System.Collections.Generic;
using System.Linq;class Program
{static void Main(){string path = @"D:\8000"; // 共享目錄int port = 8000;HttpListener listener = new HttpListener();listener.Prefixes.Add($"http://+:{port}/");listener.Start();Console.WriteLine($"服務器已啟動: http://{GetLocalIP()}:{port}");while (true){var context = listener.GetContext();if (context.Request.HttpMethod == "POST"){ProcessUploadRequest(context, path);}else{ProcessRequest(context, path);}}}static void ProcessUploadRequest(HttpListenerContext context, string rootPath){try{// 獲取上傳文件名string filename = context.Request.Headers["X-FileName"] ?? Path.GetRandomFileName();string filePath = Path.Combine(rootPath, filename);using (FileStream fs = new FileStream(filePath, FileMode.Create)){context.Request.InputStream.CopyTo(fs);}SendResponse(context, HttpStatusCode.Created, "文件上傳成功");}catch (Exception ex){SendResponse(context, HttpStatusCode.InternalServerError, $"上傳失敗: {ex.Message}");}}static void ProcessRequest(HttpListenerContext context, string rootPath){try{string requestPath = context.Request.Url.LocalPath.TrimStart('/');string fullPath = Path.Combine(rootPath, requestPath);// 處理文件下載if (File.Exists(fullPath)){using (FileStream fs = File.OpenRead(fullPath)){context.Response.ContentType = GetMimeType(Path.GetExtension(fullPath));context.Response.AddHeader("Content-Disposition", $"attachment; filename=\"{Path.GetFileName(fullPath)}\"");fs.CopyTo(context.Response.OutputStream);}}// 處理目錄瀏覽else if (Directory.Exists(fullPath)){string directoryList = GenerateDirectoryListing(fullPath, context.Request.Url.AbsoluteUri);byte[] buffer = Encoding.UTF8.GetBytes(directoryList);context.Response.ContentType = "text/html; charset=utf-8";context.Response.OutputStream.Write(buffer, 0, buffer.Length);}else{SendResponse(context, HttpStatusCode.NotFound, "資源不存在");}}catch (Exception ex){SendResponse(context, HttpStatusCode.InternalServerError, $"處理請求失敗: {ex.Message}");}finally{context.Response.Close();}}static string GenerateDirectoryListing(string path, string baseUrl){var sb = new StringBuilder();sb.Append("<html><head><title>文件列表</title></head><body>");sb.Append($"<h1>文件列表 - {path}</h1><ul>");// 添加返回上級目錄鏈接if (Directory.GetParent(path) != null){sb.Append($"<li><a href='{baseUrl}../'>[上級目錄]</a></li>");}// 遍歷目錄foreach (var dir in Directory.GetDirectories(path)){string dirName = Path.GetFileName(dir);sb.Append($"<li><a href='{baseUrl}{dirName}/'>[目錄] {dirName}/</a></li>");}// 遍歷文件foreach (var file in Directory.GetFiles(path)){string fileName = Path.GetFileName(file);sb.Append($"<li><a href='{baseUrl}{fileName}'>{fileName}</a></li>");}sb.Append("</ul></body></html>");return sb.ToString();}static void SendResponse(HttpListenerContext context, HttpStatusCode statusCode, string message){byte[] buffer = Encoding.UTF8.GetBytes(message);context.Response.StatusCode = (int)statusCode;context.Response.ContentType = "text/plain; charset=utf-8";context.Response.OutputStream.Write(buffer, 0, buffer.Length);}/***   * MIME類型映射類* MIME(Multipurpose Internet Mail Extensions)? * 類型是一種標準化的方式,用于描述互聯網上傳輸的內容類型(例如文本、圖像、視頻等)。* 它的核心作用是告訴瀏覽器或客戶端?如何正確處理文件?(例如直接顯示、下載、調用外部程序打開等)*/static string GetMimeType(string extension){var mimeTypes = new Dictionary<string, string>{{ ".txt", "text/plain" },{ ".pdf", "application/pdf" },{ ".doc", "application/msword" },{ ".docx", "application/vnd.openxmlformats-officedocument.wordprocessingml.document" },{ ".xls", "application/vnd.ms-excel" },{ ".xlsx", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" },{ ".png", "image/png" },{ ".jpg", "image/jpeg" },{ ".jpeg", "image/jpeg" },{ ".gif", "image/gif" },{ ".zip", "application/zip" }};return mimeTypes.TryGetValue(extension.ToLower(), out string mime) ? mime : "application/octet-stream";}static string GetLocalIP(){return Dns.GetHostEntry(Dns.GetHostName()).AddressList.First(ip => ip.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork).ToString();}
}

文件上傳
curl.exe -X POST -H “X-FileName: Git-2.46.2-64-bit.exe” --data-binary “@C:\Users\Ins\Downloads\Git-2.46.2-64-bit.exe” http://192.168.1.242:8000/在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/72997.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/72997.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/72997.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

基于 TRIZ 理論的筏式養殖吊籠清洗裝備設計研究

基于 TRIZ 理論的筏式養殖吊籠清洗裝備設計研究 一、引言 筏式養殖在水產養殖業中占據重要地位&#xff0c;吊籠作為養殖貝類、藻類等生物的關鍵器具&#xff0c;其清潔程度直接影響養殖生物的健康與產量。傳統的吊籠清洗方式多依賴人工&#xff0c;效率低下、勞動強度大且清洗…

QA:備份產品的存儲架構采用集中式和分布式的優劣?

分布式和集中式各有優劣&#xff0c;且這兩者下面的存儲類型也都不盡相同&#xff0c;從備份與恢復的數據層面來看&#xff0c;這兩者存儲相結合才是優解。 眾所周知&#xff0c;備份數據只存一份還只放在一個存儲里是不現實的。假設把備份數據訪問頻率、生命周期等參數分為三個…

FPGA中串行執行方式之計數器控制

FPGA中串行執行方式之計數器控制 使用計數器控制的方式實現狀態機是一種簡單且直觀的方法。它通過計數器的值來控制狀態的變化,從而實現順序邏輯。計數器的方式特別適合狀態較少且狀態轉移是固定的場景。 基本原理 計數器控制的狀態機 ?例程1:簡單的順序狀態機 以下是一個…

純vue手寫流程組件

前言 網上有很多的vue的流程組件&#xff0c;但是本人不喜歡很多冗余的代碼&#xff0c;喜歡動手敲代碼&#xff1b;剛開始寫的時候&#xff0c;確實沒法下筆&#xff0c;最后一層一層剝離&#xff0c;總算實現了&#xff1b;大家可以參考我寫的代碼&#xff0c;可以拿過去定制…

數字化轉型驅動衛生用品安全革新

當315晚會上晃動的暗訪鏡頭揭露衛生巾生產車間里漂浮的異物、紙尿褲原料倉中霉變的碎屑時&#xff0c;這一觸目驚心的場景無情地撕開了“貼身安全”的遮羞布&#xff0c;暴露的不僅是部分企業的道德缺失&#xff0c;更凸顯了當前檢測與監管體系的漏洞&#xff0c;為整個行業敲響…

【C++】:異常

目錄 C語言處理錯誤的方式 C異常的概念 C異常的使用 異常的拋出與捕獲匹配原則 函數調用鏈中的棧展開 異常重新拋出 異常安全 異常規范 標準庫異常體系 自定義異常體系 異常的優缺點 C語言處理錯誤的方式 返回值檢查&#xff1a;函數返回特定錯誤碼或值標識失敗&am…

SZU軟件工程大學生涯 2022~2026

用于個人面試前自我介紹&#xff0c;防止忘記或談吐不流利。 面試官您好&#xff0c;我是來自深圳大學計算機與軟件學院的軟件工程專業的王雅賢。在校期間&#xff0c;我修讀了程序設計基礎、面向對象程序設計、數據結構、算法分析與設計、操作系統等核心課程&#xff0c;系統…

【JavaWeb學習Day27】

Tlias前端 員工管理 條件分頁查詢&#xff1a; 頁面布局 搜索欄&#xff1a; <!-- 搜索欄 --><div class"container"><el-form :inline"true" :model"searchEmp" class"demo-form-inline"><el-form-item label…

Linux 系統運行 Android 應用的幾種方案

這幾年&#xff0c;國產操作系統替代正在有條不紊地進行中。但生態是繞不過去的一道坎&#xff0c;指望應用廠商一下子完成國產系統適配也不現實。之前介紹過使用 Wine 運行 Windows 應用的方案&#xff0c;減少了國產系統應用偏少的難題。比如我在辦公室使用最多的企業微信&am…

Python進階教程丨lambda函數

1. lambda函數是什么&#xff1f; 在 Python 里&#xff0c;lambda 函數是一種特殊類型的函數&#xff0c;也被叫做匿名函數。匿名”意味著它不需要像常規函數那樣使用 def 來進行命名。lambda lambda 函數本質上是簡潔的臨時函數 &#xff0c;它適用于只需要簡單邏輯的場景&a…

TK矩陣系統:高效管理與智能化操作平臺

隨著TikTok等社交媒體平臺的快速發展&#xff0c;短視頻創作和內容運營逐漸成為互聯網行業的重要組成部分。為了幫助內容創作者、品牌運營商以及數據分析人員更高效地管理多個TikTok賬號并優化運營策略&#xff0c;TK矩陣系統提供了一種全新的解決方案&#xff0c;結合了先進的…

Spring Boot整合Apache BookKeeper教程

精心整理了最新的面試資料和簡歷模板&#xff0c;有需要的可以自行獲取 點擊前往百度網盤獲取 點擊前往夸克網盤獲取 Spring Boot整合Apache BookKeeper教程 1. 簡介 Apache BookKeeper 是一個高性能、持久化的分布式日志存儲系統&#xff0c;適用于需要強一致性和高吞吐量的…

蘋果HFS+56TB存儲MOV文件出錯的恢復方法

HFS文件系統是Apple電腦中默認的最常見的文件系統。HFS來源于UNIX&#xff0c;優勢就是穩定性&#xff0c;另外HFS是支持日志功能的&#xff0c;所以很多存儲設備也采用了HFS文件系統。再穩定的文件系統也有“馬失前蹄”的時候&#xff0c;下面就來聊下HFS出現文件出錯、丟失時…

電源電路篇

電源電路篇 一、LDO-Low Dropout Regulator(低壓差線性穩壓器)1.1 AMS1117-3.3V芯片 二、DCDC-Direct Current to Direct Current(開關穩壓器)2.1 降壓(Buck)電路2.1.1 TPS5450-5V芯片 一、LDO-Low Dropout Regulator(低壓差線性穩壓器) LDO是一種線性穩壓器&#xff0c;用于提…

java項目之在線購物系統(源碼+文檔)

項目簡介 在線購物系統實現了以下功能&#xff1a; 使用在線購物系統的用戶分管理員和用戶兩個角色的權限子模塊。 管理員所能使用的功能主要有&#xff1a;主頁、個人中心、用戶管理、商品分類管理、商品信息管理、系統管理、訂單管理等。 用戶可以實現主頁、個人中心、我的…

go語言中空結構體

空結構體(struct{}) 普通理解 在結構體中&#xff0c;可以包裹一系列與對象相關的屬性&#xff0c;但若該對象沒有屬性呢&#xff1f;那它就是一個空結構體。 空結構體&#xff0c;和正常的結構體一樣&#xff0c;可以接收方法函數。 type Lamp struct{}func (l Lamp) On()…

Unity實現連連看連線效果

1.一個比較簡單的向量計算&#xff0c;用的LineRenderer實現&#xff1b; 已知起始A點和終點C點&#xff0c;求B點&#xff1b; 先計算A點到C點的向量取歸一化當做方向&#xff0c;再給定一個“模長”&#xff08;B點到A點的模長&#xff09;乘以該方向&#xff0c;最后加上L…

【MySQL】觸發器與存儲引擎

目錄 觸發器基本概念觸發器操作創建觸發器NEW 與 OLD查看觸發器刪除觸發器 注意事項 存儲引擎基本概念基本操作查詢當前數據庫支持的存儲引擎查看當前的默認存儲引擎查看某個表用的存儲引擎創建表時指定存儲引擎修改表的存儲引擎 觸發器 基本概念 概述&#xff1a; 觸發器&a…

能“嘎嘎提升”提升用戶居住體驗的智能家居物聯網框架推薦!

智能家居在日常生活中給我們的帶來了更多的便利&#xff0c;更讓有些用戶切實地體會到了科技的魅力&#xff0c;對于想要打造屬于自己的智能家居氛圍感的用戶們&#xff0c;以下是一些能夠幫助提升居住體驗的智能家居物聯網框架及應用&#xff1a; 1. 涂鴉智能&#xff08;Tuy…

DevEco Studio的使用

目錄 1.創建ArkTS工程 2.ArkTS工程目錄結構&#xff08;Stage模型&#xff09; 構建第一個頁面 構建第二個頁面 實現頁面間的跳轉 1.創建ArkTS工程 若首次打開DevEco Studio&#xff0c;請點擊Create Project創建工程。如果已經打開了一個工程&#xff0c;請在菜單欄選擇…