C# Asp.NET实现上传大文件(断点续传)

以ASP.NET Core WebAPI 作后端 API ,用 Vue 构建前端页面,用 Axios 从前端访问后端 API ,包括文件的上传和下载。

准备文件上传的API

#region 文件上传  可以带参数

[HttpPost("upload")]

public JsonResult uploadProject(IFormFile file, string userId)

{

if (file != null)

{

var fileDir = "D:\\aaa";

if (!Directory.Exists(fileDir))

{

Directory.CreateDirectory(fileDir);

}

//文件名称

string projectFileName = file.FileName;

//上传的文件的路径

string filePath = fileDir + [email protected]"\{projectFileName}";

using (FileStream fs = System.IO.File.Create(filePath))

{

file.CopyTo(fs);

fs.Flush();

}

return Json("ok");

}else{

return Json("no");

}

}

#endregion

前端vue上传组件  ( 利用Form表单上传 )

<template>

<div>

<form>

<input type="text" value="" v-model="projectName" placeholder="请输入项目名称">

<input type="file" v-on:change="getFile($event)">

<button v-on:click="submitForm($event)">上传</button>

</form>

</div>

</template>

<script>

///这个组件是用于上传bdls文件的组件

export default {

data() {

return {

uploadURL: "/Home/Upload",

projectName: "",

file: ""

};

},

methods: {

getFile(event) {

this.file = event.target.files[0];

console.log(this.file);

},

submitForm(event) {

event.preventDefault();

let formData = new FormData();

formData.append("file", this.file);

let config = {

headers: {

"Content-Type": "multipart/form-data"

}

};

this.$http

.post(this.uploadURL, formData, config)

.then(function(response) {

if (response.status === 200) {

console.log(response.data);

}

});

}

}

};

</script>

<style lang="scss" scoped>

</style>

用 element-ui 的 Upload组件上传文件

http://element-cn.eleme.io/#/zh-CN/component/upload

<template>

<div>

<el-upload

class="upload-css"

:file-list="uploadFiles"

ref="upload"

:on-success="upLoadSuccess"

:on-error="upLoadError"

:action="uploadURL"

:auto-upload="false">

<el-button slot="trigger" size="small" type="primary">选取文件</el-button>

<el-button style="margin-left: 10px;" size="small" type="success" @click="submitUpload">上传到服务器</el-button>

</el-upload>

</div>

</template>

<script>

import Vue from "vue";

import { Upload, Button } from "element-ui";

Vue.use(Upload);

Vue.use(Button);

export default {

props: [],

data() {

return {

projectName: "",

//uploadURL: "/project/upload?a=1",

uploadFiles: [] //上传的文件列表

};

},

computed: {

//文件的上传路径

//附带用户id和项目名称

uploadURL: function() {

//var userId = this.$store.state.userId;

return "/project/upload?userId=" + 1;

}

},

methods: {

//文件上传

submitUpload() {

this.$refs.upload.submit();

},

//文件上传成功时的钩子

upLoadSuccess(response, file, fileList) {

if (response == "ok") {

console.log(response + "已上传" + file);

console.log("项目添加成功");

} else {

console.log("项目添加失败");

}

},

//文件上传失败时的钩子

upLoadError(response, file, fileList) {

console.log("项目添加失败");

}

}

};

</script>

<style lang="scss" scoped>

</style>

文件下载

普通的文件下载方式是访问一个后台文件流地址,直接生成对应的文件,下载即可,地址栏中也可携带一些控制参数,但是无法通过header传递参数。

两种文件下载方式,一种是,直接返回file文件,利用浏览器的下载功能。但是这种没有发现可以在发送请求的时候携带token;另一种是利用 Axios 发送下载文件的请求,可以设置header头,可以携带token ,但是response-type是blob类型的。

第一种:

后端API:

public FileResult downloadRequest()

{

//var addrUrl = webRootPath + "/upload/thumb.jpg";

var addrUrl = "D:/aaa/thumb.jpg";

var stream = System.IO.File.OpenRead(addrUrl);

string fileExt = Path.GetExtension("thumb.jpg");

//获取文件的ContentType

var provider = new FileExtensionContentTypeProvider();

var memi = provider.Mappings[fileExt];

return File(stream, memi, Path.GetFileName(addrUrl));

}

前端利用浏览器的功能url直接返回文件

下载文件...

...

...

downloadRequest() {

let url = "Home/downloadRequest"; //可以在路径中传递参数

window.location.href = url;

},

第二种

后端api ,两个api的返回类型不同,asp.net core 文件下载常用的有FileResult 、FileContentResult 、 FileStreamResult。

public FileContentResult downloadRequest1()

{

//string webRootPath = _hostingEnvironment.WebRootPath;

//var addrUrl = webRootPath + "/upload/thumb.jpg";

var addrUrl = "D:/aaa/wyy.exe";

/*var stream = System.IO.File.OpenRead(addrUrl);

string fileExt = Path.GetExtension("thumb.jpg");

//获取文件的ContentType

var provider = new FileExtensionContentTypeProvider();

var memi = provider.Mappings[fileExt];

return File(stream, memi, Path.GetFileName(addrUrl));*/

//return stream;

byte[] fileBytes = System.IO.File.ReadAllBytes(addrUrl);

string fileName = "wyy.exe";

return File(fileBytes, System.Net.Mime.MediaTypeNames.Application.Octet, fileName); //关键语句

}

前端页面

blob(用来存储二进制大文件)

<el-button type="primary" v-on:click="downloadRequest1">下载文件11</el-button>

...

...

...

downloadRequest1() {

axios({

// 用axios发送post请求

method: "post",

url: "Home/downloadRequest1", // 请求地址 ,也可以传递参数

headers: {

//可以自定义header

gggg: "gggggggggggggggggggggggggggggggggggggggggggggggggggg"  //可以携带token

},

responseType: "blob" // 表明返回服务器返回的数据类型

}).then(res => {

// 处理返回的文件流

//主要是将返回的data数据通过blob保存成文件

var content = res.data;

var blob = new Blob([content]);

var fileName = "wyy.exe"; //要保存的文件名称

if ("download" in document.createElement("a")) {

// 非IE下载

var elink = document.createElement("a");

elink.download = fileName;

elink.style.display = "none";

elink.href = URL.createObjectURL(blob);

document.body.appendChild(elink);

elink.click();

URL.revokeObjectURL(elink.href); // 释放URL 对象

document.body.removeChild(elink);

} else {

// IE10+下载

navigator.msSaveBlob(blob, fileName);

}

console.log(res);

});

}

第三种

就是用用up6控件,此控件支持mac、windos、Linux,因为太长就不发了,详细可以参考这篇文章:http://blog.ncmem.com/wordpress/2019/08/09/asp-net%e6%96%87%e4%bb%b6%e4%b8%8a%e4%bc%a0%e4%b8%8b%e8%bd%bd/

原文地址:https://www.cnblogs.com/songsu/p/11757872.html

时间: 2024-08-01 11:08:04

C# Asp.NET实现上传大文件(断点续传)的相关文章

Extjs+Asp.net实现上传大文件带实时进度条

主要是为了记录自己的学习过程,整理自己的思路以便以后的学习. 首先先说一下整体的思路. 我门都知道,asp自带的上传文件是先将上传的文件整个读取到内存然后在写入磁盘的.如果文件很大的话,上传时就会出现页面停滞,没有任何反映.用户根本不知道页面在做什么,也不知道是否在上传,上传了多少?这样的用户体验是很差的. 所以我门需要实现一个进度条来反映文件上传的进度,可以反映文件写入的进度.具体的思路是通过asp.net提供的HttpModule(Http模块)中的init方法内订阅各种应用程序事件(如Be

[Asp.net]Uploadify上传大文件,Http error 500 解决方案

/// 原来这个项目中用了这个控件 所以config设置文件大小没有 现在可以了 <location path="MailWrite.aspx" > <!--上传文件的页面路径--> <system.web> <neatUpload useHttpModule="true" /> <!--为true则代表使用neatUpload的httpModule,false为不使用--> <httpRuntime

Asp.Net上传大文件带进度条swfupload

Asp.Net基于swfupload上传大文件带进度条百分比显示,漂亮大气上档次,大文件无压力,先看效果 一.上传效果图 1.上传前界面:图片不喜欢可以自己换 2.上传中界面:百分比显示 3.上传后返回文件地址,我测试呢所以乱写的 二.核心代码 upload.htm代码 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml

uploadify上传大文件

引言 之前使用Uploadify做了一个上传图片并预览的功能,今天在项目中,要使用该插件上传大文件.之前弄过上传图片的demo,就使用该demo进行测试.可以查看我的这篇文章: [Asp.net]Uploadify所有配置说明,常见bug问题分析 . 大文件上传 第一步:修改uploadify参数 1 'fileSizeLimit': '0',//单个文件大小,0为无限制,可接受KB,MB,GB等单位的字符串值 2 'fileTypeDesc': '文件',//文件描述Image Files 3

WCF利用Stream上传大文件

WCF利用Stream上传大文件 转自别人的文章,学习这个例子,基本上wcf也算入门了,接口用法.系统配置都有了 本文展示了在asp.net中利用wcf的stream方式传输大文件,解决了大文件上传问题.主要是存档方便以后遇到该问题是来查阅.贴出部分代码,如果有疑惑或需要完整代码的请留言 WebForm1.aspx.cs protected void Button1_Click(object sender, EventArgs e) {             FileData file = n

在asp.net mvc中上传大文件

在asp.net mvc 页面里上传大文件到服务器端,需要如下步骤: 1. 在Control类里添加get 和 post 方法 1 // get method 2 public ActionResult Upload() 3 { 4 return View(); 5 } 6 7 // This action handles the form POST and the upload 8 [HttpPost] 9 public ActionResult Upload(HttpPostedFileBa

IIS上传大文件

IIS7.0上传文件限制的解决方法 在 Windows7(iis7.5).Win2008(iis 7.0)和Win2003(iis 6.0) 中,默认设置是特别严格和安全的,这样可以最大限度地减少因以前太宽松的超时和限制而造成的攻击.指定 ASP 请求的实体主体中允许大小为 200,000 (IIS6为204,800) 个字节,在 iis 6.0 之前的版本中,例如:Windows XP(IIS 5.1),没有限制. 这就造成了文件上传不能超过200k,而事实上是提交数据不能超过200k,你可以

上传大文件&amp;验证码

c#如何上传大文件? 想要想上传大文件,必须在web.config文件中进行配置. 在<system.web>节点中添加如下代码即可: <httpRuntime maxRequestLength="2097151"/> 这个代码就是表示设置最大请求值,上传文件也就相当于请求.maxRequestLength单位为KB,最大值为:209715 如果不设置,默认为4096 KB (4 MB). 也就是说上传的文件最大可以上传2G以内的文件. 一般没有配置的话,默认只

运用php上传大文件配置方法

网站建设:运用php上传大文件配置方法如下: 翻开php.ini, 1.第一找出 file uploads区域,有影响文件上传的以下几个参数: file_uploads = on ;能否准许经过http上传文件的开关.默许为on即是开 upload_tmp_dir ;文件上传至服务器上存储临时文件的地方,假设没指定就会用系统默许的临时文件夹 upload_max_filesize = 8m ;望文生意,即准许上传文件大小的最大值.默许为2m 2.在resource limits区域,还有参数 ;