2015-10-26 66 views
-1

我試圖在Mac OS X(10.9.5)上的本地主機http://127.0.0.1:8080/上顯示HTML頁面,但圖像未顯示。 我在Common Lisp的一個非常粗魯的程序作爲Web服務器,它只是監聽和HTML頁面輸出到插座8080 的HTML頁面(剝離一切後)只是:圖像不會通過網絡服務器顯示在網頁上

<html> 
    <head> 
    </head> 
    <body>This is a test 
    <img src="/Users/John/bs/images/MyImage.png"/> 
    </body> 
</html> 

當我寫http://127.0.0.1:8080/在瀏覽器的URL(我嘗試過FF和Safari)頁面顯示,但沒有圖像。 我試圖改變img路徑從絕對到相對,以所有可以想象的方式(../../bs/images/MyImage.png等),但無濟於事。 HTML頁面位於/Users/John/bs/index.html。充當服務器的程序位於相同的目錄中。 如果我直接從URL欄中打開該頁面,file:///Users/John/bs/index.html它工作正常,顯示圖像。 我不知道這是否是從主機根(我忽略它在哪裏)的相對路徑的問題,或瀏覽器通過Web服務器訪問頁面的問題。 這裏是Lisp代碼的一個片段:

(defun serve (request-handler) 
    (let ((socket (socket-server 8080))) 
    (unwind-protect 
     (loop (with-open-stream (stream (socket-accept socket)) 
       (let* ((url (parse-url (read-line stream))) 
         (path (car url)) 
         (header (get-header stream)) 
         (params (append (cdr url) 
             (get-content-params stream header))) 
         (*standard-output* stream)) 
        (funcall request-handler path header params)))) 
     (socket-server-close socket)))) 

(defun request-handler (path header params) 
    (princ "HTTP/1.1 200 OK") 
    (terpri) 
    (terpri) 
    (with-open-file (in "bs/index.html") 
     (copy-stream in *standard-output*))) 

(serve #'request-handler) 

有沒有人有同樣的問題?感謝您的任何建議。

+0

Leo,請提供您編寫的Common-Lisp服務器應用程序中使用的一些代碼 - 這有助於查明問題。 – Myst

+0

請勿將它置於評論中 - 編輯您的問題... – Myst

+0

此外,您的文件名是否在您的代碼中硬編碼?如果是這樣,您的服務器將不會提供任何其他文件。 – Myst

回答

0

請嘗試以下操作。相對路徑應該與調用映像的文件相關,因此您不想一直回到/ Users/John。

<img src="images/MyImage.png"/> 
1

當你的瀏覽器接觸到您的Web服務器(你所編寫的代碼),即不以「計劃」啓動(通常的「http://」或「https://」)的任何鏈接並且主機名將被視爲相對於所獲取的頁面。這意味着您的瀏覽器會向資源「/Users/John/bs/images/MyImage.png」的相同服務器發送請求,除非您的服務器可以通過該流將圖像發回,否則它將顯示爲已損壞圖片在頁面上。

瑣碎的修復(這將讓它計算機上工作)是改變圖像的URL爲「文件://localhost//Users/John/bs/images/MyImage.png」,但這是錯誤的修復。正確的解決方法是在請求的路徑上分派,並在需要時提供基本HTML頁面,或者在需要時提供圖像。