一、主題要是把Winform客戶端上傳的圖片(doc,excel,txt等小文件)上傳到遠程文件服務器上。
方案有很多種,比如用TCP、Socket、FTP,但這些方式控制不好,很容易失敗,要么工程量大,費時費力。
為了快速建立模型,采用客戶端Winform + IIS服務器端方式。效果圖如下:
二、源代碼:
三、解決:遠程服務器返回錯誤: (401,405)
出現這個問題,在上傳文件至服務器時,大部分人使用代碼都是WebClient類,采用上傳和下載,剛開始下載可以,但上傳始終沒有權限。上傳代碼類似:
private void UpLoadFile(string fileNamePath, string serverFileURL) { // 創建WebClient實例 WebClient myWebClient = new WebClient(); myWebClient.Credentials = CredentialCache.DefaultCredentials; // 要上傳的文件 FileStream fs = new FileStream(fileNamePath, FileMode.Open, FileAccess.Read); BinaryReader r = new BinaryReader(fs); try { //使用UploadFile方法可以用下面的格式 byte[] postArray = r.ReadBytes((int)fs.Length); Stream postStream = myWebClient.OpenWrite(serverFileURL, "PUT"); if (postStream.CanWrite) { postStream.Write(postArray, 0, postArray.Length); } postStream.Close(); } catch { //MessageBox.Show("文件上傳失敗,請稍候重試~"); } }
出現的根本原因時,iis服務器不允許,隨意寫入文件。
如果解決 401問題,請參考 : http://www.pageadmin.net/article/2015/1074.html ,解決 405,主要是打開IIS ”PUT“ 指令。
1、Win7下默認WebClient是手動啟動,這個需要設置成自動啟動,為啟動狀態;
2、上傳文件的文件夾有寫入權限,匿名,所有人都可以寫入;
3、在IIS 上 開啟WebDav,並設置規則
經常上述調整,使用下載沒有問題,下載代碼如下:
/// <summary> /// 下載服務器文件至客戶端(不帶進度條) /// </summary> /// <param name="strUrlFilePath">要下載的Web服務器上的文件地址(全路徑 如:http://www.dzbsoft.com/test.rar)</param> /// <param name="Dir">下載到的目錄(存放位置,機地機器文件夾)</param> /// <returns>True/False是否上傳成功</returns> public bool WebClientDownLoadFile(string strUrlFilePath, string strLocalDirPath) { // 創建WebClient實例 WebClient client = new WebClient(); //被下載的文件名 string fileName = strUrlFilePath.Substring(strUrlFilePath.LastIndexOf("/")); //另存為的絕對路徑+文件名 string Path = strLocalDirPath + fileName; try { WebRequest myWebRequest = WebRequest.Create(strUrlFilePath); client.DownloadFile(strUrlFilePath, Path); return true; } catch (Exception exp) { client.Dispose(); return false; } }
但上傳仍然不能實現。最終采用了另外一種上傳代碼,客戶端把流傳給服務器端,服務器端自己下載。也是本次記錄的主要目的,上述源碼中已經實現了。代碼全部開源。
上傳代碼修改為:
/// <summary> /// 上傳 /// </summary> /// <param name="ServerUrl">服務器地址</param> /// <param name="LocationFilePath">本地圖片全路徑</param> /// <param name="SavePath">上傳成功返回保存的路徑</param> /// <param name="AllowFormat">允許上傳圖片的后綴名,* 和空值都表示所有圖片格式,多個請用,隔開,例如:.gif,.png,.jpg,.bmp</param> /// <param name="progressBar">進度控件</param> /// <returns>返回:-2=圖片格式有誤,-1=服務器地址 或 本地圖片全路徑為空 0=上傳失敗 1=上傳成功</returns> public int UpLoad(string ServerUrl, string LocationFilePath, out string SavePath, string AllowFormat, System.Windows.Forms.ProgressBar progressBar) { SavePath = string.Empty; if (string.IsNullOrEmpty(ServerUrl) || string.IsNullOrEmpty(LocationFilePath)) return -1; AllowFormat = string.IsNullOrEmpty(AllowFormat) == true ? "*" : AllowFormat; //獲取后綴名 string Suffix = LocationFilePath.Substring(LocationFilePath.LastIndexOf(".")).Trim().ToLower(); string[] strformat = ".gif,.png,.jpeg,.jpg,.bmp".Split(",".ToCharArray()); if (!strformat.Contains(Suffix)) return -2; //檢驗圖片格式 if (AllowFormat != "*") { string[] strformat2 = AllowFormat.Split(",".ToCharArray()); if (!strformat2.Contains(Suffix)) return -2; } string year = DateTime.Now.Year.ToString(); string filename = DateTime.Now.ToString("yyyyMMddHHmmssfffff") + Suffix; int result = Upload_Request(ServerUrl, LocationFilePath, filename, progressBar); if (result == 1) SavePath = "/upload/" + year + "/" + filename; return result; }
服務器端代碼:
public partial class img : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { if (Request.Files.Count > 0) { try { string savePath = Server.MapPath("~/upload/" + DateTime.Now.Year.ToString() + "/"); if (!Directory.Exists(savePath)) Directory.CreateDirectory(savePath); HttpPostedFile file = Request.Files[0]; string filePath = savePath + "\\" + file.FileName; file.SaveAs(filePath); Response.Write("Success"); } catch { Response.Write("Error"); } } else { Response.Write("Error1"); } } }
收藏:Web 批量上傳圖片的特效代碼,采用asp.net mvc 模式,效果圖如下,需要的源碼的可以下載參考。 MVC 圖片批量上傳.rar