2

私は何日も試しましたが、成功する結果を得ることができませんでした。情報(最初に作成したユーザー名)を含む画像を投稿する必要があります。

これが私の方法です。

[HttpPost]
    public Task<HttpResponseMessage> PostFile(string createdByName)
    {
        HttpRequestMessage request = this.Request;
        if (!request.Content.IsMimeMultipartContent())
        {
            throw new HttpResponseException(HttpStatusCode.UnsupportedMediaType);
        }

        string root = System.Configuration.ConfigurationSettings.AppSettings["TempUploadDir"];
        var provider = new MultipartFormDataStreamProvider(root);

        var task = request.Content.ReadAsMultipartAsync(provider).
            ContinueWith<HttpResponseMessage>(o =>
            {
                AddImages(provider.BodyPartFileNames);
                string file1 = provider.BodyPartFileNames.First().Value;
                // this is the file name on the server where the file was saved 
                return new HttpResponseMessage()
                {
                    Content = new StringContent("File uploaded.")
                };
            }
        );
        return task;
    }

そしてこれはglobal.asaxが追加された私のTypeFormatterClassです

public class MultiFormDataMediaTypeFormatter : FormUrlEncodedMediaTypeFormatter
{
    public MultiFormDataMediaTypeFormatter()
        : base()
    {
        this.SupportedMediaTypes.Add(new MediaTypeHeaderValue("multipart/form-data"));
    }

    protected override bool CanReadType(Type type)
    {
        return true;
    }

    protected override bool CanWriteType(Type type)
    {
        return false;
    }

    protected override Task<object> OnReadFromStreamAsync(Type type, Stream stream, HttpContentHeaders contentHeaders, FormatterContext formatterContext)
    {
        var contents = formatterContext.Request.Content.ReadAsMultipartAsync().Result;
        return Task.Factory.StartNew<object>(() =>
        {
            return new MultiFormKeyValueModel(contents);
        });
    }

    class MultiFormKeyValueModel : IKeyValueModel
    {
        IEnumerable<HttpContent> _contents;
        public MultiFormKeyValueModel(IEnumerable<HttpContent> contents)
        {
            _contents = contents;
        }


        public IEnumerable<string> Keys
        {
            get
            {
                return _contents.Cast<string>();
            }
        }

        public bool TryGetValue(string key, out object value)
        {
            value = _contents.FirstDispositionNameOrDefault(key).ReadAsStringAsync().Result;
            return true;
        }
    }
}

画像と「createdByName」を投稿すると、画像にアクセスできますが、パラメータを設定できませんでした。これどうやってするの?

ありがとうございました。

4

1 に答える 1

1

作成したByNameフィールドを取得するには、ContinueWith内で:

var parts = o.Result;

HttpContent namePart = parts.FirstDispositionNameOrDefault("createdByName");
if (namePart == null)
{
  throw new HttpResponseException(HttpStatusCode.BadRequest);
}
string name = namePart.ReadAsStringAsync().Result;

より詳細な例については、以下を参照してください。

http://www.asp.net/web-api/overview/working-with-http/html-forms-and-multipart-mime#multipartmime

于 2012-06-01T20:57:35.150 に答える