

## 困っていること

UWPアプリケーションからサーバーサイドのPHPアプリケーションへファイルをポスト送信したいのですが、ファイルの送信に失敗します。  
どう失敗するかというと、PHP側の$_FILES判定が常にfalseとなってしまうのです。

パラメーターは2つ送信しています。  
\- param1 は文字列値  
\- param2 はアップロードファイル

### サーバーサイド（sample.php）では次のように判定を行っています

[code]

    if($_FILES['param2'])
    
[/code]

### 現状失敗するUWP側のコードは次のようになっています

[code]

    private async Task PostSample()
    {
        const string POST_URL = "http://xxx.xxx.xxx.xxx/api/sample.php";
    
        var multi = new HttpMultipartFormDataContent();
    
        var param1 = new HttpStringContent("foo");
        multi.Add(param1, "param1");
    
        byte[] values = new byte[] { 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20 };
        var param2 = new HttpStreamContent(new MemoryStream(values).AsInputStream());
        param2.Headers.ContentDisposition = new Windows.Web.Http.Headers.HttpContentDispositionHeaderValue("form-data")
        {
            Name = "param2",
            FileName = "piyo.dat"
        };
        multi.Add(param2);
    
        var client = new HttpClient();
        var res = await client.PostAsync(new Uri(POST_URL), multi);
    
        var diag = new MessageDialog(res.ToString());
        await diag.ShowAsync();
    }
    
[/code]

* * *

## 試したこと

### 外部ツール

GoogleChromeアプリの `Advanced REST Client` では成功（if($_FILES['param2'])がtrue）しました。

### Windows Formsで類似のコードを実行したところ成功しました

[code]

    private async Task PostSample()
    {
        const string POST_URL = "http://xxx.xxx.xxx.xxx/api/sample.php";
    
        var multi = new MultipartFormDataContent();
    
        var param1 = new StringContent("foo");
        multi.Add(param1, "param1");
    
        byte[] values = new byte[] { 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20 };
        var param2 = new StreamContent(new MemoryStream(values));
        param2.Headers.ContentDisposition = new System.Net.Http.Headers.ContentDispositionHeaderValue("form-data")
        {
            Name = "param2",
            FileName = "piyo.dat"
        };
        multi.Add(param2);
    
        var client = new HttpClient();
        var res = await client.PostAsync(POST_URL, multi);
        MessageBox.Show(res.ToString());
    }
    
[/code]

従いまして、  
UWP側のコードに誤りや不足がある、またはUWPの何らかの仕様が原因ではないかと推測しておりますが、原因がわかりません。  
調査の方向性だけでも結構ですので、何かアドバイスを頂けますと幸いです。

### 環境

  * クライアント 
    * Windows 10(14393) 64bit, .NET Framework 4.6.1
  * サーバー 
    * Windows Server 2008 + IIS7.0

* * *

不適切な可能性がありますが、英語版のStackoverflowへも昨日投稿致しました。しかしながらViewがそもそもつかないようですのでこちらへも投稿させて頂きました。  
不適切であれば削除致しますのでご指摘頂けますと幸いです。

<https://stackoverflow.com/questions/40988582/post-transmission-of-file-fails-
with-uwp>


CC BY-SA 3.0
2016-12-07T00:45:36.310
30969
2017-01-12T08:14:24.277
2017-05-23T12:38:56.083
-1
7740
question
php c# .net http win-universal-app
UWPからファイルのPOST送信に失敗


ほぼ同じコードのWinFormでうまくいくということなら、アプリに外部へデータ送信する権限を与えていないことが考えられます。

[アプリ機能の宣言](https://msdn.microsoft.com/windows/uwp/packaging/app-capability-
declarations)


CC BY-SA 3.0
2016-12-09T12:23:25.627
31054
2016-12-09T12:23:25.627
19725
30969
answer