我正在尝试将附件保存在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的东西,并且还将在输入流中具有该文件。