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

Dam*_*les 3 haskell file-upload yesod angularjs

在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
    });
    ...
    };
Run Code Online (Sandbox Code Playgroud)

在服务器端,我收到如下数据:

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
Run Code Online (Sandbox Code Playgroud)

但是,这会导致服务器错误

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
Run Code Online (Sandbox Code Playgroud)

如果我不尝试保存数据,则接收文件信息,我可以在服务器上看到文件名.

我已成功设法使用Yesod表单上传文件,但是当谈到自定义表单时,我到目前为止所有尝试都失败了.

任何帮助是极大的赞赏.

谢谢.

Mic*_*man 7

dest = dest </> filename
Run Code Online (Sandbox Code Playgroud)

这是你的无限循环的来源:你说"dest被定义为自己加上文件名".发生了什么事情,你正在影响原来的声明dest.一个简单的解决方案是将第二个声明称为dest'(或者更好,更有用的东西).