HttpClient StreamContent追加文件名两次

9

我正在使用微软Http客户端库从Windows Phone 8向服务器发出多部分请求。它包含一个包含json字符串的String内容和一个包含图像流的Stream内容。 现在我收到了状态为OK的响应,并成功访问了服务器。但是日志显示服务器无法获取图像的文件名。

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

其中photoStream是图片流,"files"是内容的名称,文件名则是图像文件的名称。

因此,标头值必须是:

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上传图像的原因/可能性。
3个回答

15
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文件名和标准文件名,则会失败。您的答案对我帮助很大,谢谢! - Richthofen
谢谢!帮助回答。 - Mihir Joshi
谢谢!真的帮了大忙。 - Mayur Dhingra
谢谢!我花了很长时间才找到解决这个问题的方法,非常感谢你分享这个技巧。 - bartburkhardt

0

对我来说,使用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是非常重要的,否则头部将被“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;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接