Руби: загруженные файлы внезапно становятся не найденными в течение нескольких часов в героку

1

У меня есть следующий почтовый код для Ruby Sinatra для загрузки файлов изображений:

post "/upload" do 
  File.open("public/uploads/" + params["image"][:filename], "wb") do |f|
    f.write(params["image"][:tempfile].read)
  end
end

И следующие коды Java для загрузки файла изображения в example.com/upload:

private static String boundary;
private static final String LINE_FEED = "\r\n";
private static HttpURLConnection httpConn;
private static OutputStream outputStream;
private static PrintWriter writer;

public static void upload(String requestURL, String fieldName, File
uploadFile) throws IOException {

    boundary = "===" + System.currentTimeMillis() + "===";

    URL url = new URL(requestURL);
    httpConn = (HttpURLConnection) url.openConnection();
    httpConn.setUseCaches(false);
    httpConn.setDoOutput(true);
    httpConn.setDoInput(true);
    httpConn.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + boundary);
    outputStream = httpConn.getOutputStream();
    writer = new PrintWriter(new OutputStreamWriter(outputStream, "UTF-8"), true);

    String fileName = uploadFile.getName();
    writer.append("--" + boundary).append(LINE_FEED);
    writer.append("Content-Disposition: form-data; name=\"" + fieldName + "\"; filename=\"" + fileName + "\"").append(LINE_FEED);
    writer.append("Content-Type: "+ URLConnection.guessContentTypeFromName(fileName)).append(LINE_FEED);
    writer.append("Content-Transfer-Encoding: binary").append(LINE_FEED);
    writer.append(LINE_FEED).flush();

    FileInputStream inputStream = new FileInputStream(uploadFile);
    byte[] buffer = new byte[4096];
    int bytesRead = -1;
    while ((bytesRead = inputStream.read(buffer)) != -1) {
        outputStream.write(buffer, 0, bytesRead);
    }
    outputStream.flush();
    inputStream.close();

    writer.append("--" + boundary + "--").append(LINE_FEED);
    writer.close();
    httpConn.getInputStream();
    httpConn.disconnect();
}

File uploadFile = new File("C:/myimage.png");
upload("http://www.example.com/upload", "image", uploadFile);

И мой сайт размещен в героике.

После вызова upload() файл изображения успешно загружен, и я могу получить к нему доступ в example.com/upload/myimage.png

Но проблема в том, что через несколько часов, когда я проверяю URL-адрес, чтобы увидеть myimage.png, я получил ошибку "Not Found" (ошибка 404 в журналах heroku)

Есть идеи?

Извините за мой плохой английский: |

Теги:
heroku
sinatra

1 ответ

4
Лучший ответ

Вы не должны хранить файлы в локальной файловой системе heroku. Из своих документов:

Эфемерная файловая система

Каждый dyno получает свою собственную эфемерную файловую систему со свежей копией самого недавно развернутого кода. В течение жизненного цикла dynos его запущенные процессы могут использовать файловую систему в качестве временной блокнотной памяти, но никакие файлы, которые написаны, не видны для процессов в любом другом дино, и любые записанные файлы будут отброшены в момент остановки или перезапуска dyno.

Вместо локального хранения файлов рекомендуется загружать файлы в AWS S3 или другие системы хранения облачных данных.

  • 0
    Спасибо за вашу помощь :)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню