2011-03-23 99 views
0

我有一個詞雲應用程序,它根據用戶輸入文本生成圖像。此生成的圖像存儲在圖像文件夾中。我提供了一個保存圖像選項,允許用戶將此圖像保存在他們的桌面上。我通過調用下面顯示的servlet來讀取存儲的圖像&寫入字節流。java邏輯幫助保存圖像

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 

    response.setHeader("Content-disposition","attachment; filename=output.png"); 

    String filename = request.getSession().getServletContext().getRealPath("/")+"/images/output.png"; 
    String mimeType = "image/png"; 
    response.setContentType(mimeType); 

    File file = new File(filename); 
    response.setContentLength((int)file.length()); 
    FileInputStream in = new FileInputStream(file); 
    OutputStream outputStream = response.getOutputStream(); 

    byte[] buf = new byte[1024]; 
    int count = 0; 
    while ((count = in.read(buf)) >= 0) { 
     outputStream.write(buf, 0, count); 
    } 
    in.close(); 
    outputStream.close(); 


} 

問題的這種方法是,如果另一用戶(用戶2)同時產生詞雲,它取代output.png與這個新的圖像。現在,如果用戶1試圖保存圖像,他會得到一個錯誤的圖像(用戶2的圖像)。

你能否給我推薦一個更好的方法,可以保持圖像用戶特定?

回答

4

如何爲圖像生成唯一的文件名,而不是使用同一個文件的所有時間?

然後,文件名可以存儲在用戶的會話中,或作爲URL參數傳遞給第二個Servlet。這允許大量的用戶生成圖像(只要您的文件名是真的是唯一的),並且仍然使用基於磁盤的方法。

您可以直接在用戶會話中存儲圖像,但會消耗大量內存,並非​​所有用戶都會使用「桌面保存」功能。

編輯: 此外,當您決定採取何種方法來實現此功能時,請記住用戶也可以同時生成兩個圖像(例如,如果他在兩個選項卡中打開您的服務)。我認爲在這種情況下,真正獨特的文件名比用戶名更好。

1

在請求中傳遞用戶名或其他唯一字符串以用於文件名。

...圖像根據用戶輸入的文字...

你也可以生成從輸入文本文件名,所以你可以嘗試並緩存每個文字圖像和再利用已生成圖像爲相同的文字(如果這在你的情況是適當的)。

0

重命名output.png類似於<username>.png