我正在使用react-quill 1.3.3。我还允许在帖子中添加图像。quill 现在的工作方式是,它只是将图像转换为字符串并将其全部作为文本发送。问题是这似乎需要大量额外的内存(数据)。例如,对于只有 20K 的图像,我收到 413 错误,“413(有效负载太大)”等。真正的方法是将图像转换为链接并将图像保存到云服务。我已经有用于保存头像图像的云服务,因此可以复制。问题是,我们如何让 react-quill 做到这一点?Quill 似乎是一个将图像转换为文本的一站式商店,所以我们将不得不做一些特殊的编码,我不知道该怎么做。
这是羽毛笔组件:
import React from 'react'
export default class PostEditor extends React.Component {
constructor(props) {
super(props)
this.state = { editorHtml: '', theme: 'snow' }
this.handleChange = this.handleChange.bind(this)
if (typeof window !== 'undefined') {
this.ReactQuill = require('react-quill');
require('katex');
require('react-quill/dist/quill.snow.css');
}
}
handleChange (value) {
this.props.onChange(value);
}
render() {
const ReactQuill = this.ReactQuill
const { value } = this.props;
if (typeof window !== 'undefined' && ReactQuill) {
return (
<ReactQuill
onChange={this.handleChange}
theme="snow"
value={value}
modules={PostEditor.modules}
/>
)
} else {
return <textarea />;
}
}
}
PostEditor.modules = {
toolbar: [
[{ 'header': '1'}, {'header': '2'}, { 'font': [] }],
[{size: []}],
['bold', 'italic', 'underline', 'strike', 'blockquote'],
[{'list': 'ordered'}, {'list': 'bullet'},
{'indent': '-1'}, {'indent': '+1'}],
['link', 'image', 'video','formula'],
['clean']
],
clipboard: {
// toggle to add extra line breaks when pasting HTML:
matchVisual: false,
}
}
PostEditor.formats = [
'header', 'font', 'size',
'bold', 'italic', 'underline', 'strike', 'blockquote',
'list', 'bullet', 'indent',
'link', 'image', 'video', 'formula'
]
// PostEditor.propTypes = {
// placeholder: PropTypes.string,
// }
这是一些类似的工作,但我不知道如何将此代码添加到我的应用程序中。
我所期待的是,我们应该能够使用 quill 工具栏上的“添加图像”按钮,并且所见即所得的工作正常,并且图像是从用户的硬盘驱动器中获取并放置在格式正确的文本中。不同之处在于,当您保存时,图像会发送到您的云存储,并且链接会粘贴到保存的 html 中。当您查看帖子时,该链接会再次扩展为图像。
如果有人知道为什么图像被转换成如此大的尺寸(超过 20MB),请告诉我,因为我也可能只是接受它作为解决方案。
以下是包含 quill 的组件部分的代码:
{this.isActiveField('postText') && (
<Fieldset className="mt2">
<PostEditor
id="postText"
onChange={this.onChange}
value={postText}
/>
<Snackbar
anchorOrigin={{
vertical: 'bottom',
horizontal: 'left',
}}
open={!!ErrorHandling.getFieldErrors(errors, 'postText')}
autoHideDuration={4000}
onClose={this.handleClose}
ContentProps={{
'aria-describedby': 'message-id',
}}
message={<span id="message-id">{ErrorHandling.getFieldErrors(errors, 'postText')}</span>}
action={[
<IconButton
key="close"
aria-label="Close"
color="inherit"
className={classes.close}
onClick={this.handleClose}
>
<CloseIcon />
</IconButton>,
]}
/>
</Fieldset>
)}
编辑:我制定了第二个解决方案。在我的 Apollo 服务器代码中,我按照这里的建议添加了 bodyParser 。它现在似乎工作正常。