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…line 上遇到错误

找不到文件"C:\Program Files(x86)\Common Files\Microsoft Shared\DevServer\10.0\Doc1.txt"。

如果我手动将Doc1.txt文件移动到上面的位置,ravenDB会保存附件,我可以从localhost:8080/static/upload/keyvalue 中看到它

我如何让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);
    }
 });
 };

根据浏览器的不同,html文件控件不会存储文件的完整路径。如果您使用Chrome并调试脚本

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

将返回类似C:\fakepath\yourfile.txt的内容。其中,与IE一样,返回完整路径。

此外,在Ajax中,您不推送文件的字节数,而只推送文件名,这意味着除非您只在Web服务器上的浏览器中运行此网站,否则文件与Web服务器位于同一位置的可能性很小。

如果你试图通过ajax将文件上传到MVC控制器,我建议你上传。

            $("#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将具有类似FileName的东西,并且还将在输入流中具有该文件。

相关内容

  • 没有找到相关文章

最新更新