每次尝试启动我的应用程序时,我都试图从MongoDB下载图像,这样它可以快速运行,并且图像在应用程序中,但是Heroku崩溃。我该怎么解决?
这是我要使用的代码:
dir = "./public/media/"
function getAllImages() {
Image.find({}, function (err, allImages) {
if (err) {
console.log(err);
} else {
allImages.forEach(file => {
fs.writeFile(dir + file.name, file.img.data, function (err) {
if (err) throw err;
console.log('Sucessfully saved!');
});
});
};
});
我目前有24张图片,总计约10 MB。我将它们用作应用程序中的静态图像。我想通过example.com/media/foo.jpg
等访问它们。
答案 0 :(得分:1)
用户上传的内容无法存储在Heroku的ephemeral filesystem上。每当您的测功机重启(happens frequently(每天至少一次))时,对其所做的任何更改都会丢失。 Heroku建议将上传的文件存储在Amazon S3之类的服务上。
您可以让用户upload files directly from their browsers to S3或使用AWS SDK从后端保存文件。像multer-s3
这样的高级库也可能会有所帮助。
在数据库中存储文件通常不是一个好主意,但是您可以在数据库中的文件中存储一个 pointer 指针。例如,如果文件实际存在,则可以将private fun uploadFile(accessToken: String, fileName: String, fileContent: String) {
Observable.just(Unit)
.subscribeOn(Schedulers.io())
.subscribe({
val httpTransport = NetHttpTransport()
val credential = Credential.Builder(BearerToken.authorizationHeaderAccessMethod())
.build()
credential.accessToken = accessToken
val service = Drive.Builder(httpTransport, JacksonFactory.getDefaultInstance(),
credential)
.setApplicationName("Your App Name")
.build()
val fileMetadata = File()
fileMetadata.name = fileName
val localFile = createFile(fileName, fileContent)
val mediaContent = InputStreamContent("text/plain", localFile);
val file = service.files().create(fileMetadata, mediaContent)
.setFields("id")
.execute()
Log.d(TAG, "File ID: " + file.id)
Observable.interval(10, TimeUnit.SECONDS)
.take(1)
.subscribe {
val callback = object : JsonBatchCallback<Permission>() {
@Throws(IOException::class)
override fun onFailure(e: GoogleJsonError, responseHeaders: HttpHeaders) {
Log.d(TAG, "error: ${e.message}")
}
@Throws(IOException::class)
override fun onSuccess(permission: Permission, responseHeaders: HttpHeaders) {
Log.d(TAG, "Permission ID: ${permission.id}")
}
}
val batch = service.batch()
val userPermission = Permission()
.setType("user")
.setRole("writer")
.setEmailAddress("account_you_want_to_share_with@email.com")
service.permissions().create(file.id, userPermission)
.setFields("id")
.queue(batch, callback)
batch.execute()
}
}) {
Log.d(TAG, "error: ", it)
}
}
private fun createFile(fileName: String, fileContent: String): InputStream? {
try {
val outputStreamWriter = OutputStreamWriter(
application.openFileOutput(fileName, Context.MODE_PRIVATE))
outputStreamWriter.write(fileContent)
outputStreamWriter.close()
return application.openFileInput(fileName)
} catch (e: IOException) {
Log.e(TAG, "File write failed: ", e)
}
return null
}
存储在数据库中。
答案 1 :(得分:0)
我刚刚了解到问题是我使用的文件夹(./public/media)为空,因此heroku(即使git系统中存在该文件夹)也没有创建该文件夹。因此,代码fs.writeFile(dir + file.name, file.img.data, function (err)
无法正常工作。感谢您的回答。