为什么我的图像文件被转换为字符串?
Why is my image file being converted to a string?
编辑,原问题已解决,为什么文件被转换为字符串。代码已被编辑以反映这些更正。 API 处理程序现在输出 object 作为数据类型和缓冲区作为 request.payload.file.
的值
我正在使用 Aurelia 制作单页应用程序。有一个 HTML 表单接受两个输入字段,一个用于文件,一个用于文本。这些字段绑定到关联的 TypeScript 视图模型中的变量(selectdImage 和 title)。在视图模型中,它们被用作函数中的参数,该函数将它们附加到 formData 并将带有 formData 的 http post 请求发送到 Node/js Hapi 框架 API 处理程序。
当我在 Aurelia 应用程序中 console.log(typeof(selectedImage) 时,它显示 object,但是当我在处理程序中控制日志 typeOf(selecetdImage) 时,我得到了字符串。我是猜测这就是为什么我的功能无法正常工作并给出 500 条错误消息
处理程序本身可以工作。我在基于 MVC 服务器的 Web 应用程序中使用了它。在这种情况下,HTML 表单触发 post 请求,MVC 处理程序成功接收文件,将其写入 local/temp.img 并将其上传到 cloudinary。
但是对于 API 版本,我如上所述自己组装了表单数据,文件没有写入 local/temp.img 并且云上传失败。
编辑。
我将视图模型变量更改为
标题=空;
文件=空;
并且我将 formData 附加函数更改为:
formData.append('file', 文件, 文件[0]);
按照此处的示例。下面的代码现已修改以匹配此更新。
现在,当我在 API 处理程序中控制台记录文件的值时,输出是:
<Buffer ff d8 ff e0 00 10.......
我不确定如何处理这些数据。我假设它是八进制的图像二进制数据?如果是这样,有谁知道如何将它写成节点中的图像?
负载不再是字符串类型,现在是 object.
类型
<form submit.delegate="uploadPhoto()" enctype="multipart/form-data">
<div class="two fields">
<div class="field">
<label>File</label>
<input type="file" name="file" accept="image/png, image/jpeg" files.bind="files">
</div>
<div class="field">
<label>Title</label> <input value.bind="title">
</div>
</div>
<button type="submit"> Upload </button>
</form>
//photoUpload.ts// (view model associated with above html
@inject(POIService)
export class PhotoForm {
@bindable
photos: Photo[];
title = null;
files = null;
constructor (private poi: POIService) {}
uploadPhoto() {
const result = this.poi.uploadPhoto(this.title, this.files);
console.log(this.title);
console.log(result);
}
//POIService (where contains injected function to create HTTP request
async uploadPhoto(title: string, files){
console.log("now uploading photo for: " + this.currentLocation)
let formData = new FormData();
formData.append("title", title);
formData.append("location", this.currentLocation); //don't worry about this variable, it's set by another function every time a page is viewed
formData.append("file", files[0]);
const response = await this.httpClient.post('/api/locations/' + this.currentLocation + '/photos', formData);
console.log(response);
}
//API Handler (accepts HTTP request, writes the image to a local folder, the uploads to cloudinary and returns the url and photo_id which are stored in a Mongod document
create: {
auth: false,
handler: async function(request, h) {
const photo = request.payload.file;
await writeFile('./public/temp.img', photo);
const result = await cloudinary.v2.uploader.upload('./public/temp.img', function(error, result) {
console.log(result)
});
const newPhoto = new Photo({
title: request.payload.title,
url: result.url,
public_id: result.public_id,
location: request.params.name
})
await newPhoto.save();
return newPhoto;
}
},
是否是一个很长的字符串,前15个左右的字符包含"data:b64"?如果是这样,那就意味着它是 base64 数据。
编辑,原问题已解决,为什么文件被转换为字符串。代码已被编辑以反映这些更正。 API 处理程序现在输出 object 作为数据类型和缓冲区作为 request.payload.file.
的值我正在使用 Aurelia 制作单页应用程序。有一个 HTML 表单接受两个输入字段,一个用于文件,一个用于文本。这些字段绑定到关联的 TypeScript 视图模型中的变量(selectdImage 和 title)。在视图模型中,它们被用作函数中的参数,该函数将它们附加到 formData 并将带有 formData 的 http post 请求发送到 Node/js Hapi 框架 API 处理程序。
当我在 Aurelia 应用程序中 console.log(typeof(selectedImage) 时,它显示 object,但是当我在处理程序中控制日志 typeOf(selecetdImage) 时,我得到了字符串。我是猜测这就是为什么我的功能无法正常工作并给出 500 条错误消息
处理程序本身可以工作。我在基于 MVC 服务器的 Web 应用程序中使用了它。在这种情况下,HTML 表单触发 post 请求,MVC 处理程序成功接收文件,将其写入 local/temp.img 并将其上传到 cloudinary。 但是对于 API 版本,我如上所述自己组装了表单数据,文件没有写入 local/temp.img 并且云上传失败。
编辑。 我将视图模型变量更改为 标题=空; 文件=空;
并且我将 formData 附加函数更改为:
formData.append('file', 文件, 文件[0]);
按照此处的示例。下面的代码现已修改以匹配此更新。
现在,当我在 API 处理程序中控制台记录文件的值时,输出是:
<Buffer ff d8 ff e0 00 10.......
我不确定如何处理这些数据。我假设它是八进制的图像二进制数据?如果是这样,有谁知道如何将它写成节点中的图像? 负载不再是字符串类型,现在是 object.
类型 <form submit.delegate="uploadPhoto()" enctype="multipart/form-data">
<div class="two fields">
<div class="field">
<label>File</label>
<input type="file" name="file" accept="image/png, image/jpeg" files.bind="files">
</div>
<div class="field">
<label>Title</label> <input value.bind="title">
</div>
</div>
<button type="submit"> Upload </button>
</form>
//photoUpload.ts// (view model associated with above html
@inject(POIService)
export class PhotoForm {
@bindable
photos: Photo[];
title = null;
files = null;
constructor (private poi: POIService) {}
uploadPhoto() {
const result = this.poi.uploadPhoto(this.title, this.files);
console.log(this.title);
console.log(result);
}
//POIService (where contains injected function to create HTTP request
async uploadPhoto(title: string, files){
console.log("now uploading photo for: " + this.currentLocation)
let formData = new FormData();
formData.append("title", title);
formData.append("location", this.currentLocation); //don't worry about this variable, it's set by another function every time a page is viewed
formData.append("file", files[0]);
const response = await this.httpClient.post('/api/locations/' + this.currentLocation + '/photos', formData);
console.log(response);
}
//API Handler (accepts HTTP request, writes the image to a local folder, the uploads to cloudinary and returns the url and photo_id which are stored in a Mongod document
create: {
auth: false,
handler: async function(request, h) {
const photo = request.payload.file;
await writeFile('./public/temp.img', photo);
const result = await cloudinary.v2.uploader.upload('./public/temp.img', function(error, result) {
console.log(result)
});
const newPhoto = new Photo({
title: request.payload.title,
url: result.url,
public_id: result.public_id,
location: request.params.name
})
await newPhoto.save();
return newPhoto;
}
},
是否是一个很长的字符串,前15个左右的字符包含"data:b64"?如果是这样,那就意味着它是 base64 数据。