2

.net Web API を使用してファイルをアップロードするために、いたるところにあるいくつかの例のいずれかを使用しています。ファイルはサーバーに保存されますが、プロバイダーの fileData オブジェクトは常に空を返します。以下のコード。

 var url = "api/Documents/fileUpload";
                    var xhr = new XMLHttpRequest();
                    var file = document.getElementById("inputFile").files[0];
                    var formData = new FormData();
                    formData.append('file', file);
                    xhr.open("POST", url, true);
                    xhr.responseType = "text";
                    xhr.onreadystatechange = function () {
                        if (xhr.readyState == xhr.DONE) {
                            console.log("photoUpload xhr", xhr);
                            var responseTypeAsJSON = JSON.parse(xhr.responseText);
                            currentPhoto.responseText = xhr.responseText;
                            if (responseTypeAsJSON.result == "SUCCESS") {
                                currentPhoto.status = "SUCCESSfully uploaded";
                            }
                            else {
                                currentPhoto.status = responseTypeAsJSON.result;
                                alert(responseTypeAsJSON.message);
                            }
                            PhotoClear();
                            // console.log(currentPhoto);
                            // console.log("xhr done: ", xhr);  

                        }
                    }
                    xhr.send(formData);
                    // console.log("xhr sent: ", xhr);

受信するコントローラー:

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

        string root = System.Web.HttpContext.Current.Server.MapPath("~/App_Data");
        var provider = new MultipartFormDataStreamProvider(root);

        var task = request.Content.ReadAsMultipartAsync(provider).
            ContinueWith<HttpResponseMessage>(o =>
            {

                string file1 = provider.FileData.First().LocalFileName.ToString();
                // this is the file name on the server where the file was saved 

                return new HttpResponseMessage()
                {
                    Content = new StringContent("File uploaded.")
                };
            }
        );
        return task;
    }

Chrome からのリクエストは次のとおりです。プロバイダーをデバッグすると、フォーム データのキーも空になります。それでも、ファイルは AppData に入れられます

Request URL:http://localhost:4231/api/Documents/fileUpload
Request Headersview source
Content-Type:multipart/form-data; boundary=----WebKitFormBoundarycuGegdEDmBsR0mMl
Origin:http://localhost:4231
Referer:http://localhost:4231/
User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.22 (KHTML, like Gecko)     Chrome/25.0.1364.172 Safari/537.22
Request Payload
------WebKitFormBoundarycuGegdEDmBsR0mMl
Content-Disposition: form-data; name="testInfo"

some info here for testing
------WebKitFormBoundarycuGegdEDmBsR0mMl
Content-Disposition: form-data; name="file"; filename="irislogo.png"
Content-Type: image/png


------WebKitFormBoundarycuGegdEDmBsR0mMl--
4

2 に答える 2

3

私はこの正確な問題に直面していましたが、小さなコード変更で問題が修正されました。

この線:

 var provider = new MultipartFormDataStreamProvider(root);

次のようにする必要があります。

 var provider = new MultipartFileStreamProvider(root);
于 2015-09-14T23:38:33.570 に答える
1

私もこの問題を抱えていました。ここに解決策があります:

public async Task<HttpResponseMessage> Save()
{
    string root = HttpContext.Current.Server.MapPath("~/App_Data");

    var provider = new MultipartFormDataStreamProvider(root);

    await Request.Content.ReadAsMultipartAsync(provider);

    // provider.FileData will contain your data...
    // you can also send form data which will be in provider.FormData
}
于 2015-12-11T15:59:10.987 に答える