【问题标题】:HttpClient StreamContent append filename twiceHttpClient StreamContent 附加文件名两次
【发布时间】:2023-03-29 17:31:01
【问题描述】:

我正在使用 Microsoft Http 客户端库从 Windows Phone 8 向服务器发出多部分请求。它包含一个具有 json 字符串的字符串内容和一个具有图像流的流内容。 现在我得到状态 OK 并在服务器上请求命中。但日志显示服务器无法获取图像的文件名。

content.Add(new StreamContent(photoStream), "files", fileName);

其中 photoStream 为图片流,“files”为内容名称,file name 为图片文件名。

所以标题值必须是:

Content-Disposition: form-data; name=files; filename=image123.jpg

其实是这样的:

Content-Disposition: form-data; name=files; filename=image123.jpg; filename*=utf-8''image123.jpg

为什么要附加“; filename*=utf-8''image123.jpg”部分。 有问题吗?

请让我知道我无法从 WP8 上传图片的任何原因/可能性。

【问题讨论】:

    标签: c# windows-phone-8 content-type image-uploading multipartform-data


    【解决方案1】:
    using (var content = new MultipartFormDataContent())
    {
        content.Add(CreateFileContent(imageStream, fileName, "image/jpeg"));
    }
    
    private StreamContent CreateFileContent(Stream stream, string fileName, string contentType)
    {
        var fileContent = new StreamContent(stream);
        fileContent.Headers.ContentDisposition = new ContentDispositionHeaderValue("form-data") 
        { 
            Name = "\"files\"", 
            FileName = "\"" + fileName + "\""
        };
        fileContent.Headers.ContentType = new MediaTypeHeaderValue(contentType);            
        return fileContent;
    }
    

    【讨论】:

    • 谢谢。这是连接到 Campfire 的 API 时出现的问题,它严格读取“文件名”属性,如果您指定 UTF8 文件名和标准文件名,则会失败。您的回答对我帮助很大,谢谢!
    • 谢谢。!!帮助回答。
    • 谢谢!真的很有帮助。
    • 谢谢!!!我花了很长时间才找到解决这个问题的方法,非常感谢分享这个技巧
    【解决方案2】:

    对我来说,使用 HttpStringContent 而不是 StreamContent,Damith 的解决方案没有奏效,但最后我找到了这个:

    var fd = new Windows.Web.Http.HttpMultipartFormDataContent();
    var file = new Windows.Web.Http.HttpStringContent(fs);
    file.headers.contentType = new Windows.Web.Http.Headers.HttpMediaTypeHeaderValue("application/octet-stream");
    fd.add(file);
    file.headers.contentDisposition = new Windows.Web.Http.Headers.HttpContentDispositionHeaderValue.parse("form-data; name=\"your_form_name\"; filename=\"your_file_name\"");

    注意:添加文件后一定要设置contentDisposition,否则header会被“form-data”覆盖。

    【讨论】:

      【解决方案3】:

      我的简单解决方案:

      HttpContent fileStreamContent = new StreamContent(new FileStream(xmlTmpFile, FileMode.Open));
      var formData = new MultipartFormDataContent();
      formData.Add(fileStreamContent, "xml", Path.GetFileName(xmlTmpFile));
      fileStreamContent.Headers.ContentDisposition.FileNameStar = null;
      

      【讨论】:

        猜你喜欢
        • 2012-07-29
        • 1970-01-01
        • 2014-10-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-11-15
        相关资源
        最近更新 更多