源代码文件直接上传即可,为了手机端测试所以额外转成了base64
选择文件
仅限.jpg、.png、.pdf、.doc、.docx、.xls、.xlsx类型文件
action:后端接口的路径
multiple:多文件上传
limit: 限制上传文件个数,不写默认是无限个,该属性是重复调用接口,上传一个文件调用一次接口,所以后台处理时,只需一个个进行处理,而不需要列表形式接收
要注意,前端传的文件虽然是多次调用接口,但上传的文件属于同一批次,所以增加了index来区分该批次的文件
前端传入文件转换为base64格式
// 选择文件改变
handleChange(files, fileList, base64Code) {
// console.log(files);
var reader = new FileReader();
reader.readAsDataURL(files.raw); // 一定要传入file格式
reader.onload = () => {
console.log("file 转 base64结果:" + reader.result);
this.base64Code = reader.result;
};
reader.onerror = function(error) {
console.log("Error: ", error);
};
this.fileList = fileList
},
后端
文件转化为base64后,字符串会特别长(80kb对应约108087字符),且传输来的值为(data:image/jpeg;base64,/9j/4AAQSkZJRgABAQEAAQABAAD/2w......省略10万),为此需要去除多余字符,只保留base64,之后的有用字符,再将有用字符里多余的换行符等等删掉,并进一步缩减(最后剩余大概不到20位),之后将base64再转换为文件存入指定文件夹中,文件保存名等存入数据库。
保留了直接接收传入文件形式的数据,base64是为了接收手机端传来的数据,文件是直接接收PC端的数据。
string filePath = @"D:\work\lcpwgzweb\";
private readonly IUploadService _uploadService;
public UploadController(IUploadService uploadService)
{
_uploadService = uploadService;
}
// 上传文件
[HttpPost]
[Route("UploadFile")]
public ActionResult UploadFile([FromForm] IFormFile file, int index, int fileType, string base64Code)
{
bool result = true;
try
{
if (base64Code != null)
{
//读取传值的数组第二位的值
string base64pre = base64Code.Split("base64,")[1];
//去除多余字符
string base64 = base64pre.Trim().Replace("%", "").Replace(",", "").Replace(" ", "+");
//base64过长,将其长度缩减
if (base64.Length % 4 > 0)
{
base64 = base64.PadRight(base64.Length + 4 - base64.Length % 4, '=');
}
//文件名
string fileName = System.IO.Path.GetFileName(file.FileName);
//文件后缀
var fileExtension = Path.GetExtension(file.FileName);//获取文件格式,拓展名
//保存的文件名称
string guid = Guid.NewGuid().ToString();
string saveName = @"uploadFile\" + guid + fileExtension;
//base64转文件
byte[] bytes = Convert.FromBase64String(base64);
// 写入文件到指定位置
using (System.IO.FileStream fs = new System.IO.FileStream(filePath + saveName, System.IO.FileMode.Create, System.IO.FileAccess.Write))
{
fs.Write(bytes, 0, bytes.Length);
fs.Flush();
}
result = _uploadService.UploadFile(index, fileType, fileName, saveName);
if (false == result)
{
return new JsonResult(new { isSuccess = false, resultMsg = "文件上传失败" });
}
}
else if (file != null)
{
//文件名
string fileName = System.IO.Path.GetFileName(file.FileName);
//文件后缀
var fileExtension = Path.GetExtension(file.FileName);//获取文件格式,拓展名
//保存的文件名称
string guid = Guid.NewGuid().ToString();
string saveName = @"uploadFile\" + guid + fileExtension;
//文件保存
using (var fs = System.IO.File.Create(filePath + saveName))
{
file.CopyTo(fs);
fs.Flush();
}
result = _uploadService.UploadFile(index, fileType, fileName, saveName);
if (false == result)
{
return new JsonResult(new { isSuccess = false, resultMsg = "文件上传失败" });
}
}
}
catch (Exception ex)
{
return new JsonResult(new { isSuccess = false, resultMsg = "文件上传失败" });
}
JsonResult jr = new JsonResult(result);
return jr;
}
filePath:上传文件的路径,记得提前建立文件夹
Service及xml只需存入文件保存名即可
Service文件
///
/// 上传文件
///
///
public bool UploadFile(int glitchId, int fileType, string fileName, string saveName)
{
return _fileMappingRepository.Insert(glitchId, fileType, fileName, saveName);
}
XML
INSERT into dbo.FileMapping
(GlitchId, FileType, OldFileName, NewFileName)
values
(@glitchId, @fileType, @fileName, @saveName)