我有一個網站,當用戶上傳PDF文件時,它會被髮送到服務器,做一些PDF渲染,並創建一個.png文件以顯示爲PDF預覽縮略圖。強制服務器等待,因爲圖像尚未寫入磁盤
問題是,當創建.png時,寫入磁盤比整個執行慢,導致圖像在網站上顯示爲錯誤,因爲它試圖訪問不存在的圖像(因爲代碼在寫入磁盤之前完成)。
我在.png創建後添加了一個Thread.sleep(2000)
,它似乎解決了這個問題。現在我的問題是,對於我的情況Thread.sleep(2000)
是最好的代碼使用?我不知道該代碼是否會影響多個用戶訪問我的網站並上傳文件。
假設用戶A在UserB正常瀏覽時上傳文件。用戶A上傳文件後,用戶B是否經歷了2秒的延遲?
有沒有更好的方法讓我在這種情況下暫停執行代碼?
編輯:添加的代碼。我使用的PDF渲染器作爲我的圖書館:https://java.net/projects/pdf-renderer
public static void convertPDFtoImage() throws IOException {
RandomAccessFile raf = new RandomAccessFile (new File (rep.pathSamplePDF), "r");
FileChannel fc = raf.getChannel();
ByteBuffer buf = fc.map (FileChannel.MapMode.READ_ONLY, 0, fc.size());
PDFFile pdfFile = new PDFFile (buf);
PDFPage firstPage = pdfFile.getPage(1);
Rectangle2D r2d = firstPage.getBBox();
int width = (int) r2d.getWidth();
int height = (int) r2d.getHeight();
Image pdfImage = firstPage.getImage(width, height, r2d, null, true, true);
BufferedImage imageToSave = (BufferedImage) pdfImage;
File outputFile = new File("public/pdfpreview/" + someName + ".png");
ImageIO.write(imageToSave, "png", outputFile); //Trying to delay this part so that it can finish writing to disk
Thread.sleep(2000) //If I put this code here, it fixes my problem.
}
UserB不應該體驗延遲,因爲'Thread.sleep'隻影響當前線程 –
如何將文件寫入磁盤?如果您正在使用OutputStream,請嘗試flush()並關閉()它。這些操作之後,該文件應該存在。 – Matthias
使用'ExecutorService'和'Map'作爲值'Future's作爲值 – fge