2018/5/21~2018/5/25 周記
這周又是自己瞎搞的一周。繼上一周的一鍵生成二維碼,然後掃描二維碼就會跳轉到生成二維碼的那個url。測試用的是百度的網址,所以掃描二維碼後出現的就是百度首頁,當我把url地址改成一段文字時,掃描出來的就是那段文字了。於是我就有了一個大膽的想法,我要掃面二維碼然後跳轉出來的是一張圖片,這樣我就可以把自己喜歡的圖片全部變成二維碼,這樣把二維碼用來做頭像的話,別人可能會因為好奇然後點開二維碼,識別二維碼出現圖片會不會覺得我很厲害。。當然,這個只能用來騙騙外行人,敲代碼的都知道這個很容易實現的。其實最主要的是,我可以把自己想要收藏起來的圖片全部變成二維碼,到時候別人看到文件夾裏面也只是會覺得是一堆二維碼,就不會問來問去了。有想法了就開始行動。
首先,得要把圖片變成一個URL,這樣就需要把圖片上傳到服務器上,上傳圖片到服務器,上傳文件到服務器有兩種方法,一種是使用WebClient下的方法UploadFile,另一種是使用HttpWebRequest,
使用WebClient下的方法UploadFile非常簡單,只有兩行代碼:
OpenFileDialog ofd = new OpenFileDialog(); //為對話框設置標題 ofd.Title = "請選擇上傳的圖片"; //設置篩選的圖片格式 ofd.Filter = "圖片格式|*.jpg"; //設置是否允許多選 ofd.Multiselect = false; //如果你點了“確定”按鈕 if (ofd.ShowDialog() == System.Windows.Forms.DialogResult.OK) { //獲得文件的完整路徑(包括名字後後綴) string filePath = ofd.FileName; WebClient myWebClient= new WebClient(); myWebClient.UploadFile("http://192.168.0.20:8019/WebForm1.aspx", "POST", filePath); }
因為要上傳到服務器,所以要新建一個WebForm,在WebForm裏面接收數據,代碼也很簡單,也只有兩行:
foreach (string f in Request.Files.AllKeys) { HttpPostedFile file = Request.Files[f]; //獲取數據 file.SaveAs(@"G:/IIS部署/上傳圖片/圖片/" + file.FileName); //保存文件在服務器上的位置 }
用HttpWebRequest相對來說比較麻煩,要根據url獲取數據還要接收返回的數據,代碼是從網上扣下來的
int returnValue = 0; // 要上傳的文件 FileStream fs = new FileStream(fileNamePath, FileMode.Open, FileAccess.Read); BinaryReader r = new BinaryReader(fs); //時間戳 string strBoundary = "----------" + DateTime.Now.Ticks.ToString("x"); byte[] boundaryBytes = Encoding.ASCII.GetBytes("\r\n--" + strBoundary + "\r\n"); //請求頭部信息 StringBuilder sb = new StringBuilder(); sb.Append("--"); sb.Append(strBoundary); sb.Append("\r\n"); sb.Append("Content-Disposition: form-data; name=\""); sb.Append("file"); sb.Append("\"; filename=\""); sb.Append(saveName); sb.Append("\";"); sb.Append("\r\n"); sb.Append("Content-Type: "); sb.Append("application/octet-stream"); sb.Append("\r\n"); sb.Append("\r\n"); string strPostHeader = sb.ToString(); byte[] postHeaderBytes = Encoding.UTF8.GetBytes(strPostHeader); // 根據uri創建HttpWebRequest對象 HttpWebRequest httpReq = (HttpWebRequest)WebRequest.Create(new Uri(address)); httpReq.Method = "POST"; //對發送的數據不使用緩存 httpReq.UserAgent = "MSIE"; httpReq.AllowWriteStreamBuffering = false; //設置獲得響應的超時時間(300秒) httpReq.Timeout = 300000; httpReq.ContentType = "multipart/form-data; boundary=" + strBoundary; long length = fs.Length + postHeaderBytes.Length + boundaryBytes.Length; long fileLength = fs.Length; httpReq.ContentLength = length; try { progressBar.Maximum = int.MaxValue; progressBar.Minimum = 0; progressBar.Value = 0; //每次上傳4k int bufferLength = 4096; byte[] buffer = new byte[bufferLength]; //已上傳的字節數 long offset = 0; //開始上傳時間 DateTime startTime = DateTime.Now; int size = r.Read(buffer, 0, bufferLength); Stream postStream = httpReq.GetRequestStream(); //發送請求頭部消息 postStream.Write(postHeaderBytes, 0, postHeaderBytes.Length); while (size > 0) { postStream.Write(buffer, 0, size); offset += size; progressBar.Value = (int)(offset * (int.MaxValue / length)); TimeSpan span = DateTime.Now - startTime; double second = span.TotalSeconds; lblTime.Text = "已用時:" + second.ToString("F2") + "秒"; if (second > 0.001) { lblSpeed.Text = "平均速度:" + (offset / 1024 / second).ToString("0.00") + "KB/秒"; } else { lblSpeed.Text = " 正在連接…"; } lblState.Text = "已上傳:" + (offset * 100.0 / length).ToString("F2") + "%"; lblSize.Text = (offset / 1048576.0).ToString("F2") + "M/" + (fileLength / 1048576.0).ToString("F2") + "M"; Application.DoEvents(); size = r.Read(buffer, 0, bufferLength); } //添加尾部的時間戳 postStream.Write(boundaryBytes, 0, boundaryBytes.Length); postStream.Close(); //獲取服務器端的響應 WebResponse webRespon = httpReq.GetResponse(); Stream s = webRespon.GetResponseStream(); //讀取服務器端返回的消息 StreamReader sr = new StreamReader(s); String sReturnString = sr.ReadLine(); s.Close(); sr.Close(); if (sReturnString == "Success") { returnValue = 1; } else if (sReturnString == "Error") { returnValue = 0; } } catch(Exception ex) { WriteLog(ex); //returnValue = 0; } finally { fs.Close(); r.Close(); } return returnValue;
HttpWebRequest和WebResponse貌似很重要,可以從url裏面取到數據。所以我就根據網上一篇博客,寫了一個虛擬登錄的功能,隨便找一個網站然後註冊登錄,根據開發者按鍵F12得到該網站登錄管理的url,但是在測試的時候一直報403的錯誤,百度了很多,但是還是不能測試成功,雖然測試沒有成功,但是了解了通過HttpWebRequest獲取URL數據的方法,看了好幾個這樣的代碼例子,發現代碼都是大同小異:
public string requestM(string uName,string passwd) { Demo fr = new Demo(); string text = string.Empty; HttpWebRequest request = null; WebResponse response = null; request = (HttpWebRequest)WebRequest.Create("http://i.yiche.com/ajax/Authenservice/login.ashx"); request.Method = "POST"; request.ContentType = "application/x-www-form-urlencoded; charset=UTF-8"; request.UserAgent = "Code Sample Web Client"; request.Credentials = CredentialCache.DefaultCredentials; request.UseDefaultCredentials = true; request.AllowAutoRedirect = true; request.PreAuthenticate = true; request.CookieContainer = new CookieContainer(); request.CookieContainer = container;//獲取驗證碼時獲取到的cookie會附加在這個容器裏面 request.KeepAlive = true;//建立持久性連接 //request.UserAgent = "Code Sample Web Client"; //整理數據 string postData = string.Format("userName={0}&passwd={1}", uName, passwd); ASCIIEncoding encoding = new ASCIIEncoding(); byte[] bytepostData = encoding.GetBytes(postData); request.ContentLength = bytepostData.Length; //發送數據 using (Stream requestStm = request.GetRequestStream()) { requestStm.Write(bytepostData, 0, bytepostData.Length); } //響應 response = request.GetResponse(); using (Stream responseStm = response.GetResponseStream()) { StreamReader redStm = new StreamReader(responseStm, Encoding.UTF8); text = redStm.ReadToEnd(); } return text; }
通過HttpWebRequest獲取url數據的方法差不多就是這樣了。
圖片是上傳到服務器上了,而且也能在服務器上找到從本地上傳上去的圖片,怎麽把圖片變成一個可用的url呢?也很簡單,格式就是http://服務器ip地址:端口號/文件所在位置。由這個url生成的二維碼產生了,用微信掃描也能出現該圖片,但是有一個很嚴重的問題,那就是這個二維碼只能通過內網才能掃出圖片,用外網的話沒有數據。要通過映射才能讓外網訪問到。雖然服務器的映射地址有,但是端口號卻無法拿到,所以自己弄得這個二維碼就只能自己看看了。看來什麽時候得自己去租一個阿裏雲了,不然以後好多項目都不能測試了。
下周又要去泉州出差了,其實我一直不知道我去泉州能幹嘛,只是去提供電腦還有空調遙控器嗎??上次去泉州一個禮拜,什麽都沒學到,只是在旁邊看著他找bug然後再找下一個bug,代碼改壞了我這邊再發一個代碼給他。而且一出差就是一整個禮拜,還這麽頻繁的出差。也許現在部門就我最閑吧。。確實也就我最閑了。
2018/5/21~2018/5/25 周記