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 附加文件名两次的主要内容,如果未能解决你的问题,请参考以下文章
如何修复 RemoteJSDataStream NullReferenceException?
C# StreamContent 和 File.OpenRead() 不产生 HTTP'able 多部分内容