最近一個winform項目中須要經過拍照或者上傳本地文件或者截圖的方式把產品圖片上傳到服務器,最後選擇了服務器部署webservice的方式來進行。其中遇到了一些問題記錄下來。html
很少說,直接上服務端代碼web
[WebMethod(Description = "上傳文件")] public bool UploadFiles(string filename, byte[] content) { try { int index = filename.LastIndexOf("."); if (index == 0) { return false; } else { string extended = string.Empty; if (index + 1 == filename.Length) { return false; } else { extended = filename.Substring(index + 1); if (extended == "jpeg" || extended == "gif" || extended == "jpg" || extended == "png") { try { string Path = System.Web.HttpContext.Current.Server.MapPath("~/ProductImages/"); if (!Directory.Exists(Path)) { Directory.CreateDirectory(Path); } MemoryStream mymemorystream = new MemoryStream(content, 0, content.Length); File.WriteAllBytes((Path + filename), content); return true; } catch (Exception ex) { return false; } } else { return false; } } } } catch { return false; } }
這實際上是一種比較通用的方式,不只能夠用來接收圖片文件,也能夠是其餘文件。固然你也能夠作一些文件大小的限制,本身添加一個判斷就行。沒啥好說的,問題也沒有出現。數組
接下來講說winform這邊,下圖是圖片上傳部分服務器
至於如何經過拍照和加載圖片或者截圖上傳到picturebox上你們本身去找吧,網上一大堆。app
接下來就是把picture的圖片上傳到服務器了,首先是添加服務引用,這也很簡單就不說了,注意若是一個解決方案中有不少項目,而這個圖片上傳所在的項目不是主項目,那麼須要在主項目的app.config文件中添加一個節點,不然會報找不到什麼節點的錯誤。orm
<system.serviceModel> <bindings> <basicHttpBinding> <binding name="WebServiceSoap" /> </basicHttpBinding> </bindings> <client> <endpoint address="http://localhost/WebService.asmx" binding="basicHttpBinding" bindingConfiguration="WebServiceSoap" contract="WebService.WebServiceSoap" name="WebServiceSoap" /> </client> </system.serviceModel>
接下來就是上傳部分了htm
if (image != null&isnewimage) { MemoryStream ms = new MemoryStream(); image.Save(ms, ImageFormat.Png); byte[] bytes = new byte[ms.Length]; bytes = ms.GetBuffer(); WebService.WebServiceSoapClient webservice = new WebService.WebServiceSoapClient(); string filename = cInvCode + ".png"; if (webservice.UploadFiles(filename, bytes)) { } else { issaveok = false; failreason = "圖片上傳失敗!"; return; } }
這裏首先獲取圖片資源放到一個image對象中,而後轉換爲字節數組經過webservice上傳,這裏我讓圖片所有以png格式上傳,固然你能夠以其餘格式上傳。對象
剛開始在向字節數組賦值的時候我用的不是bytes = ms.GetBuffer();而是用的ms.Write(bytes, 0, (int)ms.Length);結果文件是能夠上傳到服務器,可是服務器端的圖片文件始終打不開,說可能文件已經損壞,查了半天查不出來緣由,最後發現其實還有bytes = ms.GetBuffer();這種方法,一試,問題果真解決,服務器端的圖片成爲能夠預覽查看的正常圖片了。blog
好了,這是第一次寫博客,寫的很差,還請吐槽啊。圖片