我们如何在发布请求中接受文件并将其上传到Adonis JS中的mysql?

时间:2019-05-04 04:24:47

标签: adonis.js

我正在创建一个用于上载文档的应用程序。前端是Angular,后端是Adonis JS。我无法了解我们如何使用此框架从发布请求中接受文件并将其上传到MySQL。 我浏览了文档,但那里什么也没有。 有人可以通过简单的代码片段帮助我,重点介绍我们如何实现这一目标吗?

2 个答案:

答案 0 :(得分:1)

您最好的选择是使用Multer,Adonis仅随附bodyParser,它无法处理文件输入。请阅读https://www.npmjs.com/package/multer

答案 1 :(得分:0)

我使用了get-stream,发现它比multer容易得多。这是我的服务器端代码。

const ProfilePic = use("App/Models/ProfilePic");
const getStream = use("get-stream");
const Database = use("Database");


Route.post("/api/profilePic/set", async ({
 request,
 response
}) => {

 try {
  let myUserId = request.get().userId;

  request.multipart.file("pic", {}, async file => {

   const fileContent = await getStream.buffer(file.stream);
   const profilePic = new ProfilePic();
   profilePic.userId = myUserId;
   profilePic.pic = fileContent;

   const isAvailable = await ProfilePic.findBy("userId", myUserId);
   const picSaveResponse = isAvailable ?
    await Database.table("profile_pics")
    .where("userId", "=", myUserId)
    .update({
     pic: fileContent
    }) :
    await profilePic.save();
  });
  await request.multipart.process();
 } catch (err) {
  response.status(200).json({
    message: "Pic Updated !",
    data: null
   }

  });


});

另外,为了完成答案,这就是我从Angular客户端发送请求的方式。

saveProfilePic(reqst) {
    // the request object has userId and pic
    let blob = new Blob([reqst.pic], { type: 'image/png' });
    const file = new File([blob], 'profilePic.png');

    const formData = new FormData();
    formData.append('pic', file, 'profilePic.png');

    const headers = new HttpHeaders();
    headers.append('Content-Type', 'multi-part/form-data');

    const params = new HttpParams()
        .set('userId', reqst.userId);
    // params goes as the third parameter
    return this.httpClient.post(UrlConstants.SAVE_PROFILE_PIC, formData, { params, headers: headers });
}