如何使用 WCF web API 通过 Stream 将各种类型 (jpg/png/gif) 的图像上传到服务器

How to upload image of various type (jpg/png/gif) to the server through Stream using WCF web API

出于某种原因,我将 WCF 用于 webAPI。我已经使用 WCF 几天了。在寻找将图像上传到服务器的代码时,我找到了许多答案和解决方案,例如:

Could not upload Image to WCF Rest service

Uploading image as attachment in RESTful WCF Service

Uploading an image using WCF RESTFul service full working example

上面的(完整的)示例对我有用..接受它只接受 jpeg 图像的部分。由于我使用 Postman 来处理请求,Stream 数据类型正在接受它并且 运行 程序。有没有办法从输入流数据中获取文件类型或文件名?

代码如下

interface:
 Method = "POST",
    RequestFormat = WebMessageFormat.Json,
    ResponseFormat = WebMessageFormat.Json)]
string PostImage(Stream stream);

method implementation:
public string PostImage(Stream stream)
    {
        byte[] buffer = new byte[10000];
        stream.Read(buffer, 0, 10000);
        FileStream f = new FileStream("C:\temp\sample.jpg", FileMode.OpenOrCreate);
        f.Write(buffer, 0, buffer.Length);
        f.Close();

        return "Recieved the image on server";
    }

PS:我正在使用邮递员请求发送图像,就像字节部分下的以下简单浏览文件选项一样:

enter image description here

PS:连同图像,即使我想传递文件名也无法传递,因为 Stream 参数不允许任何其他参数。

流将仅包含请求的 body 中的字节,这将只是内容文件,没有额外的元数据,如其文件名。您可以将自定义 headers 添加到您的请求中,指定文件名和您想要的任何其他信息,并在您的方法中从请求上下文中读取它们:

public string PostImage(Stream stream)
{
    var context = WebOperationContext.Current;
    string filename = context.IncomingRequest.Headers["Filename"].ToString();
    string extraInfo = context.IncomingRequest.Headers["Extra-Info"].ToString();

    byte[] buffer = new byte[10000];
    stream.Read(buffer, 0, 10000);
    FileStream f = new FileStream("C:\temp\sample.jpg", FileMode.OpenOrCreate);
    f.Write(buffer, 0, buffer.Length);
    f.Close();

    return "Recieved the image on server";
}

正如joehoper提到的,目前我们可以通过使用Http header将附加信息传递给服务器,请参考我的代码设计。
服务器端。
服务接口。

[OperationContract]
        [WebInvoke(Method = "POST", ResponseFormat = WebMessageFormat.Json,BodyStyle =WebMessageBodyStyle.Bare)]
        Task UploadStream(Stream stream);

服务实施。

public async Task UploadStream(Stream stream)
{
    var context = WebOperationContext.Current;
    string filename = context.IncomingRequest.Headers["filename"].ToString();
    string ext = Path.GetExtension(filename);
    using (stream)
    {
        //save the image under the Uploads folder on the server-side(root directory).
        using (var file = File.Create(Path.Combine(HostingEnvironment.MapPath("~/Uploads"), Guid.NewGuid().ToString() + ext)))
        {
            await stream.CopyToAsync(file);
        }
    }
}

客户端。
正文部分将 post 二进制数据,就像您所做的那样。
另外WCF默认是不支持form-data的,我们可以利用第三方库,让我们可以传递form-data参数。
https://archive.codeplex.com/?p=multipartparser
然后我们可以post form-data来传递文件信息。请参考以下代码。

public async Task UploadStream(Stream stream)
        {
            MultipartParser parser = new MultipartParser(stream);

            if (parser.Success)
            {
                //absolute filename, extension included.
                var filename = parser.Filename;
                var filetype = parser.ContentType;
                var ext = Path.GetExtension(filename);
                using (var file = File.Create(Path.Combine(HostingEnvironment.MapPath("~/Uploads"), Guid.NewGuid().ToString() +ext)))
                {
                    await file.WriteAsync(parser.FileContents, 0, parser.FileContents.Length);
                }
            }
        }


最后,内置支持在 Asp.net WebAPI 中传递表单数据。
https://docs.microsoft.com/en-us/aspnet/web-api/overview/advanced/sending-html-form-data-part-2
如果有什么我可以帮忙的,请随时告诉我。