HttpClient StreamContent 附加文件名两次

Posted

技术标签:

【中文标题】HttpClient StreamContent 附加文件名两次【英文标题】:HttpClient StreamContent append filename twice 【发布时间】:2013-12-22 03:00:28 【问题描述】:

我正在使用 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 上传图片的任何原因/可能性。

【问题讨论】:

【参考方案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;

【讨论】:

以上是关于HttpClient StreamContent 附加文件名两次的主要内容,如果未能解决你的问题,请参考以下文章

POST StreamContent 与多个文件

如何修复 RemoteJSDataStream NullReferenceException?

C# StreamContent 和 File.OpenRead() 不产生 HTTP'able 多部分内容

http header

HttpResponeMessage 返回 401(未经授权)

论httpclient上传带参数commons-httpclient和apache httpclient区别