/// <summary> /// 计算文件分块大小 /// </summary> private int CaculateProgressBarMaxSize(int iFileLength) { int iStep = 0; if (iFileLength <= 5242880) { iStep = 204800; } else if (iFileLength <= 10485760) { iStep = 512000; } else if (iFileLength <= 20971520) { iStep = 1048576; } else { iStep = 2097152; } LogTrace.TraceVerbose("Caculate the size of bytes ({0}) that in the uploading stream each time.", iStep); return((int)Math.Ceiling((double)iFileLength / (double)iStep)); }
/// <summary> /// 从注册表中获取Web Service的URL地址 /// </summary> private void GetWebServiceURL() { try { RegistryKey regKey = Registry.CurrentUser.OpenSubKey(@"SOFTWARE\MICROSOFT\OFFICE\OUTLOOK\ADDINS\PinganAttachment.OutlookAddin", false); WebServiceUrl = regKey.GetValue("WosAppServiceURL").ToString(); LogTrace.TraceVerbose("Read web service URL({0}) from register table.", WebServiceUrl); } catch (Exception ept) { WebServiceUrl = String.Empty; LogTrace.TraceException(ept); } }
/// <summary> /// 创建PutOid请求,通过之前预申请的oid向Wos云端上传文件 /// </summary> /// <param name="oid">Wos对象标识</param> /// <returns>返回HttpWebRequest对象</returns> public String ExecuteCreateSeaFileCreateLibraryRequest(String strToken, String strLibrary) { LogTrace.TraceInfo("ExecuteCreateSeaFileCreateLibraryRequest"); HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url + "/api2/repos/"); req.Method = "POST"; req.ContentType = "application/x-www-form-urlencoded"; req.Accept = "application/json; indent=4"; req.UserAgent = "curl/7.19.0 (i586-pc-mingw32msvc) libcurl/7.19.0 zlib/1.2.3"; req.Headers.Add("Authorization: Token " + strToken); req.Timeout = 10000; req.KeepAlive = false; String strPostContent = "name=" + strLibrary.Trim() + "&desc=new library"; UTF8Encoding code = new UTF8Encoding(); try { Stream postStream = req.GetRequestStream(); postStream.Write(code.GetBytes(strPostContent), 0, code.GetBytes(strPostContent).Length); postStream.Close(); HttpWebResponse res = (HttpWebResponse)req.GetResponse(); LogTrace.TraceInfo("Response code for CreateLibrary is {0}", res.StatusCode); String strResponse = String.Empty; Stream rStream = res.GetResponseStream(); StreamReader sr = new StreamReader(rStream); strResponse = sr.ReadToEnd(); req.Abort(); res.Close(); LogTrace.TraceVerbose("Got Server response [{0}]", strResponse); JObject jo = (JObject)JsonConvert.DeserializeObject(strResponse); return(jo["repo_id"].ToString()); } catch (Exception ept) { LogTrace.TraceException(ept); return(String.Empty); } }
/// <summary> /// 在上传过程中更新进度条状态 /// </summary> private void bgwUploadFile_ProgressChanged(object sender, System.ComponentModel.ProgressChangedEventArgs e) { try { uploadProgressBar.Show(); lbInfo.Hide(); uploadProgressBar.Value = e.ProgressPercentage; float fProgress = ((float)e.ProgressPercentage * (float)100 / (float)uploadProgressBar.Maximum); uploadInfo.Text = String.Format("正在上传附件:{0}, 完成 {1:F2}%", (String)e.UserState, fProgress); LogTrace.TraceVerbose("Uploding file in progress, finished {0}%", fProgress); } catch (Exception ept) { LogTrace.TraceException(ept); } }
/// <summary> /// 替换附件为下载页面(HTML文件) /// </summary> private void ReplceAttachment(String strFileName, String strDownloadURL) { //ClientProfile profile = Globals.ThisAddIn.Profile; //OBSUploadManagement obsMgr = new OBSUploadManagement(Globals.ThisAddIn.WebServiceUrl); Outlook.Application objApplication = Globals.ThisAddIn.Application; Outlook.Inspector objInspector = objApplication.ActiveInspector(); //替换附件到邮件中 try { String strTempFolder = System.Environment.GetEnvironmentVariable("TEMP"); DownloadPage htmlPage = new DownloadPage(); htmlPage.FileName = strFileName; htmlPage.PageContent = "<script language=\"javascript\" type=\"text/javascript\"> window.location.href='" + strDownloadURL + "'; </script>"; String strTempFile = strTempFolder + @"\" + htmlPage.FileName + ".htm"; FileStream stream = File.Create(strTempFile); StreamWriter sWrite = new StreamWriter(stream); sWrite.Write(htmlPage.PageContent); sWrite.Close(); stream.Close(); LogTrace.TraceVerbose("Create Temp file under: {0}", strTempFile); ((dynamic)objInspector.CurrentItem).Attachments.Add(strTempFile, Outlook.OlAttachmentType.olByValue, 1, strFileName); ((dynamic)objInspector.CurrentItem).Save(); if (File.Exists(strTempFile)) { //如果存在则删除 File.Delete(strTempFile); LogTrace.TraceVerbose("Remove Temp file under: {0}", strTempFile); } } catch (Exception ept) { MessageBox.Show("Add attachment failed. " + ept.Message); LogTrace.TraceException(ept); UploadInProgress = false; } }
/// <summary> /// 定时器,定时获取客户端配置信息 /// </summary> void TimerQueryProfile_Tick(object sender, EventArgs e) { //bool result = this.QueryProfile(); LogTrace.TraceVerbose("Timer for Profile query triggered."); }
/// <summary> /// 选择上传的文件 /// </summary> private void btSelectFile_Click(object sender, EventArgs e) { String strFilePath = null; String strFileName = null; if (Globals.ThisAddIn.m_LoadProfileSucceed == false) { logTrace.TraceInfo("Profile not cached, start first quering."); bool result = Globals.ThisAddIn.QueryProfile(); if (result == false) { MessageBox.Show("配置文件未下载成功!"); return; } } ClientProfile profile = Globals.ThisAddIn.Profile; OpenFileDialog dlgSelectFile = new OpenFileDialog(); dlgSelectFile.FileName = "*.*"; if (dlgSelectFile.ShowDialog() == DialogResult.OK) { strFilePath = dlgSelectFile.FileName; strFileName = dlgSelectFile.SafeFileName; } else { return; } logTrace.TraceInfo("Select file: {0}, Path: {1}, for uploading.", strFileName, strFilePath); Application.DoEvents(); //去掉该声名,进度条将无法使用 ProgressBar pb = new ProgressBar(); //Label lb = new Label(); //获取文件信息 FileInfo fInfo = GetFileInfo(strFilePath, strFileName); logTrace.TraceVerbose("File {0} size is {1:N}", strFileName, fInfo.FileLength); //检查文件是否为空,或超过管理员限制大小 if (fInfo.FileLength == 0) { MessageBox.Show("文件为空,请重新选择!"); return; } else if (fInfo.FileLength / 1024 / 1024 > profile.MaxFileLength) { MessageBox.Show(" 上传文件大小超过管理员设定最大值(" + profile.MaxFileLength + "MB)!"); return; } //向Web Service发送上传文件请求 OBSUploadManagement obsMgr = new OBSUploadManagement(Globals.ThisAddIn.m_strWebServiceUrl); UploadReqResponse uploadResponse = obsMgr.RequestUploadFile(fInfo); //如果Web Service接收了上传请求,返回oid if (uploadResponse.Code == 201) // 接受上传附件 { logTrace.TraceInfo("Web Server allow to upload file to OBS."); //初始化进度条对象 uploadProgressBar.Minimum = 0; uploadProgressBar.Maximum = CaculateProgressBarMaxSize(fInfo.FileLength); uploadProgressBar.Value = 0; uploadProgressBar.Show(); btSelectFile.Enabled = false; //创建后台线程来上传附件到云盘 m_bgwUploadFile = new BackgroundWorker(); // 实例化后台对象 m_bgwUploadFile.WorkerReportsProgress = true; // 设置可以通告进度 m_bgwUploadFile.WorkerSupportsCancellation = true; // 设置可以取消 //注册后台线程事件 m_bgwUploadFile.DoWork += new DoWorkEventHandler(bgwUploadFile_DoWork); m_bgwUploadFile.ProgressChanged += new ProgressChangedEventHandler(bgwUploadFile_ProgressChanged); m_bgwUploadFile.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bgwUploadFile_RunWorkerCompleted); //启动线程 m_bgwUploadFile.RunWorkerAsync(new object[] { strFilePath, strFileName, uploadResponse }); logTrace.TraceInfo("Start uploading thread for file {0}", strFileName); uploadInfo.Text = "准备上传附件:" + strFileName + " ,请稍后..."; } else if (uploadResponse.Code == 200) //附件已经存在,不需要重新上传 { //替换附件到邮件中 logTrace.TraceInfo("File ({0}) already on OBS.", strFileName); ReplceAttachment(strFileName, uploadResponse.FileKey); } else //其他,请求上传附件失败 { MessageBox.Show("附件上传失败,错误代码:" + uploadResponse.Code.ToString()); logTrace.TraceError("Upload File Request Failed, ERROR Code {0}", uploadResponse.Code.ToString()); } }
private Boolean SeafileLogon() { Boolean bFoundToken = false; string strUrl = Globals.ThisAddIn.GetSeafileURL(); if (strUrl != null && strUrl != "" && strUrl != String.Empty) { httpClient = new WosHttpClient(strUrl); LogTrace.TraceInfo("Connect to Fileshare with URL: {0}", strUrl); } else { LogTrace.TraceError("Sharefile URL is empty."); LogTrace.TraceInfo("Turn logon off (3)"); pbLogon.Image = global::FileToUpload.Properties.Resources.off; return(false); } String strDesKey = Globals.ThisAddIn.Application.Session.CurrentUser.AddressEntry.GetExchangeUser().PrimarySmtpAddress.Substring(0, 8); RegistryKey regKey = Registry.CurrentUser.OpenSubKey(@"SOFTWARE\MICROSOFT\OFFICE\OUTLOOK\ADDINS\PinganAttachment.OutlookAddin", true); try { if (regKey != null) { m_strToken = Decrypt(regKey.GetValue("token").ToString(), strDesKey); if (m_strToken != null && m_strToken != String.Empty) { Boolean b = httpClient.ExecuteSeaFilePingRequest(m_strToken); if (b) { LogTrace.TraceVerbose("Retrieve Token {0} from register Key.", m_strToken); bFoundToken = true; } } } else { bFoundToken = false; } } catch (Exception ept) { LogTrace.TraceException(ept); bFoundToken = false; } // Retrieve Token for current user if (!bFoundToken) { String strLoginUser, strLoginPassword; LogonDialog dlg = new LogonDialog(); DialogResult result = dlg.ShowDialog(); if (result == DialogResult.OK) { strLoginUser = dlg.EmailAddress; strLoginPassword = dlg.Password; LogTrace.TraceVerbose("Logon user Name is {0}, password is {1}", strLoginUser, "*********"); } else { LogTrace.TraceInfo("Cancel logon"); LogTrace.TraceInfo("Turn logon off (4)"); pbLogon.Image = global::FileToUpload.Properties.Resources.off; return(false); } HttpSeaFileTokenResponse rsp = httpClient.ExecuteSeaFileTokenRequest(strLoginUser, strLoginPassword); if (rsp != null) { regKey.SetValue("token", Encrypt(rsp.Token, strDesKey)); m_strToken = rsp.Token; LogTrace.TraceVerbose("Save token {0} into register key.", m_strToken); } else { MessageBox.Show("1、如果您已是云盘用户,请输入正确的邮箱密码(开机密码)\n\r2、如果您还不是云盘用户请联系所在机构IT咨询如何申请开通,不要重复尝试登录避免邮箱帐号被锁定", "提示信息", MessageBoxButtons.OK, MessageBoxIcon.Warning); LogTrace.TraceInfo("Turn logon off (5)"); pbLogon.Image = global::FileToUpload.Properties.Resources.off; return(false); } } HttpSeaFileGetDefaultLibraryResponse gdlRsp = httpClient.ExecuteSeaFileGetDefaultLibraryRequest(m_strToken); if (gdlRsp != null) { m_strRepoID = gdlRsp.RepoId; LogTrace.TraceVerbose("Retrieve Repro Id {0}.", m_strRepoID); LogTrace.TraceInfo("Turn logon on (6)"); pbLogon.Image = global::FileToUpload.Properties.Resources.on; return(true); } else { LogTrace.TraceError("Retrieve Repro Id failed."); } LogTrace.TraceInfo("Turn logon off (7)"); pbLogon.Image = global::FileToUpload.Properties.Resources.off; return(false); }
/// <summary> /// 发送PutOid请求,并返回获得的回应 /// </summary> /// <param name="oid">Wos对象标识</param> /// <returns>返回HttpWosPutOidResponse对象</returns> public HttpSeaFileGetDirectoryEntriesResponse ExecuteSeaFileGetDirectoryEntriesRequest(String strToken, String strRepoId, string strPath) { LogTrace.TraceInfo("ExecuteSeaFileGetDirectoryEntriesRequest"); try { HttpSeaFileGetDirectoryEntriesResponse rsp = new HttpSeaFileGetDirectoryEntriesResponse(); HttpWebRequest req = CreateSeaFileGetDirectoryEntriesRequest(strToken, strRepoId, strPath); if (req != null) { HttpWebResponse res = (HttpWebResponse)req.GetResponse(); LogTrace.TraceInfo("Response code for GetDirectoryEntries is {0}", res.StatusCode); String strResponse = String.Empty; Stream rStream = res.GetResponseStream(); StreamReader sr = new StreamReader(rStream); strResponse = sr.ReadToEnd(); LogTrace.TraceVerbose("Got Server response [{0}]", strResponse); strResponse = strResponse.Replace("[", "{\"root\":["); strResponse = strResponse.Replace("]", "]}"); LogTrace.TraceVerbose("Got Server response replace [{0}]", strResponse); JObject jo = (JObject)JsonConvert.DeserializeObject(strResponse); JToken token = (JToken)jo["root"].First; while (token != null) { int iSize = 0; if (token["type"].ToString() == "file") { iSize = Convert.ToInt32(token["size"].ToString()); } rsp.AddEntry( token["permission"].ToString(), token["mtime"].ToString(), token["type"].ToString(), token["name"].ToString(), token["id"].ToString(), iSize); token = (JToken)token.Next; } req.Abort(); res.Close(); return(rsp); } return(null); } catch (Exception ept) { LogTrace.TraceException(ept); return(null); } }