【问题标题】:set MultipartFormDataContent for multipart/form-data file upload right with HttpClient使用 HttpClient 为 multipart/form-data 文件上传设置 MultipartFormDataContent
【发布时间】:2021-11-22 15:14:02
【问题描述】:

以下代码有效:

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。这是我迄今为止尝试过的:

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 标头属于哪里(我尝试过的选项之一是正确的)?如果是,我还有什么问题?

【问题讨论】:

    标签: c# multipartform-data dotnet-httpclient


    【解决方案1】:

    以下代码最终对我有用:

    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;
        }
    }
    ```
    

    【讨论】:

      猜你喜欢
      • 2015-10-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-28
      • 1970-01-01
      • 2018-09-20
      • 2019-05-03
      相关资源
      最近更新 更多