我正在使用
React 构建一个艺术作品应用程序的内容管理系统。客户端将发布到使用Mongoose插入到
MongoDB中的API 。然后,API向数据库查询新插入的图像,并将其返回
给客户端。
这是我使用Mongoose连接到MongoDB的代码:
mongoose.connect('mongodb://localhost/test').then(() =>
console.log('connected to db')).catch(err => console.log(err))
mongoose.Promise = global.Promise
const db = mongoose.connection
db.on('error', console.error.bind(console, 'MongoDB connection error:'))
const Schema = mongoose.Schema;
const ImgSchema = new Schema({
img: { data: Buffer, contentType: String }
})
const Img = mongoose.model('Img', ImgSchema)
我正在使用multer和fs处理图像文件。我的POST端点如下
所示:
router.post('/', upload.single('image'), (req, res) => {
if (!req.file) {
res.send('no file')
} else {
const imgItem = new Img()
imgItem.img.data = fs.readFileSync(req.file.path)
imgItem.contentType = 'image/png'
imgItem
.save()
.then(data =>
Img.findById(data, (err, findImg) => {
console.log(findImg.img)
fs.writeFileSync('api/uploads/image.png', findImg.img.data)
res.sendFile(__dirname + '/uploads/image.png')
}))
}
})
我可以在文件结构中看到writeFileSync正在将映像写入
磁盘。res.sendFile抓取它并将其发送给客户端。
客户端代码如下所示:
handleSubmit = e => {
e.preventDefault()
const img = new FormData()
img.append('image', this.state.file, this.state.file.name)
axios
.post('http://localhost:8000/api/gallery', img, {
onUploadProgress: progressEvent => {
console.log(progressEvent.loaded / progressEvent.total)
}
})
.then(res => {
console.log('responsed')
console.log(res)
const returnedFile = new File([res.data], 'image.png', { type: 'image/png' })
const reader = new FileReader()
reader.onloadend = () => {
this.setState({ returnedFile, returned: reader.result })
}
reader.readAsDataURL(returnedFile)
})
.catch(err => console.log(err))
}
这样确实可以将返回的文件和img数据url都置于状态。但是,在我的应用程序中,图像始终显示为损坏。
避免发送回base64编码的图像(多个图像+大文件+
大编码字符串=非常慢的性能)。我强烈建议创建
一个微服务,该微服务仅处理图像上传和任何其他与图像相关的
获取/发布/放置/删除请求。将其与主应用程序分开。
例如:
http://localhost:4000/uploads/timestamp-randomstring-originalname.fileext
简单来说,我的微服务就像CDN一样,仅用于图像。
For example, a user sends a post request to
http://localhost:4000/api/avatar/create
with some FormData:
It first passes through some Express middlewares:
libs/middlewares.js
...
app.use(cors({credentials: true, origin: "http://localhost:3000" })) // allows receiving of cookies from front-end
app.use(morgan(`tiny`)); // logging framework
app.use(multer({
limits: {
fileSize: 10240000,
files: 1,
fields: 1
},
fileFilter: (req, file, next) => {
if (!/\.(jpe?g|png|gif|bmp)$/i.test(file.originalname)) {
req.err = `That file extension is not accepted!`
next(null, false)
}
next(null, true);
}
}).single(`file`))
app.use(bodyParser.json()); // parses header requests (req.body)
app.use(bodyParser.urlencoded({ limit: `10mb`, extended: true })); // allows objects and arrays to be URL-encoded
...etc
Then, hits the avatars
route:
routes/avatars.js
app.post(`/api/avatar/create`, requireAuth, saveImage, create);
It then passes through some user authentication, then goes through my
saveImage
middleware:
services/saveImage.js
const createRandomString = require('../shared/helpers');
const fs = require("fs");
const sharp = require("sharp");
const randomString = createRandomString();
if (req.err || !req.file) {
return res.status(500).json({ err: req.err || `Unable to locate the requested file to be saved` })
next();
}
const filename = `${Date.now()}-${randomString}-${req.file.originalname}`;
const filepath = `uploads/${filename}`;
const setFilePath = () => { req.file.path = filepath; return next();}
(/\.(gif|bmp)$/i.test(req.file.originalname))
? fs.writeFile(filepath, req.file.buffer, (err) => {
if (err) {
return res.status(500).json({ err: `There was a problem saving the image.`});
next();
}
setFilePath();
})
: sharp(req.file.buffer).resize(256, 256).max().withoutEnlargement().toFile(filepath).then(() => setFilePath())
If the file is saved, it then sends a req.file.path
to my create
controller. This gets saved to my DB as a file path and as an image path (the
avatarFilePath
or /uploads/imagefile.ext
is saved for removal purposes and
the avatarURL
or [http://localhost:4000]/uploads/imagefile.ext
is saved
and used for the front-end GET request):
controllers/avatars.js (I’m using Postgres, but you can substitute for
Mongo)
create: async (req, res, done) => {
try {
const avatarurl = `${apiURL}/${req.file.path}`;
await db.result("INSERT INTO avatars(userid, avatarURL, avatarFilePath) VALUES ($1, $2, $3)", [req.session.id, avatarurl, req.file.path]);
res.status(201).json({ avatarurl });
} catch (err) { return res.status(500).json({ err: err.toString() }); done();
}
Then when the front-end tries to access the uploads
folder via <img src={avatarURL} alt="image" />
or <img src="[http://localhost:4000]/uploads/imagefile.ext" alt="image" />
, it gets
served up by the microservice:
libs/server.js
const express = require("express");
const path = app.get("path");
const PORT = 4000;
//============================================================//
// EXPRESS SERVE AVATAR IMAGES
//============================================================//
app.use(`/uploads`, express.static(`uploads`));
//============================================================//
/* CREATE EXPRESS SERVER */
//============================================================//
app.listen(PORT);
What it looks when logging requests:
19:17:54 INSERT INTO avatars(userid, avatarURL, avatarFilePath) VALUES ('08861626-b6d0-11e8-9047-672b670fe126', 'http://localhost:4000/uploads/1536891474536-k9c7OdimjEWYXbjTIs9J4S3lh2ldrzV8-android.png', 'uploads/1536891474536-k9c7OdimjEWYXbjTIs9J4S3lh2ldrzV8-android.png')
POST /api/avatar/create 201 109 - 61.614 ms
GET /uploads/1536891474536-k9c7OdimjEWYXbjTIs9J4S3lh2ldrzV8-android.png 200 3027 - 3.877 ms
我正在开发一个Spring3.2.7应用程序,它将存储在数据库中的签名作为base64字符串通过spring控制器发送回用户浏览器,该控制器输出字节数组responseEntity。 下面是我的代码,这显然是工作之前,所以也许有一些配置变化,可能会导致这一点? 该图像正在浏览器中呈现,如下所示: 我没有更改这个类,我被告知它确实有效,我能够从两个字节数组创建图像,它们都很好,看起来是一样的,我能够
问题内容: 看了关于SO的其他帖子,他们没有解决此问题。 我正在尝试从jar文件加载图像。它持续为null。该图像位于以下位置: 要加载我正在执行的图像: url为null,bImg也为null。 我已经检查过了,不必担心区分大小写。 问题答案: 试试这个 :
问题内容: 我已经创建了一个表,其中已通过“ BLOB”保存了图像。我需要将这些图像与其他项目一起显示。但是我不知道如何在同一页面中一起显示这些图像。这是我的php代码,以表格形式显示其他内容。同样,我想相应地显示图像。有什么帮助吗? 问题答案: 正如其他人所提到的,将图像存储在数据库中通常不是一个好主意。 图像不会与另一个页面数据以相同的响应传输。 要显示数据库中的图像,您需要实现一个脚本,给定
这里有很多类似的话题和问题,我将遵循这些。但我有一个错误。 我的代码 在遵循教程之后,我将代码更改为 在矩阵中设置旋转。无法解决setRotate 我在 应用程序崩溃。 LogCat错误 这是236号线
问题内容: 我以前使用过媒体播放器,但从未遇到过此问题。每当我尝试使用MediaPlayer.create()时,该方法都会使我为null,并且无法播放声音。有什么我想念的吗? 我的sound.mp3在我的原始文件夹中,通过将声音拖到eclipse中的文件夹中,我将其放置在其中。请帮忙,因为我以前玩过声音,所以这真的困扰我:( 问题答案: 如果create() API由于某种原因失败,则返回nul
问题内容: 尽管是有效的类,但以下代码会打印。 文档说方法返回 由 aClassName 命名的类对象,或者如果当前没有加载该名称的类。如果 aClassName 为,则返回。 我也试图获得当前的viewcontroller已加载但仍然得到 可能是什么问题? 更新: 即使尝试这样做,我仍然可以 问题答案: 该函数 确实 适用于(纯和Objective-C派生的)swift类,但是仅当您使用全限定名