通过Webapi下载文件:
//前端请求预览或下载文件(微信小程序也一样)
[HttpGet]
public async Task<IActionResult> DownloadYFPreview([FromQuery] string openId, string dbName, string orderName, string id)
{
if (openId == null || dbName == null || orderName == null)
return UnprocessableEntity();
//从sql server数据库获取下载的文件二进制内容
PreviewInfoModel infoModel = await _orderApproval.DownloadPreview(openId, dbName, orderName, id);
if (infoModel == null)
return null;
string lastinfo = infoModel.name.Split('.')[1];
if (lastinfo.Equals("docx"))
lastinfo = "doc";
else if (lastinfo.Equals("pptx"))
lastinfo = "ppt";
else if (lastinfo.Equals("xlsx"))
lastinfo = "xls";
//获取文件的contentType(通过后缀名从json文件中匹配contentType)
var item = new ConfigurationBuilder().SetBasePath(Directory.GetCurrentDirectory()).AddJsonFile("appsettings.json", optional: true, reloadOnChange: true).Build().GetSection("contenttype").GetSection(lastinfo).Value;
//下载文件
return File(infoModel.buffer, item, infoModel.name);
}
前端附件预览:
//附件预览
preview: function (id) {
var _this = this;
var path = _this.prefix + "/FindOne/" + id;
hzyAdmin.httpPost(path, {}, function (r) {
if (r.code !== 1) return;
//文件流
var imageBytes = r.data.model.cim002;
//contentType
var fileType = r.data.model.cim004;
var myFile = _this.createFile(imageBytes, fileType);
var urll = window.URL.createObjectURL(myFile);
window.open(urll);
});
},
//转换文件流
createFile: function (urlData, fileType) {
var bytes = window.atob(urlData),
n = bytes.length,
u8arr = new Uint8Array(n);
while (n--) {
u8arr[n] = bytes.charCodeAt(n);
}
return new Blob([u8arr], { type: fileType });
}
前端elementUi上传附件:
<div class="col-sm-12">
<el-upload class="upload-demo"
@*上传地址*@
action="/Admin/rgwimg/uploadinfo"
@*其它请求参数*@
:data={id:this.idx,name:this.name}
:on-preview="handlePreview"
:on-remove="handleRemove"
:before-remove="beforeRemove"
multiple
:on-exceed="handleExceed"
:on-success="success"
@*选择之后立即上传*@
:auto-upload="true"
:show-file-list="false">
<el-button size="large" type="primary">点击上传</el-button>
</el-upload>
</div>
后端接收上传附件保存到sql server中:
/// <summary>
/// 上传附件
/// </summary>
/// <param name="file"></param>
/// <param name="id"></param>
/// <param name="name"></param>
/// <returns></returns>
[HttpPost("uploadinfo")]
[DisableRequestSizeLimit]
public async Task<ApiResult> UploadInfo(IFormFile file,[FromForm] string id,[FromForm] string name)
{
return this.ResultOk(await this.DefaultService.SaveFormAsync(file, id, name));
}
/// <summary>
/// 保存数据
/// </summary>
/// <param name="file"></param>
/// <param name="id"></param>
/// <param name="name"></param>
/// <returns></returns>
public async Task<rgwimg> SaveFormAsync(IFormFile file,string id,string name)
{
BinaryReader r = new BinaryReader(file.OpenReadStream());
r.BaseStream.Seek(0, SeekOrigin.Begin); //将文件指针设置到文件开
rgwimg rgwimg = new rgwimg
{
cim001 = Guid.Parse(id),
cim003 = file.FileName,
cim004 = file.ContentType,
cim005 = name,
//文件流转换为byte[],保存到数据库中,sqlserver 字段类别为image
cim002 = r.ReadBytes((int)r.BaseStream.Length)
};
return await this.Repository.InsertOrUpdateAsync(rgwimg);
}
微信小程序附件预览:
//前端代码
<view class="rightopera" data-idx="{{item.docId}}" bindtap="download" >
//预览代码
download(e){
const id = e.currentTarget.dataset.idx;
let tokens=app.globalData.token;
wx.downloadFile({
url: 'https://192.168.0.127:44349/api/OrderApproval/DownloadYFPreview?dbName='+this.data.dbname+'&orderName='+this.data.ordername+'&openId='+app.globalData.openid+'&id='+id,
header:{
"Authorization": 'Bearer ' +tokens
},
success (res) {
//只要服务器有响应数据,就会把响应内容写入文件并进入 success 回调,业务需要自行判断是否下载到了想要的内容
if (res.statusCode === 200) {
var filePath=res.tempFilePath;
console.log(filePath);
var reg = RegExp(/.png/);
if(filePath.match(reg)){
var img=[];
img.push(filePath);
wx.previewImage({
current: img[0], //当前预览的图片
urls: img //所有要预览的图片
})
}else{
wx.openDocument({
filePath: filePath,
success: function (res) {
console.log('打开文档成功')
}
})
}
}
}
})
}
小程序前端附件上传:
//前端提交布局代码
<view class="bottomBtn" bindtap="submitForm">提交</view>
//附件提交代码
submitForm(e) {
if (this.data.details == "") {
wx.showToast({
title: "请输入评论",
icon: "loading",
duration: 1000
});
return;
}
let time = new Date().getTime();
let tokens = app.globalData.token;
this.uploadFile(time, tokens).then(res => {
if (res.statusCode == "401") {
request.getLoginInfo(app.globalData.openid).then(res => {
tokens = res.data.token;
this.uploadFile(time, tokens).then(res => {
wx.showToast({
title: "网络异常,请稍后重试",
icon: "loading",
duration: 1000
});
});
});
} else if (res.statusCode == "200") {
this.backprevious();
} else {
wx.showToast({
title: "网络异常,请稍后重试",
icon: "loading",
duration: 1000
});
}
});
},
uploadFile(time, tokens) {
var result = true;
var length = this.data.images.length;
return new Promise((resolve, reject) => {
for (let i = 0; i < length; i++) {
if (!result) break;
wx.uploadFile({
url: "https://www.baidu.com/api/OrderApproval/UploadImg",
filePath: this.data.images[i],
name: "file",
header: {
"Content-Type": "multipart/form-data;application/json;",
Authorization: "Bearer " + tokens
},
formData: {
orderid: this.data.orderid,
openid: app.globalData.openid,
content: this.data.details,
times: time
},
success: function(res) {
if (res.statusCode == "401") {
result = false;
resolve(res);
}
if (i == length - 1 && res.statusCode == "200") {
resolve(res);
}
},
fail: function(err) {
result = false;
reject(err);
},
complete: function(res) {
wx.showToast({
title: "上传" + i + " code:" + res.statusCode+" errMsg:"+res.errMsg,
icon: "loading",
duration: 1000
});
}
});
}
});
}
后端接收附件保存到服务器指定文件夹:
/// <summary>
/// 上传图片,通过Form表单提交
/// </summary>
/// <returns></returns>
[HttpPost]
//[DisableRequestSizeLimit] //不限制请求头model的大小
//[RequestSizeLimit(100_000_000)] //请求大小值为100,000,000 字节
public async Task<IActionResult> UploadImg()
{
commentModel commentModel = new commentModel();
if (Request.Form.TryGetValue("orderid", out StringValues orderid))
commentModel.orderid = orderid.ToString();
if (Request.Form.TryGetValue("openid", out StringValues openid))
commentModel.openid = openid.ToString();
if (Request.Form.TryGetValue("content", out StringValues content))
commentModel.content = content.ToString();
if (Request.Form.TryGetValue("times", out StringValues times))
commentModel.times = times.ToString();
var sx = Request.Form.Files["file"];
var now = DateTime.Now;
var pathdate = now.ToString("yyyy") + now.ToString("MM") + now.ToString("dd");
//文件存储路径
var filePath = string.Format("/Uploads/{0}/{1}/{2}/", now.ToString("yyyy"), now.ToString("MM"), now.ToString("dd"));
//获取当前web目录
var webRootPath = Directory.GetCurrentDirectory();
if (!Directory.Exists(webRootPath + filePath))
{
Directory.CreateDirectory(webRootPath + filePath);
}
try
{
var fileExtension = Path.GetExtension(sx.FileName);
var strDateTime = DateTime.Now.ToString("yyMMddhhmmssfff"); //取得时间字符串
var strRan = Convert.ToString(new Random().Next(100, 999)); //生成三位随机数
var saveName = strDateTime + strRan + fileExtension;
string path = webRootPath + filePath + pathdate + saveName;
using (FileStream fs = System.IO.File.Create(path))
{
sx.CopyTo(fs);
fs.Flush();
}
commentModel.picAddress = pathdate + saveName;
bool result = await _orderApproval.SavePics(commentModel);
if (!result)
return BadRequest("保存失败,请稍后重试");
return Ok();
}
catch (Exception ex)
{
return BadRequest();
}
}
流转换:
//byte[]直接转换内存流,供下载使用
byte[] buffer=new byte[1000];
MemoryStream ms = new MemoryStream(buffer);
ms.Write(buffer, 0, buffer.Length);
ms.Position = 0;
ms.Seek(0, SeekOrigin.Begin);
return new FileContentResult(buffer, "image/png");
//FileStream转为MemoryStream,再转为byte[]
byte[] StreamToFile(FileStream fileStream, MemoryStream memoryStream)
{
byte[] files = new byte[0];
byte[] fileBytes = new byte[fileStream.Length];
fileStream.Read(fileBytes, 0, (int)fileStream.Length);
memoryStream.Write(fileBytes, 0, (int)fileStream.Length);
files= memoryStream.ToArray();
fileStream.Close();
memoryStream.Close();
return files;
}
读取网络共享文件:
参考:https://www.cjavapy.com/article/395/
byte[] files=new byte[0];
var folder = new SmbFile("smb://Administrator:123@192.168.0.84/YFATTACH/0010000132.001");
if (!folder.Exists())
return files;
//获取可读的流
var readStream = folder.GetInputStream();
//获取 bytes.
((Stream)readStream).CopyTo(memStream);
//Dispose可读的流。
readStream.Dispose();
files= memoryStream.ToArray();
return files;
把网络共享文件读到本地:
byte[] ReadFile(string path,string fileId,string fileName)
{
byte[] files = new byte[0];
string filepath = Directory.GetCurrentDirectory() + "/Files/";
string oldFileName = $"{filepath}/{fileId}";
string newFileName = $"{filepath}/{fileName}";
FileStream fileStream = null;
//判断文件是否存在
bool isExists = File.Exists($"{filepath}/{fileName}");
if (isExists)
//若存在,则读取文件到内存
fileStream = new FileStream($"{filepath}/{fileName}", FileMode.Open);
//创建读取缓存
var memStream = new MemoryStream();
if (!isExists)
{
//var folder = new SmbFile("smb://Administrator:123@192.168.0.84/YFATTACH/0010000132.001");
var folder = new SmbFile($"smb://{path}");
if (!folder.Exists())
return files;
//获取可读的流。
var readStream = folder.GetInputStream();
//获取 bytes.
((Stream)readStream).CopyTo(memStream);
//Dispose可读的流。
readStream.Dispose();
if (!Directory.Exists(filepath))
{
Directory.CreateDirectory(filepath);
}
string filesName = filepath + folder.GetName();
using (FileStream fls = System.IO.File.Create(filesName))
{
//内存流转为文件流,并写入磁盘
fls.Write(memStream.ToArray(), 0, memStream.ToArray().Length);
fls.Close();
}
//重命名文件名及扩张名
File.Copy(oldFileName, newFileName);
fileStream = new FileStream($"{filepath}/{fileName}", FileMode.Open);
if (fileStream.Length > 0)
files= StreamToFile(fileStream, memStream);
}
else
files= StreamToFile(fileStream, memStream);
//删除指定文件
File.Delete(oldFileName);
File.Delete(newFileName);
return files;
}
byte[] StreamToFile(FileStream fileStream, MemoryStream memoryStream)
{
byte[] files = new byte[0];
byte[] fileBytes = new byte[fileStream.Length];
fileStream.Read(fileBytes, 0, (int)fileStream.Length);
memoryStream.Write(fileBytes, 0, (int)fileStream.Length);
files= memoryStream.ToArray();
fileStream.Close();
memoryStream.Close();
return files;
}
谢谢打赏: