当前位置:首页 > 技术 > 正文内容

NG-ZORRO文件上传控件实现方案

访客 技术 2026年6月27日 1

前端上传组件配置

1. 控件基本配置

核心属性说明:

  • nzFileList: 双向绑定的文件列表对象
  • nzBeforeUpload: 上传前执行的钩子函数
<nz-upload
  [nzAction]="''"
  [(nzFileList)]="uploadFiles"
  [nzBeforeUpload]="validateFile">
  <button nz-button nzType="primary">
    <i nz-icon nzType="upload"></i>
  </button>
</nz-upload>

2. 文件验证与提交

上传前验证逻辑:

uploadFiles: NzUploadFile[] = [];

validateFile = (file: NzUploadFile): boolean => {
  const maxSize = 4 * 1024 * 1024;
  if (file.size! > maxSize) {
    this.notification.error('文件大小超过限制');
    return false;
  }
  this.uploadFiles = [...this.uploadFiles, file];
  return true;
}

文件提交方法:

async submitFiles() {
  const formPayload = new FormData();
  this.uploadFiles.forEach(item => {
    formPayload.append('attachments', item);
  });
  
  formPayload.set('sourceSystem', 'HR');
  formPayload.set('category', 'contract');

  await this.http.post('http://api.domain.com/file/upload', formPayload).toPromise();
}

3. 文件下载实现

fetchFile(fileMeta: FileMeta) {
  const downloadReq = {
    path: fileMeta.storagePath,
    id: fileMeta.fileId,
    name: fileMeta.fileName
  };

  this.http.post('http://api.domain.com/file/download', 
    downloadReq,
    { responseType: 'arraybuffer' }
  ).subscribe(response => {
    const blob = new Blob([response]);
    const url = URL.createObjectURL(blob);
    const anchor = document.createElement('a');
    anchor.href = url;
    anchor.download = fileMeta.fileName;
    anchor.click();
    URL.revokeObjectURL(url);
  });
}

后端API实现

1. 文件接收处理

[HttpPost]
[Route("file/upload")]
public IHttpActionResult ReceiveFiles()
{
  var request = HttpContext.Current.Request;
  string targetDir = ConfigurationManager.AppSettings["StoragePath"];
  
  if (!Directory.Exists(targetDir)) 
    Directory.CreateDirectory(targetDir);

  var resultData = new List<FileMeta>();
  foreach (string fileKey in request.Files)
  {
    var httpFile = request.Files[fileKey];
    string uniqueId = Guid.NewGuid().ToString("N");
    string fullPath = Path.Combine(targetDir, uniqueId);
    
    httpFile.SaveAs(fullPath);
    
    resultData.Add(new FileMeta {
      FileId = uniqueId,
      FileName = httpFile.FileName,
      FilePath = fullPath,
      Size = httpFile.ContentLength
    });
  }
  
  return Ok(resultData);
}

2. 文件下载服务

[HttpPost]
[Route("file/download")]
public HttpResponseMessage GetFile(DownloadRequest req)
{
  if (!File.Exists(req.path))
    return Request.CreateErrorResponse(HttpStatusCode.NotFound, "文件不存在");

  HttpResponseMessage response = new HttpResponseMessage();
  FileStream stream = new FileStream(req.path, FileMode.Open);
  
  response.Content = new StreamContent(stream);
  response.Content.Headers.ContentDisposition = 
    new ContentDispositionHeaderValue("attachment") {
      FileName = HttpUtility.UrlEncode(req.name)
    };
  
  return response;
}

文件元数据存储建议:

  • 文件服务返回唯一标识ID
  • 业务系统存储文件ID与元数据
  • 下载时通过ID获取文件路径
标签: NG-ZORROAngular

相关文章

Linux crontab 详解

1) crontab 是什么cron 是 Linux 的定时任务守护进程;crontab 是用来编辑/查看“按时间周期执行命令”的表(cron table)。常见两类:用户 crontab:每个用户一份(crontab -e 编辑)系统级 crontab / cron.d:可指定执行用户(/etc/crontab、/etc/cron.d/*)2) crontab 时间...

富文本里可以允许的 HTML 属性

一、所有标签默认允许的安全属性(极少)class        (可选)id           (通常建议禁用)title️ 注意:id 容易被滥用做锚点注入,很多系统直接禁用class 允许的话最好只允许固定前缀(如 editor-*)二、a 标签允许属性<a href="" t...

Mac 安装 Node.js 指南

方法一:通过官网安装包(最简单,适合初学者)如果你只是想快速安装并开始使用,这是最直接的方法。访问 Node.js 官网。页面会显示两个版本:LTS (Recommended For Most Users):长期支持版,最稳定。建议选这个。Current:最新特性版,包含最新功能但可能不够稳定。下载 .pkg 安装包并运行。按照安装向导点击“下一步”即可完成。方法二:使用 Homebrew 安装(...

Dom\HTML_NO_DEFAULT_NS 的副作用:自动加闭合标签

在使用Dom\HTMLDocument时,Dom\HTML_NO_DEFAULT_NS 将禁止在解析过程中设置元素的命名空间, 此设置是为了与DOMDocument向后兼容而存在的。当使用它时,已知的一个副作用就是:自动加闭合标签例如 </img> 为什么会这样?当你使用:Dom\HTML_NO_DEFAULT_NS文档会变成 无命名空间模式,此时内部更接近 XML...

Laravel 事件和监听器创建

在 Laravel 中,使用 Artisan 命令创建 Events(事件) 和 Listeners(监听器) 是非常高效的。你可以通过以下几种方式来实现:1. 手动创建单个 Event如果你只想创建一个事件类,可以使用 make:event 命令:Bashphp artisan make:event UserRegistered执行后,文件将生成在 app/Even...

自定义域名解析神器 dnsmasq

什么是 dnsmasq?dnsmasq 是一个轻量级、功能强大的网络服务工具,专为小型和中等规模网络设计。它是一个综合的网络基础设施解决方案[1]。dnsmasq 能做什么?功能说明应用场景DNS 转发与缓存将 DNS 查询转发到上游服务器(ISP、Google DNS 等),并在本地缓存结果加快 DNS 查询速度,减少外部 DNS 流量本地 DNS解析本地网络设备的主机名,无需编辑&n...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。