一 文件下载
首先,添加RestSharp的引用。这里我已经引用了RestSharp,所以“安装”按钮不可点击。
有的附件(即文件)下载时需根据MediaID文件标识以及身份验证条件符合才能下载,以下为程序内容:
/// <summary> /// 获取图片保存到本地并返回本地地址 /// </summary> /// <param name="mediaId">文件标识</param> /// <returns></returns> public static DownloadFileModel DownloadFile(string mediaId) { var client = new RestClient("http://....这里为下载地址的域名"); DownloadFileModel result = new DownloadFileModel();//自定义的模型,包括MemoryStream类型的数据流及string类型的文件名称 try { client.Timeout = 20000;//超时限制 client.Authenticator = new HttpBasicAuthenticator("账号", "密码");//添加身份验证,具体根据接口需求定义 var request = new RestRequest("API接口"), Method.GET); IRestResponse response = client.Execute(request); if (response.ErrorException != null) { throw new Exception(response.ErrorMessage); } if (response.StatusCode == HttpStatusCode.OK && response.ResponseStatus == ResponseStatus.Completed) { var item = response.Headers.Where(h => h.Name == "Content-Disposition").FirstOrDefault(); if (item != null) { ContentDisposition contentDisposition = new ContentDisposition(item.Value.ToString()); result.Filename = HttpUtility.UrlDecode(contentDisposition.FileName); } } result.DownloadStream = new MemoryStream(response.RawBytes);//获得数据流 return result; } catch (Exception ex) { Console.WriteLine(ex.Message); } return null; }
或者直接根据文件完整地址URL下载,程序如下:
/// <summary> /// 根据URl下载图片 /// </summary> /// <param name="downloadUrl">文件下载地址</param> /// <returns></returns> public static DownloadFileModel DownloadPic(string downloadUrl) { DownloadFileModel result = new DownloadFileModel();//自定义数据模型,包括MemoryStream类型的数据流及string类型的文件名称 try { WebClient web = new WebClient(); byte[] fileBytes = web.DownloadData(downloadUrl); var filename = Convert.ToString(DateTime.Now.Ticks);//文件名称以当前时间戳命名 result.DownloadStream = new MemoryStream(fileBytes);//获得数据流 result.Filename = filename; return result; } catch (Exception ex) { Console.WriteLine(ex.Message); return null; } }
二 保存文件
保存图片时,给出文件选择框,以便让用户自行选择将文件保存到哪个路径下。
/// <summary> /// 选择路径并保存文件 /// </summary> /// <param name="fileName">文件名,带后缀</param> /// <param name="stream">文件流</param> /// <returns></returns> public static string SaveStream(string fileName, MemoryStream stream) { if (stream == null) return null; Microsoft.Win32.SaveFileDialog saveFileDialog = new Microsoft.Win32.SaveFileDialog(); //设置文件类型 //书写规则例如:txt files(*.txt)|*.txt //saveFileDialog.Filter = "txt files(*.txt)|*.txt|xls files(*.xls)|*.xls|All files(*.*)|*.*|图片|*.jpg;*.png;*.gif;*.bmp;*.jpeg"; //可能要获取的路径名 string localFilePath = ""; //设置默认文件名(可以不设置) saveFileDialog.FileName = fileName; //保存对话框是否记忆上次打开的目录 saveFileDialog.RestoreDirectory = true; // Show save file dialog box bool? result = saveFileDialog.ShowDialog(); //点了保存按钮进入 if (result == true) { //获得文件路径 localFilePath = saveFileDialog.FileName; using (var fs = new FileStream(localFilePath, FileMode.Create, FileAccess.ReadWrite)) { fs.Write(stream.ToArray(), 0, ((int)stream.Length)); } return localFilePath; } return null; }
三 打开文件
一般指定openFileDialog对象的默认路径及选中的文件,openFileDialog.ShowDialog()方法调用后,会弹出指定路径的文件选择框,当用户点击“打开”按钮时,此处result会为true,然后再根据openFileDialog.FileName获得选中的文件路径(路径+文件名称+后缀),最后调用Process.Start()方法打开目标文件。注意。如果当前系统中不存在打开此文件的应用程序,则调用Process.Start()方法后会抛出异常,异常信息可在catch中查看。
/// <summary> /// 打开文件目录 /// </summary> /// <param name="fileName">文件名,带后缀</param> /// <returns></returns> public static OpenFileModel OpenFilePath(string filePath) { var openFileModel = new OpenFileModel(); //自定义的数据模型,有bool类型的是否打开成功状态以及string类型的错误提示信息 if (filePath == null || filePath.Length == 0) { openFileModel.status = false; return openFileModel; } bool exits = File.Exists(filePath); if (!exits) { openFileModel.status = false; return openFileModel; } int index = filePath.LastIndexOf('.'); if (index < 0) { openFileModel.status = false; return openFileModel; } var fileName = filePath.Substring(filePath.LastIndexOf("\\") + 1);//获得文件名称 var path = filePath.Substring(0, filePath.LastIndexOf("\\"));//获得文件路径 try { Microsoft.Win32.OpenFileDialog openFileDialog = new Microsoft.Win32.OpenFileDialog(); openFileDialog.FileName = fileName; openFileDialog.InitialDirectory = path; // Show save file dialog box bool? result = openFileDialog.ShowDialog();//打开目标文件所在目录 if (result == true)// { Console.WriteLine(openFileDialog.FileName); System.Diagnostics.Process.Start(openFileDialog.FileName);//打开用户选择的文件 } openFileModel.status = true; return openFileModel; } catch (Exception e) { openFileModel.status = true; openFileModel.message = e.Message; return openFileModel; } }
四 选择文件
这里借助OpenFileDialog实现筛选图片的功能。
程序说明:Filter为过滤条件,默认筛选所有文件;InitialDirectory为默认打开的路径。
private async void btnChooseFile(object sender, RoutedEventArgs e) { System.Windows.Forms.OpenFileDialog dialog = new System.Windows.Forms.OpenFileDialog(); dialog.AddExtension = true; dialog.Filter = "所有图片|*.bmp;*.ico;*.gif;*.jpeg;*.jpg;*.png;*.tif;*.tiff"; dialog.InitialDirectory = "c:\\"; dialog.RestoreDirectory = true; if (dialog.ShowDialog() == System.Windows.Forms.DialogResult.OK) { var filePath = dialog.FileName; if (!string.IsNullOrWhiteSpace(filePath)) { var ext = Path.GetExtension(filePath); bool isImage = ".jpg|.jpeg|.bmp|.gif|.png|.tiff".Contains(ext.ToLower()); //以下根据获得到的文件路径进行其他具体操作 } } }
五 上传文件
程序说明:OperationStatus为我自定义的请求状态模型,包括请求结果状态(成功/失败)以及文字信息。
public async Task<OperationStatus> DoUpload(string path) { var operationStatus = new OperationStatus(); if (path == null || !File.Exists(path)) { operationStatus.Status = false; operationStatus.Message = "文件不存在"; return operationStatus; } try { var fileName = Path.GetFileName(path); var model = new MediaFileModel { ThumbUrl = path, MediaLength = new FileInfo(path).Length, RealName = fileName }; var stream = File.OpenRead(path); var bytes = new byte[stream.Length]; stream.Read(bytes, 0, bytes.Length); //以下根据获得的文件路径及字节流进行具体上传操作 stream.Close(); } catch (Exception e) { operationStatus.Message = e.Message; operationStatus.Status = false; } return operationStatus; }