Как загрузить изображение различного типа (jpg / png / gif) на сервер через Stream с помощью веб-API WCF - PullRequest
0 голосов
/ 17 октября 2019

По какой-то причине я использую WCF для webAPI .. Я использую WCF уже несколько дней. На поиске кода для загрузки изображения на сервер я нашел много ответов и решений, таких как:

Не удалось загрузить изображение в службу отдыха WCF

Загрузка изображения в виде вложения в RESTful WCF Service

Загрузка изображения с помощью WCF RESTFul, полный рабочий пример

приведенный выше пример (полное пробуждение) работает для меня... принять часть, которая принимает только изображения в формате 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: я использую запрос почтальона для отправки изображения, как в следующем простом файле просмотраопция в секции байтов, такая как:

введите описание изображения здесь

PS: Наряду с изображением, я не могу передать имя файла, даже если я хочу, так как StreamПараметр не позволяет использовать другие параметры.

Ответы [ 2 ]

0 голосов
/ 18 октября 2019

Как упомянул joehoper, в настоящее время мы можем передавать дополнительную информацию на сервер, используя заголовок Http, см. Мой дизайн кода.
На стороне сервера.
Сервисный интерфейс.

[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);
        }
    }
}

На стороне клиента.
enter image description here В разделе тела будет размещен двоичный файлданные, как и вы.
Кроме того, WCF не поддерживает данные формы по умолчанию, в то время как мы можем воспользоваться сторонней библиотекой, которая позволяет нам передавать параметр формы данных.
https://archive.codeplex.com/?p=multipartparser
Тогда мы можем опубликовать данные формы для передачи информации о файле. Пожалуйста, обратитесь к приведенному ниже коду.

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);
                }
            }
        }

enter image description here
Наконец, имеется встроенная поддержка для передачи данных формы в Asp.net WebAPI.
https://docs.microsoft.com/en-us/aspnet/web-api/overview/advanced/sending-html-form-data-part-2
Не стесняйтесь, дайте мне знать, если есть что-то, с чем я могу помочь.

0 голосов
/ 18 октября 2019

Поток будет содержать только байты в теле запроса, которые будут только файлом содержимого, без дополнительных метаданных, таких как имя файла. Вы можете добавить пользовательские заголовки к вашему запросу, которые задают имя файла и любую другую информацию, которую вы хотите, и читать их из контекста запроса в вашем методе:

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";
}
...