2012-07-19 47 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