2013-08-07 41 views
1

我的web應用程序需要將多個附件保存到我的SQL服務器。附件可以是任何格式。是否有可能創建一個敲除視圖模型來將客戶端上的文件類型編碼爲二進制文件並將該二進制信息傳輸到我的SQL服務器?使用敲除js將文件保存到SQL服務器

目前,我有我的REST服務這個方法:

[OperationContract, WebInvoke(ResponseFormat = WebMessageFormat.Json)] 
    public string PostAttachments (string FileName) 
    { 
     try 
     { 
      var MyAttachment = new Binary(File.ReadAllBytes(FileName)); 
      return "Attachments Created"; 
     } 
     catch (Exception ex) 
     { 

      return DefaultError + ex; 
     } 

    } 

我知道這是不正確,但我真的不知道如何做到這一點的文件上傳。我相信我過於複雜了。任何援助將不勝感激。

回答

2

您必須將緩衝區傳輸到服務器,而不僅僅是文件名,因爲該文件存在於客戶端。

我使用HTML5的FileReader我在去年KO項目

首先自定義綁定從DOM元素讀取文件

(function() { 
    ko.bindingHandlers.file = { 
     init: function (element, valueAccessor, allBindingsAccessor) { 
      ko.utils.registerEventHandler(element, "change", function() { 
       writeValueToProperty(valueAccessor(), allBindingsAccessor, "file", element.files[0]); 
      }); 
     }, 
     update: function (element, valueAccessor) { 
      if (ko.utils.unwrapObservable(valueAccessor()) == null) { 
       element.value = ""; 
      } 
     } 
    }; 

    var writeValueToProperty = function (property, allBindingsAccessor, key, value, checkIfDifferent) { 
     if (!property || !ko.isObservable(property)) { 
      var propWriters = allBindingsAccessor()['_ko_property_writers']; 
      if (propWriters && propWriters[key]) 
       propWriters[key](value); 
     } else if (ko.isWriteableObservable(property) && (!checkIfDifferent || property.peek() !== value)) { 
      property(value); 
     } 
    }; 
}()); 

的FileReader使用(具體的我是如何用它在我的應用程序代碼)。僅檢查FileReader部分。 注意,如果你有大量的文件需要流,而不是

processFiles: function (viewModel, callback) { 
     var files = []; 
     ko.utils.arrayForEach(viewModel.files, function (file) { 
      if (file.fileUpload() == null) return; 
      var count = Enumerable.From(viewModel.files) 
       .Where(function(f) { return f.fileUpload() != null; }) 
       .Count(); 

      var reader = new FileReader(); 
      reader.onload = function (e) { 
       var base64 = e.target.result.substr(e.target.result.indexOf(",") + 1); 
       files.push({ Type: file.type, Data: base64, Filename: file.fileUpload().name }); 

       if (files.length == count) { 
        callback(files); 
       } 
      }; 

      reader.readAsDataURL(file.fileUpload()); 
     }); 
    } 

更新 就像說,這是對我的使用情況下的代碼,你將需要改變它以適應你的目的

<div data-bind="foreach: files"> 
    <p><label data-bind="text: typeName"></label><input data-bind="file: fileUpload" type="file" /></p>    
</div> 

控制器(我會使用WebApi,如果我今天這樣做)

public JsonResult UploadFiles(IEnumerable<FileUploadViewModel> uploads) 
{   
    fileRepository.SaveUploadedFiles(Mapper.Map<IEnumerable<FileUploadViewModel>, IEnumerable <FileUpload>> (uploads)); 
    return string.Empty.AsJson(); 
} 

FileUploadViewModel

public class FileUploadViewModel 
{ 
    public FileType Type { get; set; } 
    public string Filename { get; set; } 
    public string Data { get; set; } 
} 

Automapper配置

Mapper.CreateMap<FileUploadViewModel, FileUpload>() 
     .ForMember(to => to.Buffer, opt => opt.MapFrom(from => Convert.FromBase64String(from.Data))); 
+0

能否請你提供HTML和LINQ到SQL代碼如何或多或少會看? –

+1

我更新了更多的代碼。順便說一句,文件類型是特定領域它不是在這種情況下的mimetype – Anders

+1

更新與Automapper配置 – Anders

相關問題