1. 程式人生 > >2018/5/21~2018/5/25 周記

2018/5/21~2018/5/25 周記

取數 阿裏 tty 一段 OS read 格式 嚴重 lsi

這周又是自己瞎搞的一周。繼上一周的一鍵生成二維碼,然後掃描二維碼就會跳轉到生成二維碼的那個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 周記