这里没有经验的开发人员。这个问题快把我逼疯了。
我正在通过 graphQL 突变从反应前端将图像文件发送到运行 express-graphql 的节点服务器。uploadFile 突变工作正常,我可以将文件本地保存在服务器上。
我想将此文件上传到 imagekit.io,返回 url,然后将 url 作为 graqhQL 突变的返回发送给客户端。我正在使用 imagekit npm 包,并且我已经按照 api 文档中的说明进行了配置.
最终,我宁愿将文件直接流式传输到 imagekit 而不将其保存到服务器,但我仍在研究这是否可能(建议赞赏),但这不是主要问题。
图像通过 imagekit.upload() 发送到 imagekit,返回消息表明它已成功保存,但是无论文件类型如何(尝试 jpg、png、webp),文件类型都是“非图像”。
本地保存到节点服务器的图像(据我所知)与从客户端发送的图像相同。该图像在我的 imagekit 媒体库中也可见,但文件大小不正确(< 100 字节)。这两个观察结果一起让我相信错误的字符串被发送到 imagekit,但我不知道如何正确编码它。
任何人都可以提供的任何指示/帮助将不胜感激。
app.js(服务器)
import schema from './schema'
...
app.use('/graphql',
graphqlUploadExpress({ maxFileSize: 10000000, maxFiles: 10 }),
graphqlHTTP({
schema,
graphiql: true
})
)
...
schema.js
import {GraphQLUpload} from 'graphql-upload'
...
const Mutation = new GraphQLObjectType({
name: 'Mutation',
fields: {
uploadFile:{
description: 'Uploads a file',
type: GraphQLString,
args: {
file: {type: new GraphQLNonNull(GraphQLUpload)},
},
async resolve(parent, {file}){
const { filename, mimetype, createReadStream } = await file
await new Promise(res =>
createReadStream()
.pipe(createWriteStream(path.join(__dirname, "./", filename), {encoding:'base64'}))
.on("close", res)
).then (
imagekit.upload({
file : path.join(__dirname, "./", filename), //required
fileName : filename, //required
}, function(error, result) {
if(error)
console.log(error)
else {
filesArray.push(filename)
console.log(result)
}
}
)
)
return 'Promise that returns the url'
}
},
来自 imagekit.upload() 的响应:
{
filePath: '/default-image_ANV6NYo5o.jpg',
size: 36,
fileId: '5db1ccc9e954fe57f4c791c9',
url: 'https://ik.imagekit.io/<My imagekit ID here>/default-image_ANV6NYo5o.jpg',
name: 'default-image_ANV6NYo5o.jpg',
fileType: 'non-image'
}