我正在尝试在ravenDb中保存附件。我收到文件未找到错误。
MVC查看:
<input type="file" name="file" id="Ids2" style="float:right"/>
通过ajax调用,我将上面控件中选择的文件名的值传递给控制器方法 - 控制器方法又将文件名发送到名为“上传”的自定义方法
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并单击了Add按钮,该按钮在视图上保存了大量其他字段,并从文件上传控件中获取文件名/路径。
我在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);
}
});
};
答案 0 :(得分:1)
取决于浏览器html文件控件不存储文件的完整路径。如果您使用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将具有类似FileName的内容,并且还会在输入流中包含该文件。