.NET File Upload

news2024/11/20 0:45:44

VS2022 .NET8

💾基础上传示例

view

@{
    ViewData["Title"] = "File Upload";
}

<h1>@ViewData["Title"]</h1>

<form method="post" enctype="multipart/form-data" action="/Home/UploadFile">
    <div class="form-group">
    
        <input type="file" name="file" class="form-control" />
    </div>
    <button type="submit" class="btn btn-primary">Upload</button>
</form>

controller

        [HttpPost]
        public async Task<IActionResult> UploadFile()
        {
            var file = Request.Form.Files[0];
            if (file != null && file.Length > 0)
            {
                var uploads = Path.Combine(Directory.GetCurrentDirectory(), "wwwroot", "up");
                if (!Directory.Exists(uploads))
                {
                    Directory.CreateDirectory(uploads);
                }

                var filePath = Path.Combine(uploads, file.FileName);
                using (var fileStream = new FileStream(filePath, FileMode.Create))
                {
                    await file.CopyToAsync(fileStream);
                }

                // SAVE TO DB

                return RedirectToAction("Index");
            }

            return View();
        }

 app.UseStaticFiles();

run

在这里插入图片描述

📀优化 限制文件大小

上传文件夹如 img => img rar => file
限制文件大小

    // 根据文件类型选择上传的文件夹
    string fileExtension = Path.GetExtension(file.FileName).ToLower();
    switch (fileExtension)
    {
        case ".jpg":
        case ".png":
            uploadFolder = Path.Combine("wwwroot", "img");
            break;
        case ".mp4":
            // 检查视频大小是否超过限制
            if (file.Length > 20 * 1024 * 1024) // 20MB
            {
                ModelState.AddModelError("File", "Video file size should not exceed 20MB.");
                return View("Index", file);
            }
            uploadFolder = Path.Combine("wwwroot", "vd");
            break;
        case ".m4a":
            uploadFolder = Path.Combine("wwwroot", "sound");
            break;
        case ".rar":
            uploadFolder = Path.Combine("wwwroot", "file");
            break;
        default:
            ModelState.AddModelError("File", "Unsupported file format.");
            return View("Index", file);
    }

在这里插入图片描述

🪫删除

view

@model IEnumerable<string>

<h1>Uploaded Files</h1>

@if (Model.Any())
{
    <table class="table">
        <thead>
            <tr>
                <th>File Name</th>
                <th>Action</th>
            </tr>
        </thead>
        <tbody>
            @foreach (var fileName in Model)
            {
                <tr>
                    <td>@fileName</td>
                    <td>
                        <form method="post" asp-action="DeleteFile">
                            <input type="hidden" name="fileName" value="@fileName" />
                            <button type="submit" class="btn btn-danger">Delete</button>
                        </form>
                    </td>
                </tr>
            }
        </tbody>
    </table>
}
else
{
    <p>No files uploaded yet.</p>
}


controller

      [HttpPost]
      public IActionResult DeleteFile(string fileName)
      {
          var uploadFolder = Path.Combine(Directory.GetCurrentDirectory(), "wwwroot", "img");
          var filePath = Path.Combine(uploadFolder, fileName);
          if (System.IO.File.Exists(filePath))
          {
              System.IO.File.Delete(filePath);
          }
          return RedirectToAction("Files");
      }

在这里插入图片描述

💿️重命名

        string fileName = $"{DateTime.Now:yyyyMMddHHmmssfff}{new Random().Next(1000, 9999)}{fileExtension}";
        var filePath = Path.Combine(uploads, fileName);
        using (var fileStream = new FileStream(filePath, FileMode.Create))
        {
            await file.CopyToAsync(fileStream);
        }

在这里插入图片描述
在这里插入图片描述

💽多文件上传

controller

  [ApiController]
  [Route("[controller]")]
  public class FileUploadController : ControllerBase
  {
      private readonly string UploadsDirectory = Path.Combine(Directory.GetCurrentDirectory(), "uploads");

   
      public FileUploadController()
      {
          // 创建上传文件夹(如果不存在)
          if (!Directory.Exists(UploadsDirectory))
          {
              Directory.CreateDirectory(UploadsDirectory);
          }
      }

      [HttpPost]
      [Route("upload")]
      public async Task<IActionResult> Upload(IFormFile[] files)
      {
          if (files == null || files.Length == 0)
          {
              return BadRequest("No files uploaded.");
          }

          foreach (var file in files)
          {
              if (file.Length == 0)
              {
                  return BadRequest($"File {file.FileName} is empty.");
              }

              // 根据文件类型选择上传的文件夹
              string uploadFolder = GetUploadFolder(file.FileName);

              // 重命名文件为指定格式
              string fileName = $"{DateTime.Now:yyyyMMddHHmmssfff}_{Guid.NewGuid()}{Path.GetExtension(file.FileName)}";
              string filePath = Path.Combine(UploadsDirectory, uploadFolder, fileName);

              using (var stream = new FileStream(filePath, FileMode.Create))
              {
                  await file.CopyToAsync(stream);
              }

              // to db
          }

          return Ok("Files uploaded successfully.");
      }

      private string GetUploadFolder(string fileName)
      {
          string fileExtension = Path.GetExtension(fileName).ToLower();
          switch (fileExtension)
          {
              case ".jpg":
              case ".png":
                  return "img";
              case ".mp4":
                  return "vd";
              case ".m4a":
                  return "sound";
              case ".rar":
                  return "file";
              default:
                  throw new NotSupportedException($"Unsupported file format for {fileName}.");
          }
      }
  }

view


@{
    ViewBag.Title = "File Upload";
}

<h2>File Upload2</h2>

<form id="uploadForm" enctype="multipart/form-data">
    <input type="file" id="fileInput" multiple>
    <input type="button" value="Upload" onclick="uploadFiles()" />
</form>
<div id="message"></div>

@section scripts {
    <script>
        function uploadFiles() {
            var files = document.getElementById('fileInput').files;
            if (files.length === 0) {
                showMessage('No files selected.');
                return;
            }

            var formData = new FormData();
            for (var i = 0; i < files.length; i++) {
                formData.append('files', files[i]);
            }

            $.ajax({
                url: '@Url.Action("Upload", "FileUpload")',
                type: 'POST',
                data: formData,
                processData: false,
                contentType: false,
                success: function (response) {
                    showMessage(response);
                },
                error: function (xhr, status, error) {
                    showMessage('Upload failed: ' + error);
                }
            });
        }

        function showMessage(message) {
            $('#message').text(message);
        }
    </script>
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1687077.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MacOS/Linux系统多Java环境切换

通常我们在进行Java项目开发时&#xff0c;会安装不同版本的JDK&#xff0c;那么这个时候又需要根据项目来使用不同的Java版本&#xff0c;那么怎么来切换昵 第一步&#xff1a; 首先找出系统中安装的所有版本的路径 /usr/libexec/java_home -V这里可以看出安装了三个java 版…

基础widgets

1.widgets_文本和字体 在flutter当中几乎所有的对象都是widget,他跟原生开发的控线不一样,flutter开发当中,widget的概念更广泛一点, 不仅可以表示ui元素,也可以表示一些功能性的组件,例如手势检测等 基础组件 文本和字体 对于html当中对应就是lab或者label或者span这样的行内元…

Python变量、注释与数据类型

大家好&#xff0c;Python 是一种强大而灵活的编程语言&#xff0c;被广泛用于各种领域&#xff0c;包括软件开发、数据分析、科学计算等。在 Python 中&#xff0c;变量、注释和数据类型是构建代码的基础&#xff0c;对于理解和掌握这些概念是至关重要的。本文将深入探讨 Pyth…

数据库系统概论(超详解!!!)第九节 嵌入式SQL

SQL语言提供了两种不同的使用方式 &#xff1a;交互式&#xff0c; 嵌入式。 SQL语言是非过程性语言 。事务处理应用需要高级语言。 这两种方式细节上有差别&#xff0c;在程序设计的环境下&#xff0c;SQL语句要做某些必要的扩充。 1.嵌入式SQL的处理过程 嵌入式SQL是将SQL…

SOA半导体光放大器及其应用

---翻译自Michael Connelly于2015年发表的文章 1.简介 在过去的二十五年里&#xff0c;光纤通信网络的部署和容量迅速增长。这种增长得益于新光电技术的发展&#xff0c;这些技术可用于利用光纤的巨大带宽。如今&#xff0c;运行的系统比特率已超过 100 Gb/s。光技术是全球信…

linux-x86_64-musl 里面的musl是什么意思?

在一些开源库里面可以看到&#xff0c;linux-x86_64-musl类似于这样的字符串&#xff0c;这个musl是什么意思呢&#xff1f; 在字符串 "linux-x86_64-musl" 中&#xff0c;musl 指的是 musl libc&#xff0c;这是一个轻量级的 C 标准库实现。 让我们来拆解一下这个字…

使用maven-helper插件解决jar包冲突

发现问题 maven-helper分析问题 如上所述&#xff0c;问题就是依赖版本冲突了&#xff0c;出现版本冲突的原因是因为由于Maven具有依赖传递性&#xff0c;所以当你引入一个依赖类的同时&#xff0c;其身后的依赖类也一起如过江之鲫纷至沓来了。 举个例子&#xff1a;   A依赖…

软件详细规划与设计概览(软件概要文档、详细设计文档)

1引言 1.1编写目的 1.2项目背景 1.3参考资料 2系统总体设计 2.1整体架构 2.2整体功能架构 2.3整体技术架构 2.4运行环境设计 2.5设计目标 3系统功能模块设计 3.1个人办公 4性能设计 4.1响应时间 4.2并发用户数 5接口设计 5.1接口设计原则 5.2接口实现方式 6运行设计 6.1运行模块…

扫描链接打开小程序配置-谁看谁迷糊

各位你们怎么理解这个规则&#xff1f;如果再多一条数据&#xff0c;和上面一样&#xff0c;只是测试范围为线上版本&#xff0c;又怎么解读&#xff1f; 反正以我对中文的掌握程度&#xff0c;我认为上面的规则是针对体验版的&#xff0c;符合规则的都跳转到体验版。新增的线上…

How to record real IP of user on nginx?

应用(Docker)使用WAF接入internet&#xff0c;nginx log 查不到用户的真实IP地址&#xff0c;于是修改nginx 设置&#xff0c;以下都是在linux下操作&#xff1a; 由于没有WAF权限&#xff0c;所以在 docker上启动了两个container&#xff0c;一个模拟WAF(r-proxy)&#xff0c…

mysql实战——mysql5.7升级到mysql8.0

1、上传mysql8.0压缩包到/usr/local目录下 tar -zxvf mysql-8.0.25-linux-glibc2.12-x86_64.tar.xz mv mysql-8.0.25-linux-glibc2.12-x86_64 mysql8 #更改文件夹所属 chown -R mysql.mysql /usr/local/mysql8/ 2、更改配置文件my.cnf vi /etc/my.cnf # 最后几个for8.0的参数要…

GEO数据挖掘-PCA、差异分析

From 生物技能树 GEO数据挖掘第二节 文章目录 探针注释自主注释流程(了解)PCA图、top1000基因热图探针注释查看示例代码 top 1000 sd 热图离散基因热图&#xff0c;top1000表达基因&#xff0c;只是看一下&#xff0c;不用放文章里 差异分析火山图差异基因热图转换id富集分析-K…

无人机集群路径规划:遗传算法求解无人机集群路径规划,提供MATLAB代码

一、单个无人机路径规划模型介绍 无人机三维路径规划是指在三维空间中为无人机规划一条合理的飞行路径&#xff0c;使其能够安全、高效地完成任务。路径规划是无人机自主飞行的关键技术之一&#xff0c;它可以通过算法和模型来确定无人机的航迹&#xff0c;以避开障碍物、优化…

基于springboot的毕业设计系统的开发源码

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的毕业设计系统的开发。项目源码以及部署相关请联系风歌&#xff0c;文末附上联系信息 。 项目简介&#xff1a; 毕业设计系统能够实现…

微软:最新ChatGPT-4o模型,可在 Azure OpenAI上使用

北京时间5月14日凌晨&#xff0c;OpenAI 一场不到 30 分钟的发布会&#xff0c;正式发布了 GPT-4o&#xff0c;视频语音交互丝滑到吓人&#xff0c;还即将免费可用&#xff01; GPT-4o&#xff0c;其中的「o」代表「omni」&#xff08;即全面、全能的意思&#xff09;&#xff…

和程序员de 相处之道

1、不要"一遇到问题就去找程序员" 通常&#xff0c;技术问题通过阅读使用说明就可以解决。比如你刚买了一个新的播放器&#xff0c;想要把它连接到你的电视&#xff0c;你只需要找到使用手册里关于如何连接接口的那一页即可。 错误信息通常会被很清晰地列出来。通过…

需不需要选数据结构和算法的课程?

网络工程是互联网方向&#xff1f; 不过如果你想走机器学习和大数据方向的话&#xff0c;数据结构以及算法应该说是必修了吧。刚好我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「数据结构的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“88…

XShell-连接-Centos 7

XShell 连接Centos 7 一.准备 安装XShell XShell下载地址&#xff1a; 在虚拟机上安装Centos 7&#xff0c;具体操作自行学习 二.Centos 7的准备 1.网络适配器修改为NAT 2.获取IP 输入命令&#xff1a; ip addr我的Centos 7对外IP为192.168.174.129 三.XShell连接Cento…

全志T527芯片详解【一】:计算性能

高效架构 性能稳健 内置8*ARM Cortex-A55&#xff0c;8核主频可运行至1.8GHz&#xff0c;提供更稳健强劲的处理能力 Octa-core ARM Cortex-A55 in a DynamlQ big.LITTLE configuration, up to 1.8 GHz32KB L1 I-cache and 32KB L1 D-cache per A55 coreOptional 64KB L2 cach…

Linux 如何用上次的checkpoint文件dist_train.sh 接着训练【mmdetection】

在Linux环境下&#xff0c;如果你想要用上一次的checkpoint文件继续训练&#xff0c;你可以在你的dist_train.sh脚本中设置--resume_from参数。这个参数指定了checkpoint文件的路径&#xff0c;训练会从该文件的状态继续进行。 例如&#xff0c;如果你的checkpoint文件名为las…