2012-07-19 48 views
2

我試圖在ravenDb中保存附件。我收到文件未找到錯誤。ravendb上傳文件錯誤

MVC視圖:

<input type="file" name="file" id="Ids2" style="float:right"/> 

在一個AJAX調用,我傳遞在上述控制到控制器的方法選擇的文件名的值 - 其輪流發送文件名來調用自定義方法「Upload」

public virtual string Upload(string fileName) 
    { 
     IDocumentSession session = GetCurrentDocumentSession(); 
     var id = "upload/" + randomGen(); 

     session.Advanced.DatabaseCommands.PutAttachment(id,null, 
          File.ReadAllBytes(fileName), optionalMetaData);  
     return id; 
    } 

我得到C:\ ProgramFiles(x86)....沒有指定文件。 可以說在視圖中 - 我瀏覽到C:/Doc1.txt並單擊添加按鈕,在視圖上保存一堆其他字段,並從文件上傳控件中選取文件名/路徑。

我得到session.advance.databasecommands錯誤...線

找不到文件「C:\ Program Files文件(x86)的\ Common Files文件\ Microsoft共享\ DevServer \ 10.0 \文檔1。文本'。

如果我手動移動Doc1.txt文件到上面的位置,ravenDB保存附件,我可以從本地主機看出來:8080 /靜態/上傳/鍵值

我怎樣才能讓ravenDB走從文件的位置的用戶選擇,而不是從它看起來像C的默認位置是什麼:PROGRAMFILES .....

編輯:

function() { 

var iFile = iContainer.find('#Ids2').val(); 

var DataToSave = { 

    'Attachment' : iFile 
}; 

var encodedData = $.toJSON(DataToSave); 


$.ajax({ 
    type: 'POST' , 
    url: '/AttController/Attach' , 
    data: encodedData, 
    contentType: 'application/json; charset=utf-8' , 
    success: function (rc) { 
     if (rc.Success) { 
      // more javascript reroutes..business logic 
     } 
     else { 

      alert(rc.Message); 
     } 
    }, 
    error: function (xhr, ajaxOptions, thrownError) { 

     alert('Error attaching \n' + xhr.response); 
    } 
}); 

}; 
+0

你能提供ajax嗎?我想我知道爲什麼,但我想在回答之前確定 – 2012-07-19 19:54:15

+0

謝謝肖恩C ..請參閱OP編輯 – ZVenue 2012-07-19 20:16:56

回答

1

根據瀏覽器的HTML文件控制確實沒有t存儲文件的完整路徑。如果您使用Chrome並調試腳本

var iFile = iContainer.find('#Ids2').val(); 

將返回類似於C:\ fakepath \ yourfile.txt的內容。與IE一樣,返回完整路徑。

此外,你在你的Ajax中沒有推送文件的字節,而只是文件名,這意味着除非你只在網絡服務器的瀏覽器上運行這個網站,否則文件在同一個地方因爲網絡服務器很苗條。

如果您試圖通過ajax將文件上傳到MVC控制器,我會建議uploadify。

  $("#Ids2").uploadify(
      { 
       uploader: '/AttController/Attach', 
       swf: 'your/path/to/uploadify.swf', 
       cancelImg: 'your/path/to/cancel.jpg', 
       buttonText: 'Select File', 
       fileSizeLimit: '300KB', 
       fileTypeDesc: 'Image Files', 
       fileTypeExts: '*.gif; *.jpg; *.png', 
       auto: 'true', 
       multiple: 'false', 
       onError: function(type, info) { 

       }, 
       onUploadSuccess: function(file, data, response) { 

       } 
      }); 

然後,只需改變你的控制器動作

public virtual ActionResult Upload(HttpPostedFileBase FileData) 

的的FileData將有東西,如文件名,還必須在輸入流的文件。

+0

可以說我在這裏做兩件事..一個 - 節省一堆領域和兩個 - 附加..從你我需要做兩個單獨的ajax調用..一個用於保存其他字段,另一個用於只是嚴格上傳..爲了簡化上面的OP代碼中的ajax代碼,我刪除了所有其他我試圖保存的字段上傳.. – ZVenue 2012-07-20 13:55:08

+0

無論您在做什麼,都無法將字符串傳遞到客戶端計算機上的文件到Web服務器,並讓Web服務器找到該文件。您需要獲取文件字節數據並將其傳遞給服務器。這不是RavenDb相關的。 – 2012-07-20 14:04:40