RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 583073
Accepted
Rakzin Roman
Rakzin Roman
Asked:2020-10-26 21:15:59 +0000 UTC2020-10-26 21:15:59 +0000 UTC 2020-10-26 21:15:59 +0000 UTC

如何从 C# 中的控制台应用程序通过 http 发送文件?

  • 772

您需要将文件从 C# 控制台应用程序发送到 Web 服务器,然后接收数据。我查看示例,但它不起作用。如何组织文件的发送?

我这样做

            string uri = "http://mysite/api/postfile";
            string localPath = @"c:\path_to_file.doc";
            var parameters = new System.Collections.Specialized.NameValueCollection()
            {
                { "parametr1", "parametr1_Value" }
            };

            using (var client = new WebClient())
            {
                client.Headers[HttpRequestHeader.ContentType] = "application/x-www-form-urlencoded";
                client.QueryString = parameters;
                var responseBytes = client.UploadFile(uri, localPath);
                var response = Encoding.UTF8.GetString(responseBytes);
                Console.WriteLine("\n Ответ \n {0}", response);
            }

在服务器上接受控制器

public class PostFileController : Controller
    {
        [HttpPost]
        public ActionResult Index(HttpPostedFileBase upload)
        {
            if (upload != null)
        {
            // получаем имя файла
            string fileName = System.IO.Path.GetFileName(upload.FileName);
            // сохраняем файл в папку Files в проекте
            upload.SaveAs(Server.MapPath("~/Files/" + fileName));
            return Content("1");
        }
        else
        {
            return Content("0");
        }

        }
    }
c#
  • 4 4 个回答
  • 10 Views

4 个回答

  • Voted
  1. Best Answer
    VladD
    2020-10-27T01:41:40Z2020-10-27T01:41:40Z

    试试这样:

    using (var client = new HttpClient())
    using (var formData = new MultipartFormDataContent())
    using (var fileStream = File.OpenRead(localPath))
    {
        HttpContent fileStreamContent = new StreamContent(fileStream);
    
        var filename = Path.GetFileName(localPath);
    
        // эмулируем <input type="file" name="upload"/>
        formData.Add(fileStreamContent, "upload");
    
        // эмулируем (action="{url}" method="post")
        var response = await client.PostAsync(url, formData);
    
        // и т. д.
    }
    

    借来这里。


    如果你真的,真的不想要异步代码,你也可以进行阻塞调用(但我不推荐):

        var response = client.PostAsync(url, formData).Result;
    
    • 3
  2. Qwertiy
    2020-10-27T01:15:17Z2020-10-27T01:15:17Z

    文件以编码方式传输multipart/form-data。因此,您需要:

    1. 生成分隔符(例如,Asrf456BGe4h)

    2. 提交标题

      Content-Type: multipart/form-data; boundary=Asrf456BGe4h
      
    3. 发送请求正文:

      (отсутствующая преамбула)
      --Asrf456BGe4h
      Content-Disposition: form-data; name="AttachedFile1"; filename="horror-photo-1.jpg"
      Content-Type: image/jpeg
      (пустая строка)
      (двоичное содержимое первой фотографии)
      --Asrf456BGe4h--
      (отсутствующий эпилог - пустая строка)
      

      注意末尾的两个连字符。

    然后我似乎为了一件事情绞尽脑汁好几个小时

    1. 安装提琴手
    2. 您通过浏览器发送文件,一切正常。
    3. 你看看提琴手究竟发生了什么。
    4. 提交您的代码。你看看提琴手发生了什么。
    5. 您完成您的代码,直到第 4 步中发送的内容与第 3 步中发送的内容匹配。
    • 2
  3. Buka
    2020-10-27T01:05:41Z2020-10-27T01:05:41Z

    它看起来像这样:
    将文件写入流:

    var file = File.ReadAllBytes(filename); 
    var req = WebRequest.CreateHttp(url); //url - адрес сервера
    req.Method = WebRequestMethods.Http.Post;
    //Отправляете на сервер(думаю знаете как)
    

    采用字节流的操作必须具有 byte[] 参数
    此处描述了如何将字节流写入文件:
    https ://stackoverflow.com/questions/6397235/write-bytes-to-file

    • 0
  4. Serginio
    2020-10-27T17:12:09Z2020-10-27T17:12:09Z

    有一次我用 1C 写了一篇 .Net 文章。异步 HTTP 请求,Post 多个 multipart/form-data 文件,使用 gzip、deflate 进行流量压缩,方便的站点解析等。

    没错,1C 上有一个例子,但这不是特别重要

         public async Task  SendPostFile(string urlserviceapiSent)
        {
            using (var client = new System.Net.Http.HttpClient())
            using (var content = new System.Net.Http.MultipartFormDataContent())
            {
                client.BaseAddress = new System.Uri(urlserviceapiSent);
                var values = new System.Collections.Generic.Dictionary<String, String>()
                                   {
                                       { "Name", "name"},
                                       { "id", "id"}
                                    };
    
                //      content.Add(new FormUrlEncodedContent(values));
                foreach (var keyValuePair in values)
                {
                    content.Add(new System.Net.Http.StringContent(keyValuePair.Value), keyValuePair.Key);
                }
    
                string fileName = @"C:/ТестXML";
                var fileContent = new System.Net.Http.StreamContent(System.IO.File.OpenRead(fileName));
                fileContent.Headers.ContentDisposition = new System.Net.Http.Headers.ContentDispositionHeaderValue("attachment")
                {
                    FileName = System.IO.Path.GetFileName(fileName)
                };
                content.Add(fileContent);
    
                // Вариант отправки двоичных данных из файла но более краткий
                var fileContent2 = new System.Net.Http.StreamContent(System.IO.File.OpenRead(fileName));
                content.Add(fileContent2, "attachment", "TestXml");
    
    
    
                var stringContent = new System.Net.Http.ByteArrayContent(Encoding.UTF8.GetBytes("Тестовая строка"));
                stringContent.Headers.ContentDisposition = new System.Net.Http.Headers.ContentDispositionHeaderValue("attachment")
                {
                    FileName = "Строка"
                };
                content.Add(stringContent);
    
                var requestUri = "api/values/SendFiles";
    
                var result = await client.PostAsync(requestUri, content);
                var str = await result.Content.ReadAsStringAsync();
                textBox.AppendText(str + Environment.NewLine);
    
            }
        }
    

    诸如此类的问题

    // 这是发送请求的样子 //POST http://localhost:40320/api/values/SendFiles HTTP/1.1 //Content-Type: multipart/form-data; boundary="9f2d525a-7383-46ab-8fc7-419d73486c02" //Host: localhost:40320 //Content-Length: 811 //Expect: 100-continue //Connection: Keep-Alive

    //--9f2d525a-7383-46ab-8fc7-419d73486c02 //Content-Type: text/plain; charset=utf-8 //Content-Disposition: form-data; 名字=名字

    //名称 //--9f2d525a-7383-46ab-8fc7-419d73486c02 //Content-Type: text/plain; charset=utf-8 //Content-Disposition: form-data; 名称=编号

    //id //--9f2d525a-7383-46ab-8fc7-419d73486c02 //Content-Disposition: form-data; filename="=?utf-8?B?0J/RgNC+0YHRgtC+0KHRgtGA0L7QutCw?="; name=attachment //内容类型:文本/纯文本

    //测试字符串 //--9f2d525a-7383-46ab-8fc7-419d73486c02 //Content-Disposition: form-data; filename="=?utf-8?B?0KLQtdGB0YJYTUw=?=" //Content-Type: application/octet-stream

    //12345 //--9f2d525a-7383-46ab-8fc7-419d73486c02 //Content-Disposition: form-data; 名称=附件;文件名=TestXml;文件名*=utf-8''TestXml

    //12345 //--9f2d525a-7383-46ab-8fc7-419d73486c02--

    还有一个指向该服务的链接http://pastebin.com/1kyhAdai

    [NonAction]
            string fileName(MultipartFileData fileData)
            {
                string fileName = fileData.Headers.ContentDisposition.FileName;
    
                if (string.IsNullOrEmpty(fileName))
                {
                    return "";
                }
    
                if (fileName.StartsWith("\"") && fileName.EndsWith("\""))
                {
                    fileName = fileName.Trim('"');
                }
                if (fileName.Contains(@"/") || fileName.Contains(@"\"))
                {
                    fileName = Path.GetFileName(fileName);
                }
    
                return fileName;
            }
            [HttpPost]
            public async Task<HttpResponseMessage> SendFiles()
            {
                if (!Request.Content.IsMimeMultipartContent())
                {
                    throw new HttpResponseException(HttpStatusCode.UnsupportedMediaType);
                }
    
                string root = HttpContext.Current.Server.MapPath("~/App_Data");
                var provider = new MultipartFormDataStreamProvider(root);
    
                try
                {
                    StringBuilder sb = new StringBuilder(); // Holds the response body
    
                    // Read the form data and return an async task.
                    await Request.Content.ReadAsMultipartAsync(provider);
    
                    // This illustrates how to get the form data.
                    foreach (var key in provider.FormData.AllKeys)
                    {
                        foreach (var val in provider.FormData.GetValues(key))
                        {
                            sb.Append(string.Format("{0}: {1}\n", key, val));
                        }
                    }
    
                    // This illustrates how to get the file names for uploaded files.
                    foreach (var file in provider.FileData)
                    {
                        var fileInfo = new FileInfo(file.LocalFileName);
                        sb.Append(string.Format("Uploaded file: {0} {1} ({2} bytes)\n", fileName(file), fileInfo.Name, fileInfo.Length));
                    }
                    return new HttpResponseMessage()
                    {
                        Content = new StringContent(sb.ToString())
                    };
                }
                catch (System.Exception e)
                {
                    return Request.CreateErrorResponse(HttpStatusCode.InternalServerError, e);
                }
    
    
            }
    
    • 0

相关问题

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    如何停止编写糟糕的代码?

    • 3 个回答
  • Marko Smith

    onCreateView 方法重构

    • 1 个回答
  • Marko Smith

    通用还是非通用

    • 2 个回答
  • Marko Smith

    如何访问 jQuery 中的列

    • 1 个回答
  • Marko Smith

    *.tga 文件的组重命名(3620 个)

    • 1 个回答
  • Marko Smith

    内存分配列表C#

    • 1 个回答
  • Marko Smith

    常规赛适度贪婪

    • 1 个回答
  • Marko Smith

    如何制作自己的自动完成/自动更正?

    • 1 个回答
  • Marko Smith

    选择斐波那契数列

    • 2 个回答
  • Marko Smith

    所有 API 版本中的通用权限代码

    • 2 个回答
  • Martin Hope
    jfs *(星号)和 ** 双星号在 Python 中是什么意思? 2020-11-23 05:07:40 +0000 UTC
  • Martin Hope
    hwak 哪个孩子调用了父母的静态方法?还是不可能完成的任务? 2020-11-18 16:30:55 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    user207618 Codegolf——组合选择算法的实现 2020-10-23 18:46:29 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    Arch ArrayList 与 LinkedList 的区别? 2020-09-20 02:42:49 +0000 UTC
  • Martin Hope
    iluxa1810 哪个更正确使用:if () 或 try-catch? 2020-08-23 18:56:13 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5