2012-01-15 79 views
2

處理文件的ByteArray我有一個閃存錄像機,記錄用戶的輸入,並給我一個文件的ByteArray在Javascript我怎麼能在Javascript

現在我想的是字節數組上傳到服務器( MVC3),我想知道我該怎麼做?

+1

你嘗試過什麼嗎? – annonymously 2012-01-15 08:31:15

回答

2

您可以使用AJAX請求將字節數組作爲原始數據發送到服務器。我們可以實現自定義模型粘結劑,將讀取原始請求主體,並將其映射到byte[]

public class ByteArrayModelBinder : IModelBinder 
{ 
    public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) 
    { 
     var request = controllerContext.HttpContext.Request; 
     var buffer = new byte[request.InputStream.Length]; 
     request.InputStream.Read(buffer, 0, buffer.Length); 
     return buffer; 
    } 
} 

那麼我們就可以有一個控制器動作,將接收到這個請求:

[HttpPost] 
public ActionResult Upload([ModelBinder(typeof(ByteArrayModelBinder))] byte[] buffer) 
{ 
    // TODO: do something with the uploaded data 
    return Json(true); 
} 

最後在客戶端發送AJAX請求:

// create sample data from the A,B,C bytes: 
var data = String.fromCharCode(65, 66, 67); 

$.ajax({ 
    url: '@Url.Action("upload")', 
    type: 'POST', 
    contentType: 'application/octet-stream', 
    processData: false, 
    data: data, 
    success: function (result) { 
     alert(result); 
    } 
}); 
+0

這沒有與我一起工作,首先你提供了數據兩次,所以我刪除了第一個,現在每次它發佈到服務器它張貼緩衝區爲空! – Stacker 2012-01-15 11:46:15

+0

@Stacker,哎呀,我的錯。那麼,假設你有一個如我的例子中所示的字節數組,你應該可以將它發佈到一個控制器動作,它將採用'byte []'作爲參數。然後在我展示的自定義模型聯編程序中,您可以閱讀請求流的主體。我測試了它,它工作正常。也許您在腳本中的數據與我展示的數據格式不同?請注意,'fromCharCode'方法不包含數組。它需要多個參數。所以,如果你有一個數組''[65,66,67]',它將無法工作...... – 2012-01-15 11:50:57

+0

...在這種情況下,你將不得不爲你的字節數組的每個元素調用'fromCharCode'並且連接它轉換成您將發送到服務器的最終數據。 – 2012-01-15 11:53:02

1

您是否嘗試過簡單地將您的字節數組發佈到控制器方法?如果你使用jquery,只需要使用$ .ajax或$ .post,並根據你的路由安排將請求發送到正確的位置。

+0

我該怎麼做?你能提供一個示例代碼嗎?因爲我不知道如何將一個「ByteArray」放入控制器 – Stacker 2012-01-15 09:21:29

+0

發佈我的方法與上面的評論相同,這些方法沿着: – Rayner 2012-01-16 10:06:48

+0

'//創建來自A的示例數據,B,C字節: var data = String.fromCharCode(65,66,67); $就({ URL: '@ Url.Action( 「上載」)', 類型: 'POST', 的contentType: '應用/八位字節流', 過程數據:假, 數據:數據, 成功:功能(結果){ alert(result); } });' – Rayner 2012-01-16 10:07:17