Angularjs 使用输入表单将数据上载到Yesod服务器
在Yesod中,通过自定义输入表单上传文件的正确方法是什么 我用AngularJS开发了一个前端,并通过JSON对象向服务器传递数据。但是,这在上载文件时不起作用。为此,我诉诸形式 收集不同的资源,我最终得到了以下代码。在客户端,我使用以下功能:Angularjs 使用输入表单将数据上载到Yesod服务器,angularjs,haskell,file-upload,yesod,Angularjs,Haskell,File Upload,Yesod,在Yesod中,通过自定义输入表单上传文件的正确方法是什么 我用AngularJS开发了一个前端,并通过JSON对象向服务器传递数据。但是,这在上载文件时不起作用。为此,我诉诸形式 收集不同的资源,我最终得到了以下代码。在客户端,我使用以下功能: this.submitNewMeas = function() { var selected_file = document.getElementById('measurements').files[0]; var fd = new F
this.submitNewMeas = function() {
var selected_file = document.getElementById('measurements').files[0];
var fd = new FormData();
fd.append("measurementsFile", selected_file);
var response = $http({
method: 'POST',
url: '/measurements/'+this.currMedia.id,
headers: {
'Content-Type': 'multipart/form-data'
},
data: {
fd
},
transformRequest: formDataObject
});
...
};
在服务器端,我接收如下数据:
postMeasurementsR :: MediaId -> Handler Value
postMeasurementsR mediaId = do
result <- runInputPost $ iopt fileField "measurementsFile"
case result of
Just fileInfo -> do
saveMeas fileInfo "measDir"
saveMeas :: FileInfo -> FilePath -> HandlerT App IO (FilePath)
saveMeas file dest = do
let filename = unpack $ fileName file
dest = dest </> filename
liftIO $ fileMove file dest
return filename
postmasurentsr::MediaId->Handler值
后测量SR mediaId=do
结果如何
saveMeas文件信息“measDir”
saveMeas::FileInfo->FilePath->HandlerT应用程序IO(FilePath)
saveMeas file dest=do
让filename=解包$filename文件
dest=dest文件名
liftIO$fileMove file dest
返回文件名
但是,这会导致服务器错误
20/Nov/2014:13:40:15 +0100 [Error#yesod-core] <<loop>> @(yesod-core-1.4.3:Yesod.Core.Class.Yesod ./Yesod/Core/Class/Yesod.hs:502:5)
Status: 500 Internal Server Error 54.70131s
20/Nov/2014:13:40:15+0100[错误#yesod core]@(yessod-core-1.4.3:yessod.core.Class.yessod./yessod/core/Class/yessod.hs:502:5)
状态:500内部服务器错误54.70131s
如果我不尝试保存数据,则会收到文件信息,并且我能够在服务器上看到文件名
我已经成功地使用YesSOD表单上传了文件,但是当涉及到自定义表单时,到目前为止我所有的尝试都失败了
非常感谢您的帮助
谢谢。dest=dest文件名
dest = dest </> filename
这就是无限循环的来源:你说的是“dest被定义为自身加上文件名”。发生的事情是你隐藏了
dest
的原始声明。一个简单的解决方案是调用第二个声明,类似于dest'
(或者更好的是,调用信息更丰富的声明)。这告诉我需要休息一下。真不敢相信我竟然忽视了这一点!谢谢你,迈克尔。