Heroku不允许临时下载。如何解决此限制?

时间:2018-12-16 12:49:04

标签: node.js express heroku

每次尝试启动我的应用程序时,我都试图从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等访问它们。

2 个答案:

答案 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)无法正常工作。感谢您的回答。