首页 > 编程语言 >关于C#文件的上传和下载,文件流相关

关于C#文件的上传和下载,文件流相关

时间:2023-12-20 19:11:06浏览次数:22  
标签:文件 string C# errorMsg file fstream new 上传 id

文件的上传和下载 控制器:
/// <summary>
/// 上传web文件
/// </summary>
/// <param name="files"></param>
/// <param name="wellName">井名</param>
/// <param name="userName">用户名</param>
/// <param name="directoryID">全级目录id</param>
/// <returns></returns>
[HttpPost("UpLoadFile")]
//限制最大单个文件为2G
[RequestFormLimits(MultipartBodyLengthLimit = 2147483648)]
[RequestSizeLimit(2147483648)]
public bool UpLoadFile([FromForm] IFormFileCollection files, string wellName, string userName,string directoryID)
{
string errorMsg = null;
if (files == null || files.Count == 0)
{
throw new ApiException((int)ResultCode.FileException, "请选择上传文件");
}
List<string> list = new List<string>();
ResultCode code = _FileOperationService.UpLoadFile(files[0], wellName, userName, directoryID, ref errorMsg);
//返回文件的相对路径
if (code != ResultCode.OK)
{
throw new ApiException((int)code, errorMsg);
}
return true;
}
/// <summary>
/// 根据查询到的id下载文件
/// </summary>
/// <returns></returns>
[HttpGet("DownloadFile")]
public ActionResult DownloadFile(string id)
{
string errorMsg = null;
HttpResponseMessage action = null;
ResultCode code = _FileOperationService.DownloadFile(id, out byte[] infbytes, out string fileName, ref errorMsg);
//返回文件的相对路径
if (code == ResultCode.OK)
{
return File(infbytes, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", fileName);
}
throw new ApiException((int)code, errorMsg);
}
实现:
-- public ResultCode UpLoadFile(IFormFile formFile, string wellName, string userName,string directoryID, ref string errorMsg)
{
try
{
string remark = string.Empty;
string directoryName = string.Empty;
string code = MD5Helper.MD5Encrypt32(DateTime.Now + formFile.FileName);
long datasize = formFile.Length / 1024;
//写表,返回id
cd_tot_file_003 file = new cd_tot_file_003();
file.FILE_NAME = formFile.FileName;
file.CREATE_TIME = DateTime.Now;
file.FILE_CODE = code;
file.FILE_LENGTH = datasize.ToString() + " KB";
file.WID = wellName;
file.CREATE_USER = userName;
// file.VERSION = 0;
file.DEL_FLAG = 0;
// file.FILE_ADDRESS = code + "0" + formFile.FileName;
var db = ContextManager.GetDbContext(DBTypeString.DB_BASE);
if(directoryID != null)
{
string[] stringArr = directoryID.Split(',');//将字符串转换为数组
string[] arrNew = stringArr.Reverse().Take(1).Reverse().ToArray();//获取后1个数组元素
string strNew = string.Join(",", arrNew);//再次将数组转换为以,分割的字符串
var dirRow = db.Queryable<cd_cfg_directory_001>().Where(it => it.ID == int.Parse(strNew)).First();
directoryName = dirRow.NAME;
remark = "文件保存在目录树的全路径id:" + directoryID;
}
long id = db.Insertable<cd_tot_file_003>(file).ExecuteReturnBigIdentity();
//操作文件
// string code = MD5Helper.MD5Encrypt32(DateTime.Now + name);
string extension = Path.GetExtension(formFile.FileName);
if (!string.IsNullOrEmpty(extension))
{
extension = extension.TrimStart('.');
}
string newFileName = jointFileName(formFile.FileName, new string[] { id.ToString() }, "_"); // formFile.FileName.Replace(extension, "_" + id + extension); //
string datetime= DateTime.Now.ToString("d");
var finalFilePath = Path.Combine(modelFilePath, datetime, newFileName);//最终的文件名
var newFilePath = finalFilePath.Replace(FilePathHead, "");
if (System.IO.File.Exists(finalFilePath))
{
//throw new ApiException((int)ResultCode.FileExists, "文件已存在");
}
string DirPath = Path.GetDirectoryName(finalFilePath);
if (!Directory.Exists(DirPath))
{
Directory.CreateDirectory(DirPath);
}
//StreamReader reader = new StreamReader(formFile.OpenReadStream());
//从流的当前位置到末尾读取所有字符,如果当前位置位于流的末尾,则返回空字符串“”
//String content = reader.ReadToEnd();
using (FileStream fs = System.IO.File.Create(finalFilePath))
{
// 复制文件
formFile.CopyTo(fs);
// 清空缓冲区数据
fs.Flush();
}
--------------------
下载; public ResultCode DownloadFile(string id, out byte[] infbytes, out string fileName, ref string errorMsg)
{
infbytes = null ;
fileName = string.Empty;
if (string.IsNullOrEmpty(id))
{
errorMsg = "id不能为空";
throw new BizException((int)ResultCode.CheckException, errorMsg);
}
try
{
var db = ContextManager.GetDbContext(DBTypeString.DB_BASE);
var dirRow = db.Queryable<cd_tot_file_003>().Where(it => it.ID == int.Parse(id)).First();
string fileAddress = dirRow.FILE_ADDRESS;
fileName = dirRow.FILE_NAME;
string filePath = FilePathHead + fileAddress;
//创建d:\file.txt的FileStream对象
FileStream fstream = new FileStream(filePath, FileMode.OpenOrCreate);
infbytes = new byte[fstream.Length];
//设置流当前位置为文件开始位置
fstream.Seek(0, SeekOrigin.Begin);

//将文件的内容存到字节数组中(缓存)
fstream.Read(infbytes, 0, infbytes.Length);
string result = Encoding.UTF8.GetString(infbytes);
Console.WriteLine(result);
if (fstream != null)
{
//清除此流的缓冲区,使得所有缓冲的数据都写入到文件中
fstream.Flush();
fstream.Close();
}

return ResultCode.OK;
}
catch (BizException ex)
{
errorMsg = ex.msg;
log.Error("[FileOperationService.AddDirectoryTreeData] BizException error," + errorMsg + ",id:" + JsonConvert.SerializeObject(id), ex);
return (ResultCode)ex.code;
}
catch (Exception ex)
{
errorMsg = EnvironmentConfiguration.UserEnvironment ? EnvironmentConfiguration.ErrorMsg : ex.Message;
log.Error("[FileOperationService.AddDirectoryTreeData] Exception error," + errorMsg + ",id:" + JsonConvert.SerializeObject(id), ex);
return ResultCode.InternalServerError;
}
}
___________________________________________________________________________________________________________________________________________________________
文件流处理关键代码
//创建d:\file.txt的FileStream对象
FileStream fstream = new FileStream(@"d:\file.txt", FileMode.OpenOrCreate);
byte[] bData = Encoding.UTF8.GetBytes("test filestream");
//设置流当前位置为文件开始位置
fstream.Seek(0, SeekOrigin.Begin);

//将字节数组中的内容写入文件
fstream.Write(bData, 0, bData.Length);
if (fstream != null)
{
//清除此流的缓冲区,使得所有缓冲的数据都写入到文件中
fstream.Flush();
fstream.Close();
}

标签:文件,string,C#,errorMsg,file,fstream,new,上传,id
From: https://www.cnblogs.com/wuchengyang/p/17917284.html

相关文章

  • EasyCVR平台如何通过api接口设置实时流的sei数据实现画框等操作?
    为了便于用户自由调用、集成与二次开发,EasyCVR平台也提供了丰富的API接口供大家使用。今天我们来分享一下如何通过API接口设置实时流的SEI数据,实现在视频播放器中展示文本内容、画框等操作?1)后端接口调用如下:接口URL:POSThttp://127.0.0.1:18000/api/v1/sei/set2)接口参数如下:3)调用成......
  • Vite4+Typescript+Vue3+Pinia 从零搭建(7) - request封装
    项目代码同步至码云weiz-vue3-template基于axios封装请求,支持多域名请求地址安装npmiaxios封装utils目录下新建request文件夹,并新建index.ts、request.ts和status.ts文件。1.status.ts文件主要是封装状态码exportconstErrMessage=(status:number|s......
  • 如何解决MySQL Workbench中的错误Error Code: 1175
    错误描述:在MySQLWorkbench8.0中练习SQL语句时,执行一条update语句,总是提示如下错误:ErrorCode:1175.YouareusingsafeupdatemodeandyoutriedtoupdateatablewithoutaWHEREthatusesaKEYcolumnTodisablesafemode,toggletheoptioninPreferences->SQ......
  • pycharm中间件简介
    个人理解:#中间件顾名思义,是介于request与response处理之间的一道处理过程,相对比较轻量级,并且在全局上改变django的输入与输出。因为改变的是全局,所以需要谨慎实用,用不好会影响到性能#django内置中间件 'django.middleware.security.SecurityMiddleware','django.contrib.s......
  • 使用 Amazon Fault Injection Service 演示多区域和多可用区应用程序弹性
    文章作者:JeffAmazonFaultInjectionService(FIS)可帮助您将混沌工程大规模付诸实践。今天,我们推出了新的场景,这些场景可以让您演示在亚马逊云科技可用区完全断电,或从一个亚马逊云科技区域到另一个亚马逊云科技区域的连接中断时,您的应用程序是否按预期运行。亚马逊云科技开发者社......
  • conda install -c conda-forge cupy
     (base)root@ubuntulenovo:/home/renguoqiang#condainstall-cconda-forgecupyCollectingpackagemetadata(current_repodata.json):/WARNINGconda.models.version:get_matcher(556):Using.*withrelationaloperatorissuperfluousanddeprecatedandwill......
  • 资深Scrum敏捷转型培训公司-解锁Scrum成功转型的关键
    ​针对敏捷转型培训,有一些知名的培训公司提供专业的敏捷培训课程和认证。以下是几家备受认可的敏捷转型培训公司:Leangoo领歌: Leangoo领歌是一款永久免费的专业的敏捷开发管理工具,提供端到端敏捷研发管理解决方案,包括小型团队敏捷开发​​​​​​​,规模化敏捷SAFe,ScrumofSc......
  • VisualStudio2019创建Code Snippet
    CodeSnippet是什么CodeSnippet,与其称其为代码片段(CodeBlock),将它翻译成代码模板(CodeTemplate)可能更合适一些。任何一段代码都可以叫做代码片段,我们这里要讲的不是这种随性的东西,而是一种快速生成代码的快捷方式,通过它可以有效地提高我们的编程效率。举个例子,假如你在C#......
  • beanshell导入java文件
    beanshell导入java文件beanshell可以读取class格式的文件步骤:    a、添加BeanShell预处理程序    b、请求调用   beanshell可以读取java格式的文件步骤:    a、添加BeanShell预处理程序    b、请求调用  ......
  • MongoDB、Elasticsearch、Redis、HBase应用场景分析
    1.MongoDB一个基于分布式文件存储的数据库系统,由C++编写,旨在为Web应用提供高速、可扩展、高性能的数据存储解决方案。MongoDB采用了文档型数据库模型,即数据以文档的形式存储,而文档是由键值对组成的。MongoDB的名称来自Hadoop创始人DougCutting的宠物狗Mongo。  应用场景......