private void btSelectShareFile_Click(object sender, EventArgs e) { String strSelectedFile = String.Empty; ShareFileSelectDialog dlgFileSelect = new ShareFileSelectDialog(); if (dlgFileSelect.ShowDialog() == DialogResult.OK) { strSelectedFile = dlgFileSelect.strSelectedFile; } else { //MessageBox.Show("读取网盘数据失败!", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } String[] strArrSelectedFile = strSelectedFile.Split(';'); if (!SeafileLogon()) { LogTrace.TraceError("Fileshare logon failed."); return; } foreach (String strFile in strArrSelectedFile) { String strDownloadLink = httpClient.ExecuteCreateSeaFileCreateDownloadLinkRequest(m_strToken, m_strRepoID, strFile, Globals.ThisAddIn.GetShareFilePassword(), Globals.ThisAddIn.GetExpireDates()); String strFileName = strFile.Substring(strFile.LastIndexOf("/")); if (strDownloadLink != null && strDownloadLink != "" && strDownloadLink != string.Empty) { ReplceAttachment(strFileName, strDownloadLink); LogTrace.TraceInfo("Fileshare replace file {0} with Link {1} Expire time {2}", strFileName, strDownloadLink, Globals.ThisAddIn.GetExpireDates()); } else { MessageBox.Show("文件(" + strFileName + ")下载链接获取失败"); LogTrace.TraceError("Retrieve file {0} download link failed", strFileName); } } }
/// <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()); } }
/// <summary> /// 开始上传附件到OBS云端存储 /// </summary> private void bgwUploadFile_DoWork(object sender, System.ComponentModel.DoWorkEventArgs e) { if (m_bRegisterWindowClose == false) { ((Outlook.ItemEvents_10_Event)(dynamic) Globals.ThisAddIn.Application.ActiveInspector().CurrentItem).Close += new Microsoft.Office.Interop.Outlook.ItemEvents_10_CloseEventHandler(MailItem_Close); m_bRegisterWindowClose = true; } Outlook.Application objApplication = Globals.ThisAddIn.Application; Outlook.Inspector objInspector = objApplication.ActiveInspector(); //获取入参 Object[] objArray = (Object[])e.Argument; String[] strArrFilePath = (String[])objArray[0]; String[] strArrFileName = (String[])objArray[1]; if (!SeafileLogon()) { LogTrace.TraceError("Seafile Logon failed."); return; } UploadInProgress = true; for (int i = 0; i < strArrFilePath.Count <String>(); i++) { String strFilePath = strArrFilePath[i]; String strFileName = strArrFileName[i]; LogTrace.TraceInfo("Start upload file {0} : {1}", strFileName, strFilePath); //获取文件信息 FileInfo fInfo = new FileInfo(strFileName, strFilePath); if (fInfo.FileLength > Globals.ThisAddIn.GetMaxFileSize() * 1024 * 1024) { MessageBox.Show("文件" + strFileName + "大小超过管理员规定(" + Globals.ThisAddIn.GetMaxFileSize().ToString() + ")", "警告", MessageBoxButtons.OK, MessageBoxIcon.Warning); break; } if (uploadProgressBar.InvokeRequired) { uploadProgressBar.Invoke(new MethodInvoker(delegate { uploadProgressBar.Minimum = 0; uploadProgressBar.Maximum = CaculateProgressBarMaxSize(fInfo.FileLength); uploadProgressBar.Value = 0; LogTrace.TraceInfo("Reset ProgressBar bar, Min {0} Max {1} value {2}", uploadProgressBar.Minimum, uploadProgressBar.Maximum, uploadProgressBar.Value); })); } if (!m_bUploadFolder) { HttpSeaFileGetDirectoryEntriesResponse gdeRsp = httpClient.ExecuteSeaFileGetDirectoryEntriesRequest(m_strToken, m_strRepoID, "/" + m_strDefaultUploadFolder); if (gdeRsp == null) { m_bUploadFolder = httpClient.ExecuteCreateSeaFileCreateNewDirectoryRequest(m_strToken, m_strRepoID, "/" + m_strDefaultUploadFolder); } } HttpSeaFileGetUpdateLinkResponse gulDlg = httpClient.ExecuteSeaFileGetUpdateLinkRequest(m_strToken, m_strRepoID); if (gulDlg != null) { //upload File to ShareFile httpClient.AttachFile(strFilePath, strFileName); String strResult = httpClient.ExecuteBackGroundShareFileUploadFileStream(m_bgwUploadFile, m_strToken, gulDlg.URL, "/" + m_strDefaultUploadFolder); if (strResult == null || strResult == String.Empty) { MessageBox.Show("上传文件 " + strFileName + " 失败!"); LogTrace.TraceError("Upload file {0} failed.", strFileName); } else { String strDownloadLink = httpClient.ExecuteCreateSeaFileCreateDownloadLinkRequest(m_strToken, m_strRepoID, "/" + m_strDefaultUploadFolder + "/" + strFileName, "", 0); if (strDownloadLink != null && strDownloadLink != "" && strDownloadLink != String.Empty) { LogTrace.TraceInfo("Replace attachment {0} with Link {1}", strFileName, strDownloadLink); ReplceAttachment(strFileName, strDownloadLink); } else { MessageBox.Show("文件(" + strFileName + ")下载链接获取失败"); LogTrace.TraceError("Get Download Link for file {0} is empty", strFileName); } } } else { LogTrace.TraceError("Retrieve Upload URL failed."); } } UploadInProgress = false; }
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); }
public void CheckLogon(/*object source, System.Timers.ElapsedEventArgs e*/) { RegistryKey regKey = Registry.CurrentUser.OpenSubKey(@"SOFTWARE\MICROSOFT\OFFICE\OUTLOOK\ADDINS\PinganAttachment.OutlookAddin", true); String strDesKey = Globals.ThisAddIn.Application.Session.CurrentUser.AddressEntry.GetExchangeUser().PrimarySmtpAddress.Substring(0, 8); String m_strToken = String.Empty; if (regKey != null) { try { m_strToken = Decrypt(regKey.GetValue("token").ToString(), strDesKey); } catch (Exception ept) { LogTrace.TraceException(ept); pbLogon.Image = global::FileToUpload.Properties.Resources.off; return; } } else { pbLogon.Image = global::FileToUpload.Properties.Resources.off; return; } if (m_strToken == null || m_strToken == String.Empty) { pbLogon.Image = global::FileToUpload.Properties.Resources.off; } else { WosHttpClient httpClient = null; 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, turn logon off"); pbLogon.Image = global::FileToUpload.Properties.Resources.off; return; } try { Boolean bCheckLogon = httpClient.ExecuteSeaFilePingRequest(m_strToken); if (bCheckLogon) { LogTrace.TraceInfo("Turn logon on (1)"); pbLogon.Image = global::FileToUpload.Properties.Resources.on; } else { LogTrace.TraceInfo("Turn logon off (1)"); pbLogon.Image = global::FileToUpload.Properties.Resources.off; } } catch (Exception ept) { LogTrace.TraceInfo("Turn logon off (1)"); pbLogon.Image = global::FileToUpload.Properties.Resources.off; LogTrace.TraceException(ept); } } }
/// <summary> /// 发送PutOid请求,并返回获得的回应 /// </summary> /// <param name="bgw">后台进程</param> /// <param name="oid">Wos对象标识</param> /// <returns>返回HttpWosPutOidResponse对象</returns> public String ExecuteBackGroundShareFileUploadFileStream(BackgroundWorker bgw, String strToken, String strURL, String strPath) { LogTrace.TraceInfo("ExecuteBackGroundShareFileUploadFileStream"); Uri uri1 = new Uri(strURL.Replace("\"", "")); HttpWebRequest req = (HttpWebRequest)WebRequest.Create(uri1); try { if (upfile != null) { int iStep = GetStepSize(upfile.Data.Length); String strBoundary = DateTime.Now.Ticks.ToString("X"); req.Method = "POST"; req.UserAgent = "curl/7.19.0 (i586-pc-mingw32msvc) libcurl/7.19.0 zlib/1.2.3"; req.Accept = "*/*"; req.ContentType = "multipart/form-data; boundary=----------------------------" + strBoundary; req.Headers.Add("Authorization: Token " + strToken); req.AllowWriteStreamBuffering = false; req.Timeout = 5 * 60 * 1000; UTF8Encoding encode = new UTF8Encoding(); //ASCIIEncoding encode = new ASCIIEncoding(); byte[] brPayLoad1 = encode.GetBytes("------------------------------" + strBoundary + "\r\n"); byte[] brPayLoad2 = encode.GetBytes("Content-Disposition: form-data; name=\"file\"; filename=\"" + upfile.FieldName + "\"\r\n"); byte[] brPayLoad3 = encode.GetBytes("Content-Type: text/plain\r\n\r\n"); byte[] brPayLoad4 = encode.GetBytes("\r\n------------------------------" + strBoundary + "\r\n"); byte[] brPayLoad5 = encode.GetBytes("Content-Disposition: form-data; name=\"filename\"\r\n\r\n"); byte[] brPayLoad6 = encode.GetBytes(upfile.FieldName + "\r\n"); byte[] brPayLoad7 = encode.GetBytes("HTTPPayloadLine: ------------------------------" + strBoundary + "\r\n"); byte[] brPayLoad8 = encode.GetBytes("Content-Disposition: form-data; name=\"parent_dir\"\r\n\r\n"); byte[] brPayLoad9 = encode.GetBytes(strPath + "/\r\n"); byte[] brPayLoad10 = encode.GetBytes("------------------------------" + strBoundary + "--"); req.SendChunked = true; Stream postStream = req.GetRequestStream(); postStream.Write(brPayLoad1, 0, brPayLoad1.Length); postStream.Write(brPayLoad2, 0, brPayLoad2.Length); postStream.Write(brPayLoad3, 0, brPayLoad3.Length); byte[] postData = upfile.ReadData(iStep); int i = 0; while (postData != null) { postStream.Write(postData, 0, postData.Length); Thread.Sleep(1); bgw.ReportProgress(i / iStep, upfile.FieldName); i += iStep; postData = upfile.ReadData(iStep); } bgw.ReportProgress((int)Math.Ceiling((double)upfile.Data.Length / (double)iStep), upfile.FieldName); postStream.Write(brPayLoad4, 0, brPayLoad4.Length); postStream.Write(brPayLoad5, 0, brPayLoad5.Length); postStream.Write(brPayLoad6, 0, brPayLoad6.Length); postStream.Write(brPayLoad7, 0, brPayLoad7.Length); postStream.Write(brPayLoad8, 0, brPayLoad8.Length); postStream.Write(brPayLoad9, 0, brPayLoad9.Length); postStream.Write(brPayLoad10, 0, brPayLoad10.Length); postStream.Close(); HttpWebResponse res = (HttpWebResponse)req.GetResponse(); LogTrace.TraceInfo("Response code for UploadFile is {0}, uploaded file is {1}", res.StatusCode, upfile.FileName); Stream rStream = res.GetResponseStream(); StreamReader sr = new StreamReader(rStream); String strReturn = sr.ReadToEnd(); req.Abort(); res.Close(); return(strReturn); } else { LogTrace.TraceError("Not found upload file."); return(null); } } catch (Exception ept) { LogTrace.TraceException(ept); return(null); } }