ASP.NET Core 上傳文件到共享文件夾
參考資料:ASP.NET 上傳文件到共享文件夾
創建共享文件夾參考資料://www.cnblogs.com/dansediao/p/5712657.html
一、配置上傳文件相關參數並讀取參數
1.配置appsettings.json
{
"FileUploadInfo": {
"UploadPath": "\\\\172.21.0.10\\File",
"DownloadPath": "//213.10.11.126:8001/",
"UserName": "ShareUser",
"Password": "Password"
}
}
2.讀取配置數據
2.1 新建實體類
/// <summary> /// 文件上傳配置項 /// </summary> public class FileUploadConst { /// <summary> /// 上傳地址 /// </summary> public string UploadPath { get; set; } /// <summary> /// 文件訪問/下載地址 /// </summary> public string DownloadPath { get; set; } /// <summary> /// 訪問共享目錄用戶名 /// </summary> public string UserName { get; set; } /// <summary> /// 訪問共享目錄密碼 /// </summary> public string Password { get; set; } }
2.2 映射實體類與配置項
在startup.cs中配置
public void ConfigureServices(IServiceCollection services)
{
services.Configure<FileUploadConst>(Configuration.GetSection("FileUploadInfo"));
}
3.控制器中讀取配置項,通過注入的方式
public FileUploadConst FileUploadConfig { get; set; } public UploadController(IOptions<FileUploadConst> option) { FileUploadConfig = option.Value; }
二、上傳文件
上傳文件之前記得初始化構造方法,注入文件上傳配置項!!!!!↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑
1.連接文件伺服器方法
/// <summary> /// 連接遠程共享文件夾 /// </summary> /// <param name="path">遠程共享文件夾的路徑</param> /// <param name="userName">用戶名</param> /// <param name="passWord">密碼</param> private static bool connectState(string path, string userName, string passWord) { var flag = false; var proc = new Process(); try { proc.StartInfo.FileName = "cmd.exe"; proc.StartInfo.UseShellExecute = false; proc.StartInfo.RedirectStandardInput = true; proc.StartInfo.RedirectStandardOutput = true; proc.StartInfo.RedirectStandardError = true; proc.StartInfo.CreateNoWindow = true; proc.Start(); var dosLine = "net use " + path + " " + passWord + " /user:" + userName; proc.StandardInput.WriteLine(dosLine); proc.StandardInput.WriteLine("exit"); while (!proc.HasExited) { proc.WaitForExit(1000); } var errormsg = proc.StandardError.ReadToEnd(); proc.StandardError.Close();if (string.IsNullOrEmpty(errormsg)) { flag = true; } else { throw new Exception(errormsg); } } catch (Exception ex) { WriteHelper.WriteFile(ex); throw ex; } finally { proc.Close(); proc.Dispose(); } return flag; }
2.傳輸文件流到伺服器中
/// <summary> /// 向遠程文件夾保存本地內容,或者從遠程文件夾下載文件到本地 /// </summary> /// <param name="inFileStream">要保存的文件的路徑,如果保存文件到共享文件夾,這個路徑就是本地文件路徑如:@"D:\1.avi"</param> /// <param name="dst">保存文件的路徑,不含名稱及擴展名</param> /// <param name="fileName">保存文件的名稱以及擴展名</param> private static void Transport(Stream inFileStream, string dst, string fileName) {if (!Directory.Exists(dst)) { Directory.CreateDirectory(dst); } dst = dst + fileName; if (!System.IO.File.Exists(dst)) {var outFileStream = new FileStream(dst, FileMode.Create, FileAccess.Write); var buf = new byte[inFileStream.Length]; int byteCount; while ((byteCount = inFileStream.Read(buf, 0, buf.Length)) > 0) { outFileStream.Write(buf, 0, byteCount); } inFileStream.Flush(); inFileStream.Close(); outFileStream.Flush(); outFileStream.Close(); } }
3.接收文件並上傳到文件伺服器
/// <summary> /// 上傳附件到文件伺服器中 /// </summary> [HttpPost, Route("api/Upload/UploadAttachment")] [AllowAnonymous] public ServiceResponse<UploadRespModel> UploadAttachment() { var viewModel = new UploadRespModel(); var code = 200; var msg = "上傳失敗!"; var path = FileUploadConfig.UploadPath; //@"\\172.16.10.130\Resource"; var s = connectState(path, FileUploadConfig.UserName, FileUploadConfig.Password); try { if (s) { var filelist = HttpContext.Request.Form.Files; if (filelist.Count > 0) { var file = filelist[0]; var fileName = file.FileName; var blobName = FileHelper.GetSaveFolder(fileName); path = $@"{path}\{blobName}\"; fileName = $"{DateTime.Now:yyyyMMddHHmmss}{fileName}"; //共享文件夾的目錄 var theFolder = new DirectoryInfo(path); var remotePath = theFolder.ToString(); Transport(file.OpenReadStream(), remotePath, fileName); viewModel.SaveUrl = $"{blobName}/{fileName}"; viewModel.DownloadUrl = GetFileFullPath(viewModel.SaveUrl); msg = "上傳成功"; } } else { code = CommonConst.Code_OprateError; msg = "鏈接伺服器失敗"; } } catch (Exception e) { Console.WriteLine(e); msg = e.Message; } return ServiceResponse<UploadRespModel>.SuccessResponse(msg, viewModel, code); }
4.圖片地址拼接方法
/// <summary> /// 拼接文件全路徑 /// </summary> /// <param name="filePath">文件相對地址</param> private string GetFileFullPath(string filePath) { var str = string.Empty; if (!string.IsNullOrEmpty(filePath)) { // 兼容舊數據 if (filePath.Contains("//") || filePath.Contains("//")) { str = filePath; } else { var host = FileUploadConfig.DownloadPath; str = $"{host}/{filePath}"; } } return str; }