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.mzph.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;请在菜单栏选择…