Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angularjs 使用输入表单将数据上载到Yesod服务器_Angularjs_Haskell_File Upload_Yesod - Fatal编程技术网

Angularjs 使用输入表单将数据上载到Yesod服务器

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

在Yesod中,通过自定义输入表单上传文件的正确方法是什么

我用AngularJS开发了一个前端,并通过JSON对象向服务器传递数据。但是,这在上载文件时不起作用。为此,我诉诸形式

收集不同的资源,我最终得到了以下代码。在客户端,我使用以下功能:

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'
(或者更好的是,调用信息更丰富的声明)。

这告诉我需要休息一下。真不敢相信我竟然忽视了这一点!谢谢你,迈克尔。