使用ajax和WCF将文件上载到服务器时损坏的文件

时间:2014-01-14 18:20:55

标签: wcf jquery

我正在尝试使用服务器端的jquery,ajax和wcf来实现图像上传。 运营合同:

    [WebInvoke(UriTemplate = "/createnewsfeedpost?fileName={fileName}", Method = "POST", ResponseFormat = WebMessageFormat.Json)]
    [OperationContract]
    void CreateNewsfeedPost(Stream imageContent, string fileName);

操作实施:

public void CreateNewsfeedPost(Stream imageContent, string fileName)
    {
        byte[] buffer = new byte[32768];
        using (var ms = new FileStream(@"C:/Temp/test.png", FileMode.CreateNew))
        {
            int bytesRead, totalBytesRead = 0;
            do
            {
                bytesRead = imageContent.Read(buffer, 0, buffer.Length);
                totalBytesRead += bytesRead;

                ms.Write(buffer, 0, bytesRead);
            } while (bytesRead > 0);

         }
   }

客户端代码:

      <a id="createNewsFeedPostButton" href="javascript:;">Share</a>
      <input type="file" id="newsFeedImage" />

使用Javascript:

$(document).ready(function () {
        $("#createNewsFeedPostButton").click(function () {
            createNewsFeedPost();
        });
    });

function createNewsFeedPost() {
        var fd = new FormData();
        fd.append('file', $('#newsFeedImage')[0].files[0]);
        $.ajax({
            url:/createnewsfeedpost + "?fileName=test.png",
            data: fd,
            processData: false,
            contentType: false,
            type: 'POST',
            success: function (data) {
                alert('sas');
            },
            error: function (jqXHR, textStatus, errorThrown) {
                alert(textStatus + ' / ' + errorThrown);
            }
        });
  }

我能够在服务实现中获取填充的Stream对象,但问题是它有点损坏。如果我用记事本打开保存的文件,我可以看到一些奇怪的页眉和页脚。

标题:

-----------------------------7de17128101f8
Content-Disposition: form-data; name="file"; filename="C:\icon.png"
Content-Type: image/png

页脚:

-----------------------------7de17128101f8--

有没有办法摆脱这个页脚和标题?

1 个答案:

答案 0 :(得分:2)

感谢Ray Nicholus的解决方案。我需要将消息体解析为多部分数据才能访问图像内容。我从here获取了多部分解析器。

更新了服务器端代码:

var parser = new MultipartParser(imageContent);
if (!parser.Success)
    throw new ApplicationException("Error while parsing image file");

using (var ms = new FileStream(@"C:/Temp/test.png", FileMode.CreateNew))
{
    ms.Write(parser.FileContents, 0, parser.FileContents.Length);
}