【问题标题】:Upload Excel file to web server将 Excel 文件上传到 Web 服务器
【发布时间】:2017-12-09 23:34:27
【问题描述】:

我试图通过 UWP c# 使用文件流将文件上传到 Web 服务器,但它总是给我一个错误,即当我尝试在 http://example.com/httpdocs/content 上上传时不允许使用 405 方法。即使出于测试目的,我也尝试在本地主机上上传,但仍然没有运气。 有什么帮助吗?

代码:

 public async Task<bool> Upload(StorageFile fileName)
    {
        HttpMultipartFormDataContent form = new HttpMultipartFormDataContent();
        cts = new CancellationTokenSource();

        using (IInputStream fileStream = await fileName.OpenSequentialReadAsync())
        {
            HttpStreamContent content = new HttpStreamContent(fileStream);               
            form.Add(content, "premier", fileName.Name);

            using (HttpClient client = new HttpClient())
            {
                using (HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Post, new Uri("http://example.com/httpdocs/content")))
                {
                    request.Content = form;
                    request.Headers.TryAppendWithoutValidation("Content-Type", "application/x-www-form-urlencoded");                       
                    HttpResponseMessage response = await client.SendRequestAsync(request).AsTask(cts.Token);
                    var result = response.Content.ReadAsStringAsync().GetResults();
                }                   
            }
        }

        return true;
    }

【问题讨论】:

  • 我们可以看看您是如何尝试使用FileStream 上传文件的吗?
  • 好吧,首先你为什么要上传到那个ulr?方法不允许是因为你不能向它发出POST 请求
  • 因为它实际上需要将 Excel 文件保存到 Web 服务器。我们不能上传这样的文件吗?
  • 我们通常使用上传控件或在Web服务器中添加服务来上传文件。
  • @LeiYang 上传 HttpClient 或 BackgroundUpload 之类的控件?

标签: c# asp.net sql-server xaml uwp


【解决方案1】:

嘿,在尝试了很多之后,我发现了这段代码,它运行良好。稍微更正一下,请求现在将被发送到一个 aspx 页面,即http://example.com/abc.aspx。如果您想发送高 mb 的 excel 文件数据,那么只需相应地更改 Math.Min(4096, (int)fileStream.Length) 中的 4096

客户端代码-

   public static async Task<string> UploadFileEx(string uploadfile, string 
   url, string fileFormName, string contenttype, NameValueCollection 
   querystring, CookieContainer cookies)
    {
        try
        {
            if ((fileFormName == null) ||
                (fileFormName.Length == 0))
            {
                fileFormName = "file";
            }

            if ((contenttype == null) ||
                (contenttype.Length == 0))
            {
                contenttype = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
            }
            string postdata;
            postdata = "?";
            if (querystring != null)
            {
                foreach (string key in querystring.Keys)
                {
                    postdata += key + "=" + querystring.Get(key) + "&";
                }
            }
            Uri uri = new Uri(url + postdata);


            string boundary = "----------" + DateTime.Now.Ticks.ToString("x");
            HttpWebRequest webrequest = (HttpWebRequest)WebRequest.Create(uri);
            webrequest.CookieContainer = cookies;
            webrequest.ContentType = "multipart/form-data; boundary=" + boundary;
            webrequest.Method = "POST";

            // Build up the post message header
            StringBuilder sb = new StringBuilder();
            sb.Append("--");
            sb.Append(boundary);
            sb.Append("\r\n");
            sb.Append("Content-Disposition: form-data; name=\"");
            sb.Append(fileFormName);
            sb.Append("\"; filename=\"");
            var sd = sb.Append(Path.GetFileName(uploadfile));
            sb.Append("\"");
            sb.Append("\r\n");
            sb.Append("Content-Type: ");
            sb.Append(contenttype);
            sb.Append("\r\n");
            sb.Append("\r\n");

            string postHeader = sb.ToString();
            byte[] postHeaderBytes = Encoding.UTF8.GetBytes(postHeader);

            // Build the trailing boundary string as a byte array
            // ensuring the boundary appears on a line by itself
            byte[] boundaryBytes = Encoding.ASCII.GetBytes("\r\n--" + boundary + "\r\n");

            FileStream fileStream = new FileStream(uploadfile, FileMode.Open, FileAccess.Read);
            long length = postHeaderBytes.Length + fileStream.Length + boundaryBytes.Length;
            //  webrequest.ContentLength = length;
            webrequest.Headers[HttpRequestHeader.ContentLength] = length.ToString();

            //Stream requestStream = webrequest.GetRequestStream();
            Stream requestStream = await webrequest.GetRequestStreamAsync();

            // Write out our post header
            requestStream.Write(postHeaderBytes, 0, postHeaderBytes.Length);

            // Write out the file contents
            byte[] buffer = new Byte[checked((uint)Math.Min(4096, (int)fileStream.Length))];
            int bytesRead = 0;
             while ((bytesRead = fileStream.Read(buffer, 0, buffer.Length)) != 0)
                requestStream.Write(buffer, 0, bytesRead);

            // Write out the trailing boundary
            requestStream.Write(boundaryBytes, 0, boundaryBytes.Length);
            WebResponse response = await webrequest.GetResponseAsync();
            Stream s = response.GetResponseStream();
            StreamReader sr = new StreamReader(s);

            return sr.ReadToEnd();
        }

        catch (Exception e)
        {
            e.ToString();
        }
        return null;
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-04-04
    • 2017-07-28
    • 1970-01-01
    • 2016-12-31
    • 1970-01-01
    • 2012-05-07
    • 1970-01-01
    相关资源
    最近更新 更多