2012-08-03 61 views
1

我試圖使用Webclient將我的Monotouch應用程序(運行於iPad)上的二進制文件(照片)同步到我們的PHP服務器(Windows)。正在發送和接收文件,但二進制文件似乎在服務器上已損壞,無法查看。WebClient UploadFile破壞二進制數據

下面是客戶端代碼:

static void UploadPhotos() 
{ 
    WebClient client = new WebClient(); 
    client.Headers.Add("Content-Type","application/octet-stream"); 
    string sUri = GetUri(); 
    client.UploadFile (sUri, "POST", "images/test.png"); 
} 

這裏是PHP代碼在服務器上:

<?php 
$uploadDir = "C:\\uploaddir\\"; 
foreach ($_FILES as $file_name => $file_array) { 
    $uploadFile = $uploadDir . $file_array['name']; 
    move_uploaded_file($file_array['tmp_name'], $uploadFile); 
} 
?> 

有誰知道爲什麼二進制數據獲取上傳和損壞如何修理它?

更新:

非常奇怪了。看起來我遇到的問題隻影響png圖像; jpeg圖像似乎正確。 jpeg圖像在服務器上的Windows資源管理器中正確顯示圖像尺寸,我可以預覽jpeg圖像。我測試的jpeg圖像大約是90 KB。雖然png文件沒有正確顯示。在Windows資源管理器中,png文件不顯示圖像的尺寸,無法預覽。服務器上的png文件大小較大。因此,舉例來說,我使用以下png圖像:

http://tuxpaint.org/stamps/stamps/animals/birds/cartoon/tux.png

初始文件是40.2 KB(41236個字節);傳輸後服務器上的文件大小爲45.3 KB(46468字節)。任何人有任何想法如何發生?

+0

執行文件大小是否匹配?你有沒有嘗試使用相同的代碼從一個簡單的Windows客戶端上傳?這將有助於確定問題是客戶端還是服務器。您還應該嘗試上傳一個小文本文件 - 是否有可能導致問題的服務器上的文件大小限制? – Jason 2012-08-03 23:29:25

回答

2

嘗試將Content-Type設置爲「application/octet-stream」,我認爲這對於二進制數據更爲常見,並且服務器可能無法識別二進制/八位字節流。

+1

謝謝,邁克。我甚至沒有注意到「binary/octet-stream」;來自某個網​​站的複製/粘貼。我用「application/octet-stream」取代了它,但不幸的是它仍然無法正常工作。 – BruceHill 2012-08-03 16:49:09

+0

它仍然似乎上傳爲二進制以外的東西。這篇文章暗指使用multipart/form-data:http://stackoverflow.com/questions/10642536/httpwebrequest-works-webclient-uploadfile-doesnt – petrsnd 2016-07-20 23:19:50

0

我不得不使用UploadDataAsync

using (WebClient client = new WebClient()) 
     { 
      client.Credentials = CredentialCache.DefaultCredentials; 
      byte[] bytes = File.ReadAllBytes(filePath); 
      client.UploadDataAsync(new Uri(url), bytes); 
     }