C#Post文件上传

上代码:

客户端代码

public static string Upload(string url, string fileName)
{
    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
    request.Method = "POST";
    Stream postStream = new MemoryStream();
    #region 处理Form表单文件上传
    //通过表单上传文件
    string boundary = "----" + DateTime.Now.Ticks.ToString("x");
    string formdataTemplate = "\r\n--" + boundary + "\r\nContent-Disposition: form-data; name=\"{0}\"; filename=\"{1}\"\r\nContent-Type: application/octet-stream\r\n\r\n";


    try
    {
        //准备文件流
        using (var fileStream = FileToStream(fileName))
        {
            var formdata = string.Format(formdataTemplate, "", System.IO.Path.GetFileName(fileName) /*Path.GetFileName(fileName)*/);
            var formdataBytes = Encoding.UTF8.GetBytes(postStream.Length == 0 ? formdata.Substring(2, formdata.Length - 2) : formdata);//第一行不需要换行
            postStream.Write(formdataBytes, 0, formdataBytes.Length);

            //写入文件
            byte[] buffer = new byte[1024];
            int bytesRead = 0;
            while ((bytesRead = fileStream.Read(buffer, 0, buffer.Length)) != 0)
            {
                postStream.Write(buffer, 0, bytesRead);
            }
        }
    }
    catch (Exception ex)
    {
        throw ex;
    }

    //结尾
    var footer = Encoding.UTF8.GetBytes("\r\n--" + boundary + "--\r\n");
    postStream.Write(footer, 0, footer.Length);
    request.ContentType = string.Format("multipart/form-data; boundary={0}", boundary);

    #endregion

    request.ContentLength = postStream != null ? postStream.Length : 0;
    request.Accept = "*/*";
    //request.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8";
    request.KeepAlive = true;
    request.UserAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.57 Safari/537.36";

    #region 输入二进制流
    if (postStream != null)
    {
        postStream.Position = 0;

        //直接写入流
        Stream requestStream = request.GetRequestStream();

        byte[] buffer = new byte[1024];
        int bytesRead = 0;
        while ((bytesRead = postStream.Read(buffer, 0, buffer.Length)) != 0)
        {
            requestStream.Write(buffer, 0, bytesRead);
        }

        postStream.Close();//关闭文件访问
    }
    #endregion

    HttpWebResponse response = (HttpWebResponse)request.GetResponse();

    using (Stream responseStream = response.GetResponseStream())
    {
        using (StreamReader myStreamReader = new StreamReader(responseStream,Encoding.GetEncoding("utf-8")))
        {
            string retString = myStreamReader.ReadToEnd();
            return retString;
        }
    }
}

FileToStream方法,文件转stream

public static Stream FileToStream(string fileName)

{
    // 打开文件

    FileStream fileStream = new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.Read);

    // 读取文件的 byte[]

    byte[] bytes = new byte[fileStream.Length];

    fileStream.Read(bytes, 0, bytes.Length);

    fileStream.Close();

    // 把 byte[] 转换成 Stream

    Stream stream = new MemoryStream(bytes);

    return stream;

}

服务端代码:

public string Upload_File()
{
    try
    {
        HttpFileCollection file_list = HttpContext.Current.Request.Files;
        if (file_list != null && file_list.Count > 0)
        {
            string str = string.Empty;
            for (int i = 0; i < file_list.Count; i++)
            {
                HttpPostedFile file = file_list[i];
                string type = file.ContentType;//获取文件类型
                string FileName = file.FileName;
                string guid = "";
                if (FileName != null && FileName != "")
                {
                    string FileType = FileName.Substring(FileName.LastIndexOf(".") + 1);//得到文件的后缀名
                    guid = DateTime.Now.ToString("yyyyMMddhhmmss") + FileName;//得到重命名的文件名
                    //定义文件存放的目标路径
                    string targetDir = HttpContext.Current.Server.MapPath("~/UpLoad/" + DateTime.Now.ToString("yyyy-MM-dd") + "/file");
                    //创建目标路径
                    Directory.CreateDirectory(targetDir);
                    string path = Path.Combine(targetDir, Path.GetFileName(guid));
                    file.SaveAs(path);
                    str = str + "/UpLoad/" + DateTime.Now.ToString("yyyy-MM-dd") + "/file/" + guid;
                }
            }
            return "上传成功," + str;
        }
        else
            return "文件不存在";
    }
    catch(Exception ex)
    {
        return "上传失败," + ex.Message;
    }
}

 

你可能感兴趣的:(.Net)