将文本文件上传到heroku

时间:2017-03-21 13:18:58

标签: javascript html node.js heroku

如何将文本文件上传到heroku上托管的网站?

我知道这个问题已经以各种形式提出,但我正在寻找具体情况,所以我为下面的所有代码垃圾邮件道歉。

所以我有一个我在云端9上玩过的网站(我很快就会发现网络开发)。我有一个程序在某些输入上运行kruskels算法以找到最小生成树。我在学校时用java编写了这个程序,并将它合并到我的Node.js驱动的网站中。

java程序采用" input.txt",做它的事情,然后输出到" output.txt"。它在c9上运行良好。我可以上传一个文件,其中包含我将在下面链接的代码,在我的HTML中捕获(?),将其发布到同一页面。这通过覆盖当前的文本文件来工作。而且我相信这是heroku的关键点。

当我部署到Heroku时,这显然不起作用。当我在阅读有关堆栈溢出或一般解决方案的问题时,我发现由于临时文件系统,文本文件将在重置时恢复为原始文件。我认为这样可以,因为我只需要足够长的文件来从我的java程序输入/输出它们。但是,我发现虽然input.txt确实会根据需要进行更新,但只要我将该输入重新传输回同一页面,它就会消失并恢复原状。

在线阅读建议使用S3 ...我开始这样做,直到他们要求提供信用卡而无法限制我的数据...作为一名新手开发者,我拒绝承担1000美元以上1000美元的风险我会可能会。

我现在已经下载了cloudinary。但我觉得我读过的大部分内容都只是谜题的一部分,因为它似乎主要集中在图像上。我输了,我不得不相信这是一个疯狂的常见情况,我只是忽略或不幸在谷歌搜索找到错误的信息。有人建议如何做这个非常简单的场景,我需要更新文本文件。我将链接下面的代码。

这是我的HTML:

<form ref="uploadForm" id="uploadForm" action="/kruskelPost" method="post" encType="multipart/form-data">
<input type="file" name="myFile" />
<input type='submit' value="Upload!"/></form> 

我不熟悉发布代码,如果这不正确的话。我一次复制这一行...

这是我在app.js上的node.js(它在c9上工作时的样子):

app.post("/kruskelPost", function(req, res) {

if (!req.files) return res.status(400).send('No files were uploaded.');

locals.input = true; // jsut booleans to manage what is shown when...not too important.

req.files.myFile.mv( "src/input.txt", function(err) {

 if (err) return res.status(500).send(err);
locals.ups = false; // this is just to let /kruskel page know not to display a outputfile (until I run the program, because this would display the old output.txt)
});
res.redirect("/kruskel");
});

这是它在html中显示在原始页面上的方式:

<span style="white-space:pre"><% if (locals.input == true) { %><% include ./../src/input.txt %><% }  %></span>

这就是我尝试用cloudinary做的事情:

    app.post("/kruskelPost", function(req, res) {

    cloudinary.v2.uploader.upload(req.files.myFile.name, 
    { resource_type: "auto" }, 
    function(error, result) {console.log(result); });

很明显我不知道如何处理第一个参数。我甚至不知道如何命名文件或如何指向最近上传的文件......无论如何。我明显迷失了,所有我需要的是这最后一个大问题,它让我疯狂。任何有关如何处理这种情况的帮助将不胜感激。我可以链接我的heroku页面,但我不确定是否允许(如果它更容易看到它)。

3 个答案:

答案 0 :(得分:0)

你有一个非常具体的案例,但我会尝试以最好的方式回答。

我建议你添加一个数据库(postgress,免费)到你的heroku应用程序。然后将文本保存在数据库中而不是文本文件中。并从那里与它一起工作。

heroku的工作方式,特别是如果您免费使用它,它会在每次dynos重启时重置服务器中的所有文件。这就是为什么你不能在heroku中存储动态文件。

更新:以下是如何将postgres数据库配置到heroku-nodejs https://devcenter.heroku.com/articles/heroku-postgresql#connecting-in-node-js

答案 1 :(得分:0)

Heroku文件系统不仅仅是短暂的,它是不可变的,这意味着你无法将任何写入文件系统。如果您只需要处理结果,则可以上传文件,阅读文件,然后回复处理结果。这不需要您将文件存储在任何地方。如果你真的不需要在任何地方保持文件更改,这是一个更好的解决方案。

答案 2 :(得分:0)

app.post("/kruskelPost", function(req, res) {

inputString   = req.files.myFile.data.toString();
locals.inputStringData = inputString;

res.redirect("/kruskel");
});

//这是我实际发布信息的时候

var locals     = { ups: false, input:false, nodes: [], inputStringData: "nothing uploaded yet", outputStringData: "nothing uploaded yet"};

//只是我可以在路由页面之间发送的本地变量

//然后这个荒谬的长期解决方法

 function myFunc() {


     var stream = fs.createWriteStream("./src/input.txt");

    stream.once('open', function(fd) {
         stream.write( locals.inputStringData );
         stream.end();
    });

    // now to actually run the java program
    child = exec('java -cp src Proj3',
      function (error, stdout, stderr) {

          console.log("kruskel algorithm run");
        // console.log('stdout: ' + stdout);
        // console.log('stderr: ' + stderr);
        if (error !== null) {
          console.log('exec error: ' + error);
        }

       locals.outputStringData = "";

        //workaround printing output to a string variable so it survives the ephemeral file system of heroku
        var fileName = "./src/output.ejs";

        fs.exists(fileName, function(exists) {
          if (exists) {
            fs.stat(fileName, function(error, stats) {
              fs.open(fileName, "r", function(error, fd) {
                var buffer = new Buffer(stats.size);

                fs.read(fd, buffer, 0, buffer.length, null, function(error, bytesRead, buffer) {
                 locals.outputStringData = buffer.toString("utf8", 0, buffer.length);

                  fs.close(fd);
                });
              });
            });
          }
        }); 
    });

}

//只是为了看看,当有人按下按钮运行时会发生什么

app.get("/kruskelRun", function(req, res) {
myFunc();
locals.ups = true;
setTimeout(function (){

    res.redirect("kruskel");
}, 1000);

});
相关问题