Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用HttpClient设置多部分/表单数据文件上传权限的MultipartFormDataContent

使用HttpClient设置多部分/表单数据文件上传权限的MultipartFormDataContent
EN

Stack Overflow用户
提问于 2021-11-22 07:14:02
回答 1查看 84关注 0票数 0

下面的代码可以工作:

代码语言:javascript
运行
AI代码解释
复制
string UploadWithHttpRequest(string url, string filePath, string fileName)
{
    try
    {
        byte[] fileByteArray = File.ReadAllBytes(filePath);

        string formDataBoundary = $"----------{Guid.NewGuid():N}";
        string contentType = "multipart/form-data; boundary=" + formDataBoundary;
        byte[] formData = GetMultipartFormDataForUpload(fileByteArray, fileName, contentType, formDataBoundary);
        var request = WebRequest.Create(url) as HttpWebRequest;

        request.Method = "POST";
        request.ContentType = contentType;
        request.UserAgent = Credentials.UserName;
        request.CookieContainer = new CookieContainer();
        request.ContentLength = formData.Length;
        request.Credentials = Credentials;

        using (Stream RequestStream = request.GetRequestStream())
        {
            RequestStream.Write(formData, 0, formData.Length);
            RequestStream.Close();
        }

        var response = request.GetResponse() as HttpWebResponse;

        var ResponseReader = new StreamReader(response.GetResponseStream());
        string FullResponse = ResponseReader.ReadToEnd();
        response.Close();
        return FullResponse;
    }
    catch (Exception ex)
    {
        throw ex;
    }
}

byte[] GetMultipartFormDataForUpload(byte[] byteArray, string fileName, string contentType, string Boundary)
{
    Stream FormDataStream = new MemoryStream();
    string Header = string.Format("--{0}" + Environment.NewLine + "Content-Disposition: form-data; name=\"{1}\"; filename=\"{2}\"" 
                                    + Environment.NewLine + Environment.NewLine, Boundary, "file", fileName);
    FormDataStream.Write(Encoding.UTF8.GetBytes(Header), 0, Encoding.UTF8.GetByteCount(Header));
    FormDataStream.Write(byteArray, 0, byteArray.Length);

    string Footer = Environment.NewLine + "--" + Boundary + "--" + Environment.NewLine;
    FormDataStream.Write(Encoding.UTF8.GetBytes(Footer), 0, Encoding.UTF8.GetByteCount(Footer));
    FormDataStream.Position = 0L;
    var FormData = new byte[(int)(FormDataStream.Length - 1L + 1)];
    FormDataStream.Read(FormData, 0, FormData.Length);
    FormDataStream.Close();
    return FormData;
}

但是,我不想使用HttpRequest,我想使用HttpClient,而不是手动进行所有编码(尤其是在GetMultipartFormDataForUpload中),我想使用MultipartFormDataContent类。当我尝试这样做时,我总是从服务器得到一个500。这是我到目前为止所尝试的:

代码语言:javascript
运行
AI代码解释
复制
async Task<string> UploadWithHttpClient(string url, string filePath, string fileName)
{
    try
    {
        byte[] fileByteArray = File.ReadAllBytes(filePath);

        var content = new MultipartFormDataContent("------------" + Guid.NewGuid());

        var byteArrayContent = new ByteArrayContent(fileByteArray, 0, fileByteArray.Length);

        //Option 1
        byteArrayContent.Headers.ContentDisposition = new ContentDispositionHeaderValue("form-data")
        {
            Name = "file",
            FileName = fileName
        };

        //Option 2
        content.Headers.ContentDisposition = new ContentDispositionHeaderValue("form-data")
        {
            Name = "file",
            FileName = fileName
        };
        content.Add(byteArrayContent, "file");

        var client = new HttpClient();
        var response = await client.PostAsync(url, content);
        var result = await response.Content.ReadAsStringAsync();

        
        return result;
    }
    catch (Exception ex)
    {
        throw ex;
    }
}

用httpclient替换httprequest的正确方法是什么?content-disposition头属于哪里(这是我尝试过的正确选项之一)吗?如果是,我还有什么问题?

EN

回答 1

Stack Overflow用户

发布于 2021-11-23 00:30:56

下面的代码最终为我工作:

代码语言:javascript
运行
AI代码解释
复制
async Task<string> UploadWithHttpClient(string url, string filePath, string fileName)
{
    try
    {
        byte[] fileByteArray = File.ReadAllBytes(filePath);

        var content = new MultipartFormDataContent("------------" + Guid.NewGuid());

        var byteArrayContent = new ByteArrayContent(fileByteArray);

        byteArrayContent.Headers.ContentType = MediaTypeHeaderValue.Parse("application/pdf");

        content.Add(byteArrayContent, "\"file\"", $"\"{fileName}\"");

        var client = new HttpClient();
        var response = await client.PostAsync(url, content);
        var result = await response.Content.ReadAsStringAsync();

        
        return result;
    }
    catch (Exception ex)
    {
        throw ex;
    }
}
代码语言:javascript
运行
复制
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70068041

复制
相关文章
RxJS Observable
这两个模式是 Observable 的基础,下面我们先来介绍一下 Observer Pattern。
阿宝哥
2019/11/05
2.5K0
Cold Observable 和 Hot Observable
Hot Observable 无论有没有 Subscriber 订阅,事件始终都会发生。当 Hot Observable 有多个订阅者时,Hot Observable 与订阅者们的关系是一对多的关系,可以与多个订阅者共享信息。
fengzhizi715
2018/08/24
1.1K0
Cold Observable 和 Hot Observable
RxJava Observable 使用和源码阅读
过去的 Observer 观察者回调有 onNext()、onComplete()、onError(),现在多了一个 onSubscribe(),刚开始调用,相当于 1.x 的 onStart(),参数是 Disposable,相当于 1.x 中的 Subscription,用于解除订阅。
三流之路
2018/09/11
7670
两步使用 LiveData 替换 Observable Field
可观察性指的是一个对象会在其数据发生变更时向其他类发出通知。可观察性是数据绑定库 (Data Binding) 的重要特性之一,它可以将数据和 UI 元素绑定在一起——当数据发生变化时,屏幕上的相关元素也会随之更新。
Android 开发者
2020/04/22
1.1K0
创建 Observable
在 RxJS 中为我们提供了很多创建 Observable 对象的方法,其中 create 是最基本的方法。它是 Observable 类的静态属性 —— static create: Function,也是创建 Observable 对象的工厂方法。
阿宝哥
2019/11/05
1.1K0
Vue中的Observable()
随着组件的细化,就会遇到多组件状态共享的情况, Vuex当然可以解决这类问题,不过就像 Vuex官方文档所说的,如果应用不够大,为避免代码繁琐冗余,最好不要使用它,今天我们介绍的是 vue.js 2.6 新增加的 Observable API ,通过使用这个 api 我们可以应对一些简单的跨组件数据状态共享的情况。
刘亦枫
2020/03/19
1.3K0
MobX 源码解析-observable
最近一直在用 MobX 开发中小型项目,开发起来真的,真的很爽,响应式更新,性能快,样板代码减少(相对 Redux)。所以,想趁 2019 年结束前把 MobX 源码研究一遍。
发声的沉默者
2021/06/14
7720
MobX 源码解析-observable
RxSwift介绍(二)——Observable
Observable<T>类是RxSwift框架的基础。其作用就像是一条流水线,让观察者可以实时获取对所有可观察对象所触发的事件,也就是说以此来实现对UI的实时更新或数据、事件等实时处理。 与之前介绍RAC类似,Observable对象所触发的事件有: next,触发时将可观察对象的新值传递给观察者 completed,可观察对象的生命周期正常结束并不再响应触发事件 error,可观察对象出现错误导致其生命周期终止
我只不过是出来写写代码
2019/04/02
1.5K0
RxSwift介绍(二)——Observable
函数响应式编程框架RxSwift 学习——Observable
最近开始研究RxSwift,网上能查到的资料太有限,边学边记录,有不对的地方欢迎大家指正。
100000798482
2018/08/20
7800
jface databinding:List,Set,Map对象的Observable代理封装
需求描述 对于一个已经存在的集合/映射对象(普通的List,Set,Map,非observable),我们希望把将它转换成一个observable对象,这个observable对象就像是原对象的代理一
10km
2018/01/03
6180
3. 说清 Observable
发布—订阅模式又叫观察者模式,它定义对象间的一种一对多的依赖关系,当一个对象的状 态发生改变时,所有依赖于它的对象都将得到通知。在 JavaScript 开发中,我们一般用事件模型 来替代传统的发布—订阅模式。
mafeifan
2018/12/27
5420
3. 说清 Observable
Observable subscribe流程介绍
我们可以看到 前面四个方法都是调用了第五个方法,对参数onNext、onError、onComplete、onSubscribe的默认赋值。
103style
2022/12/19
3970
将MapperScan错误使用导致的BindingException问题
在前面的代码中,使用fluent mybatis的mapper对表进行增删改查都没有问题。 但是fluent mybatis官方也说了,自动会生成dao层代码,将dao及其实现类都生成好了。因此也想尝试下生成的代码使用的效果。 此外,由于不想建多个project来进行测试,因此对于不同的测试,都在src/main/java下面弄各种不同的包来进行区分。本次测试的package:com.dhb.gts.javacourse.week6.mysqltest目录。
冬天里的懒猫
2021/09/22
1.6K0
点击加载更多

相似问题

未调用Observable.map()

12

使用Mockito时,将不会调用Observable的map函数

11

使用Observable.switch时的困惑

12

使用Observable - RxSwift绑定BehaviorRelay

113

角Observable.startWith导致绑定检查错误

10
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档