Does anybody know how to realize uploading files in parse-server 6.0.0 ?
Where I can read about it?
The parse-server docs is a hell for beginners!
Do you have a specific problem? What client platform are you using? What have you tried so far? Please help the community help you
To get you started: hereās the JavaScript File docs, which I found very approachable.
Thanks.
Iāve read this guide as well as others but in my opinion there is critically little information in these documents:
Soā¦
For example, when I try to follow guidesā examples and try to upload a file (via Parse Dashboard GraphQL API Console) I receive an error:
āupload.arrayBuffer is not a functionā. Where can I find an answer - why?
Unfortunately not.
This is my topic and it is open for me yet.
Iāve sent another question at that topic and can gladly re-post it here:
Soā¦
Iāve tried to use information from examples: GitHub - jaydenseric/graphql-multipart-request-spec: A spec for GraphQL multipart form requests (file uploads).
but with zero result (
For example, I have a question:
Is this example correct and it has to work?
But I have error: {āerrorā:āUnexpected token - in JSON at position 0ā}
Why?
Here is how to upload a file image via JS SDK,
Frontend:
Parse.initialize(process.env.NEXT_PUBLIC_APP_ID);
Parse.serverURL = `${process.env.NEXT_PUBLIC_SERVER_URL}/parse`;
const newImage = new Parse.File("image.png", { base64: //base 64 string | you can get it from canvas.toDataURL(ctx) });
await newImage.save();
const response = await Parse.Cloud.run("uploadProfileImage", {
url: newImage.url(),
});
Server:
Parse.Cloud.define("uploadProfileImage", async (req) => {
const { url } = req.params;
try {
const user = await new Parse.Query(Parse.User)
.equalTo("objectId", req.user.id)
.first({useMasterKey:true});
if (user) {
user.set("img", url);
}
await user.save(null, {useMasterKey:true});
return {sts: true, msg: "image uploaded"}
} catch (err) {
throw err;
});
Note that if you want your files to be stored in a bucket like AWS S3 or DO spaces you need to configure the adapted in the server settings.
For videos use:
const newVideo = new Parse.File("video.mp4", { uri: data.vUrl });
await newVideo.save();
Thanks,
Let me try it)
With this approach, any user can modify another usersā profile image as long as they have their userId (or guess it), which could be problematic.
A refactor of this cloud function would be:
Parse.Cloud.define("uploadProfileImage", async (req) => {
const { url } = req.params;
const user = req.user;
user.set("img", url);
await user.save(null, {useMasterKey:true});
return {sts: true, msg: "image uploaded"}
}, {
requireUser: true,
fields: ['url']
});
More preferred you should be able to do it all on the frontend:
Parse.initialize(process.env.NEXT_PUBLIC_APP_ID);
Parse.serverURL = `${process.env.NEXT_PUBLIC_SERVER_URL}/parse`;
const newImage = new Parse.File("image.png", { base64: //base 64 string | you can get it from canvas.toDataURL(ctx) });
await newImage.save();
const user = Parse.User.current();
user.set("img", newImage);
await user.save();
A few more details:
I have this error on my parse server 6.0.0 :
Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client
Does anybody know how to fix it ?
Make sure youāre not calling res.send()
or res.json()
more than once in a single request
UPD
Hi everyone!
I donāt know either it is an issue or feature but:
I need your help!
I might be wrong but check that your input is { base64: // base 64 string }, and not just //base 64 string. I.e. the function accepts an object with a base64 key. So make sure your input is formatted like so.