英文:
When I upload image as base64 in post request I get error 403
问题
I've translated the code-related part of your text. Here it is:
当我尝试使用带有POST请求的表单将图像上传到后端时,我收到了403错误。我尝试将X-CSRFToken和"Accept": "application/json"添加到标头中,但一点帮助也没有。我尝试从本地存储中保存的名称向postBody添加所有者,但不知道我犯了什么错误。我使用dj-rest-auth进行身份验证。
前端有一个fetch功能:
export async function action({ request }) {
const data = await request.formData();
// const file = fileToBase64(data.get('file'))
console.log(data)
const postData = {
title: data.get('title'),
image: data.get('base64File'),
};
console.log(postData)
const response = await fetch('http://127.0.0.1:8000/posts', {
method: 'POST',
headers: {
"Content-Type": "application/json"
},
body: JSON.stringify(postData),
});
if (response.status === 422 || response.status === 401) {
return response;
}
if (!response.ok) {
throw json({ message: 'Could not add image.' }, { status: 500 });
}
const resData = await response.json();
console.log(resData)
return redirect('/');
}
Please note that I've retained the code formatting in the translation. If you have further code-related questions or need translations for other parts of your text, please feel free to ask.
英文:
When I try to upload an image to the backend using a form with post request, I get a 403 error. I tried adding X-CSRFToken and "Accept": "application/json" to the headers, it didn't help at all. I tried to add the owner to the postBody from the name that I was saving to the localstorage
I don't know where I made a mistake. I use dj-rest-auth for authentication
There is fetch function from frontend:
export async function action({ request }) {
const data = await request.formData();
// const file = fileToBase64(data.get('file'))
console.log(data)
const postData = {
title: data.get('title'),
image: data.get('base64File'),
};
console.log(postData)
const response = await fetch('http://127.0.0.1:8000/posts', {
method: 'POST',
headers: {
"Content-Type": "application/json"
},
body: JSON.stringify(postData),
});
if (response.status === 422 || response.status === 401) {
return response;
}
if (!response.ok) {
throw json({ message: 'Could not add image.' }, { status: 500 });
}
const resData = await response.json();
console.log(resData)
return redirect('/');
}
There is backend serializer:
class PostsSerializer(serializers.HyperlinkedModelSerializer):
title = serializers.CharField(max_length=60, )
owner = serializers.ReadOnlyField(source='owner.username')
# creator_id = UserSerializer(many=False, read_only=True).data
favorites = serializers.HyperlinkedRelatedField(many=True, read_only=True, view_name='favorite-detail')
comments = serializers.HyperlinkedRelatedField(many=True, read_only=True, view_name='comment-detail')
class Meta:
model = Post
fields = ['pk', 'url', 'title', 'owner', 'image', 'created_at', 'favorites', 'comments']
And view:
class PostList(generics.ListCreateAPIView):
permission_classes = [permissions.IsAuthenticatedOrReadOnly, IsCurrentUserOwnerOrReadOnly]
queryset = Post.objects.all()
serializer_class = PostsSerializer
ordering_fields = ['created_at', 'favorites']
filter_fields = ['title']
search_fields = ['title']
name = 'post-list'
def perform_create(self, serializer):
serializer.save(owner=self.request.user)
If you need the full code here is a link to the repository: https://github.com/Cichyy22/imagur-like-site
答案1
得分: 0
在你的表单中包括一个类型为 "file" 的输入字段,以允许用户选择要上传的图像文件。
<form action="/upload" method="post" enctype="multipart/form-data">
<input type="file" name="image">
<input type="submit" value="Upload">
</form>
const express = require('express');
const multer = require('multer');
const app = express();
// 配置 multer 以将上传的文件存储在 "uploads" 目录中
const upload = multer({ dest: 'uploads/' });
// 处理上传图像的 POST 请求
app.post('/upload', upload.single('image'), (req, res) => {
const image = req.file;
// 处理已上传的图像文件
res.send('图像上传成功');
});
英文:
Include an input field of type "file" in your form to allow the user to select an image file to upload.
<form action="/upload" method="post" enctype="multipart/form-data">
<input type="file" name="image">
<input type="submit" value="Upload">
</form>
const express = require('express');
const multer = require('multer');
const app = express();
// Configure multer to store uploaded files in the "uploads" directory
const upload = multer({ dest: 'uploads/' });
// Handle the POST request to upload an image
app.post('/upload', upload.single('image'), (req, res) => {
const image = req.file;
// Do something with the uploaded image file
res.send('Image uploaded successfully');
});
答案2
得分: 0
I solved the problem by editing the request:
export async function action({ request }) {
const data = await request.formData();
// const file = fileToBase64(data.get('file'))
console.log(data)
const postData = {
title: data.get('title'),
image: data.get('base64File')
};
console.log(postData)
const response = await fetch('http://127.0.0.1:8000/posts', {
method: 'POST',
headers: {
'Authorization': 'Token ' + localStorage.getItem('token'),
"X-CSRFToken": Cookies.get('csrftoken'),
"Accept": "application/json",
"Content-Type": "application/json"
},
body: JSON.stringify(postData),
});
if (response.status === 422 || response.status === 401) {
return response;
}
if (!response ok) {
throw json({ message: 'Could not add image.' }, { status: 500 });
}
const resData = await response.json();
console.log(resData)
return redirect('/');
}
And by editing the settings file on the backend:
REST_FRAMEWORK = {
'DEFAULT_FILTER_BACKENDS': (
'django_filters.rest_framework.DjangoFilterBackend',
'rest_framework.filters.OrderingFilter',
'rest_framework.filters.SearchFilter',
),
'DEFAULT_AUTHENTICATION_CLASSES': (
'rest_framework.authentication.TokenAuthentication',
'rest_framework.authentication.SessionAuthentication',
)
}
REST_USE_JWT = True
JWT_AUTH_COOKIE_USE_CSRF = True
英文:
I solved the problem by editing the request:
export async function action({ request }) {
const data = await request.formData();
// const file = fileToBase64(data.get('file'))
console.log(data)
const postData = {
title: data.get('title'),
image: data.get('base64File')
};
console.log(postData)
const response = await fetch('http://127.0.0.1:8000/posts', {
method: 'POST',
headers: {
'Authorization': 'Token ' + localStorage.getItem('token'),
"X-CSRFToken": Cookies.get('csrftoken'),
"Accept": "application/json",
"Content-Type": "application/json"
},
body: JSON.stringify(postData),
});
if (response.status === 422 || response.status === 401) {
return response;
}
if (!response.ok) {
throw json({ message: 'Could not add image.' }, { status: 500 });
}
const resData = await response.json();
console.log(resData)
return redirect('/');
}
And by editing the settings file on the backend:
REST_FRAMEWORK = {
'DEFAULT_FILTER_BACKENDS': (
'django_filters.rest_framework.DjangoFilterBackend',
'rest_framework.filters.OrderingFilter',
'rest_framework.filters.SearchFilter',
),
'DEFAULT_AUTHENTICATION_CLASSES': (
'rest_framework.authentication.TokenAuthentication',
'rest_framework.authentication.SessionAuthentication',
)
}
REST_USE_JWT = True
JWT_AUTH_COOKIE_USE_CSRF = True
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论