• WinForm 上传文件至服务器,解决:远程服务器返回错误: (401,405)


    一、主题要是把Winform客户端上传的图片(doc,excel,txt等小文件)上传到远程文件服务器上。

    方案有很多种,比如用TCP、Socket、FTP,但这些方式控制不好,很容易失败,要么工程量大,费时费力。

    为了快速建立模型,采用客户端Winform + IIS服务器端方式。效果图如下:

    二、源代码:

          图片上传服务器.rar

    三、解决:远程服务器返回错误: (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

  • 相关阅读:
    Windows Console 程序中定时器的使用
    AT91SAM7SE应用 IRQ
    AT91SAM7SE应用 PIT 周期中断(1ms)
    AT91SAM7SE应用 UART
    Modelsim图像处理算法的仿真——图像数据操作
    按照一定的间隔,从视频中截图并保存(OpenCV)
    MacBook Pro下关闭全局网络代理
    jmeter的HTTP取样器设置重连的次数
    【C#】比较 Random 与 RandomNumberGenerator 生成随机字符串
    KendoGrid基础
  • 原文地址:https://www.cnblogs.com/codeding/p/5671215.html
Copyright © 2020-2023  润新知