আপনি কীভাবে ওয়েব ওয়েব সার্ভার ব্যবহার করে একটি স্ট্যাটিক এইচটিএমএল ফাইল পরিবেশন করবেন?


91

আপনি কীভাবে ওয়েব ওয়েব সার্ভার ব্যবহার করে সূচি। Html (বা অন্য কোনও স্ট্যাটিক এইচটিএমএল ফাইল) পরিবেশন করবেন?

আমি কেবল একটি বেসিক, স্থির এইচটিএমএল ফাইল চাই (যেমন একটি নিবন্ধের মতো) যা আমি গো ওয়েব সার্ভার থেকে পরিবেশন করতে পারি। এইচটিএমএল গো প্রোগ্রামের বাইরে পরিবর্তিতযোগ্য হওয়া উচিত, কারণ এটি এইচটিএমএল টেমপ্লেটগুলি ব্যবহার করার সময় ঘটবে।

এটি আমার ওয়েব সার্ভার যা কেবলমাত্র হার্ড-কোডড পাঠ্যকে হোস্ট করে ("হ্যালো ওয়ার্ল্ড!")।

package main

import (
  "fmt"
  "net/http"
)

func handler(w http.ResponseWriter, r *http.Request) {
  fmt.Fprintf(w, "Hello world!")
}

func main() {
  http.HandleFunc("/", handler)
  http.ListenAndServe(":3000", nil)
}

উত্তর:


144

গোলং নেট / এইচটিপি প্যাকেজের সাহায্যে সেই কাজটি খুব সহজ।

আপনাকে যা করতে হবে তা হ'ল:

package main

import (
        "net/http"
)

func main() {
        http.Handle("/", http.FileServer(http.Dir("./static")))
        http.ListenAndServe(":3000", nil)
}

ধরে নিচ্ছি যে স্ট্যাটিক ফাইলগুলি staticপ্রকল্পের মূল ডিরেক্টরিতে ফোল্ডারে রয়েছে ।

যদি এটি ফোল্ডারে থাকে তবে staticআপনার কাছে index.htmlফাইল কলিং রয়েছে http://localhost:3000/যা ফলস্বরূপ সমস্ত ফাইলকে তালিকাভুক্ত করার পরিবর্তে সেই সূচক ফাইলটি রেন্ডার করে।

অতিরিক্তভাবে, সেই ফোল্ডারে অন্য কোনও ফাইলকে কল করা (উদাহরণস্বরূপ http://localhost:3000/clients.html) সেই ফাইলটি প্রদর্শিত হবে, ব্রাউজারটি সঠিকভাবে রেন্ডার করে (কমপক্ষে ক্রোম, ফায়ারফক্স এবং সাফারি :))

আপডেট: "/" এর চেয়ে আলাদা url থেকে ফাইলগুলি সরবরাহ করা

আপনি যদি ফাইলগুলি পরিবেশন করতে চান তবে ./publicurl এর অধীন ফোল্ডার থেকে বলুন : localhost:3000/staticআপনাকে অতিরিক্ত ফাংশন ব্যবহার করতে হবে : এর func StripPrefix(prefix string, h Handler) Handlerমতো:

package main

import (
        "net/http"
)

func main() {
        http.Handle("/static/", http.StripPrefix("/static/", http.FileServer(http.Dir("./public"))))
        http.ListenAndServe(":3000", nil)
}

তার জন্য ধন্যবাদ, আপনার সমস্ত ফাইল ./publicএর অধীনে উপলব্ধlocalhost:3000/static

বিনা http.StripPrefixফাংশন , আপনি যদি ফাইলটি অ্যাক্সেস করার চেষ্টা করেন localhost:3000/static/test.html, সার্ভারটি এটির জন্য সন্ধান করবে./public/static/test.html

কারণ সার্ভারটি পুরো ইউআরআইকে ফাইলের সাথে সম্পর্কিত মনে করে।

ভাগ্যক্রমে, এটি বিল্ট-ইন ফাংশনটির সাথে সহজেই সমাধান হয়ে গেছে।


4
হ্যান্ডেল প্যাটার্ন কেন হয় /static/না /static?
ব্রাইস

যদি ফাইলটি হার্ডড্রাইভের অন্যত্র, পুরোপুরি প্রকল্পের বাইরে থাকে তবে আপনি কীভাবে একটি স্থিতিশীল এইচটিএমএল ফাইল পরিবেশন করবেন?
iamtoc

আমি এটি পরম পাথ: / ব্যবহারকারী / ব্যবহারকারীর / পাথ / থেকে / ফাইল থেকে চেষ্টা করেছি এবং এটি সফলভাবে ঠিক একইভাবে কাজ করেছে।
iamtoc

@ ব্রাইস, কারণ আপনি সম্পূর্ণ সাবট্রির সাথে মিল রাখতে চান ( এটিও দেখুন )। শুধু সঙ্গে /staticপ্যাটার্ন (এবং ফালা-উপসর্গ) নামে শুধুমাত্র http://example.org/staticঅনুরোধ FileServer হ্যান্ডলার দ্বারা পরিবেশিত হবে। এর অর্থ হল http://example.org/static/এবং অন্যদের কাছে অনুরোধগুলি http://example.org/static/foo.cssব্যর্থ হবে বা অন্য হ্যান্ডলার দ্বারা পরিচালিত হবে।
maxschlepzig

স্থিতিশীল ফাইলগুলি বিশ্রামের রুটের সাথে একসাথে পরিবেশন করা কি সম্ভব?
ব্রেইন

15

আমি http.ServeFileএই ওভার জন্য ব্যবহার পছন্দ http.FileServer। আমি ডিরেক্টরি ব্রাউজিং অক্ষম করতে চেয়েছিলাম, যদি ফাইলগুলি অনুপস্থিত থাকে তবে একটি উপযুক্ত 404 এবং সূচী ফাইলটি বিশেষ ক্ষেত্রে করার সহজ উপায়। এইভাবে, আপনি কেবল একটি বাইনারি একটি ফোল্ডারে ফেলে দিতে পারেন এবং এটি সেই বাইনারি সম্পর্কিত সমস্ত কিছু পরিবেশন করবে। অবশ্যই আপনার যদি অন্য ডিরেক্টরিতে ফাইল সঞ্চিত থাকে তবে আপনি strings.Replaceএটি ব্যবহার করতে পারেন p


func main() {
    fmt.Println("Now Listening on 80")
    http.HandleFunc("/", serveFiles)
    log.Fatal(http.ListenAndServe(":80", nil))
}

func serveFiles(w http.ResponseWriter, r *http.Request) {
    fmt.Println(r.URL.Path)
    p := "." + r.URL.Path
    if p == "./" {
        p = "./static/index.html"
    }
    http.ServeFile(w, r, p)
}

5

কোনও এফটিপি সার্ভার নয়: এটি আমার উদ্দেশ্য থেকে ভিন্ন কিছু, যা index.htmlকোনও সাধারণ ওয়েব সার্ভারের মতো হোমপেজটি পরিবেশন করা হবে। যেমন, আমি যখন আমার ব্রাউজারে mydomain.com এ যাই, আমি index.htmlরেন্ডার করতে চাই ।

এটি মূলত " রাইটিং ওয়েব অ্যাপ্লিকেশনগুলি " বর্ণনা করে এবং হুগো (স্ট্যাটিক এইচটিএমএল সাইট জেনারেটর) এর মতো একটি প্রকল্প কী করে।

এটি কোনও ফাইল পড়ার বিষয়ে, এবং একটি বিষয়বস্তু টাইপ "পাঠ্য / এইচটিএমএল" এর সাথে সম্পর্কিত:

func (server *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) {
    err := server.renderFile(w, r.URL.Path)
    if err != nil {
        w.Header().Set("Content-Type", "text/html; charset=utf-8")
        w.WriteHeader(http.StatusNotFound)
        server.fn404(w, r)
    }
}

সঙ্গে renderFile()মূলত পড়া ও সঠিক প্রকারের করুন:

 file, err = ioutil.ReadFile(server.MediaPath + filename)
 if ext != "" {
    w.Header().Set("Content-Type", mime.TypeByExtension(ext))
 }

সম্ভবত আমি প্রশ্নটি সঠিকভাবে জিজ্ঞাসা করি নি। এটি কি কোনও এফটিপি সার্ভারের অনুরূপ কোনও ফাইল সার্ভার তৈরির উপায় সরবরাহ করে না? এটি আমার উদ্দেশ্য থেকে ভিন্ন কিছু, যা সাধারণ ওয়েব সার্ভারের মতো সূচক html হোমপেজে পরিবেশন করা হবে। লাইক, যখন আমি আমার ব্রাউজারে মাইডোমেন.কম এ যাই, আমি সূচি html রেন্ডার করতে চাই। আমি ওয়েব সার্ভারের ফাইল সিস্টেমে থাকা ফাইলগুলির একটি ডিরেক্টরি দেখতে চাই না। আমার প্রশ্নটি বিভ্রান্তিকর হলে আমি প্রশ্নটি পুনঃশব্দে সম্পাদনা করতে পারি।
নাইয়ারওয়্যার

@ নায়ারওয়্যার ঠিক আছে, আমি উত্তরটি আবার
লিখেছি

সুতরাং গো এর অধীনে কোনও ক্লাসিক ওয়েবসাইট তৈরির কোনও উপায় নেই যা এইচটিএমএল পৃষ্ঠা এবং সার্ভার পৃষ্ঠা ব্যবহার করে? এটি একটি স্ট্যাটিক ওয়েবসাইট বা একটি টেম্পলেট ভিত্তিক ওয়েবসাইট হতে হবে?
স্পেরো

0

গোলং এ এটি সহজ:

package main

import (
    "log"
    "net/http"
)

func main() {
    log.Fatal(http.ListenAndServe(":8080", http.FileServer(http.Dir("."))))
}

`

আপনি কেবল এটি করতে পারেন এবং আপনার এইচটিএমএল ফাইলটিকে যেমন রাখবেন তা নিশ্চিত করে নিতে পারেন index.html


0

কাস্টম এমপি 3 ফাইল পরিবেশন উদাহরণ:

r := http.NewServeMux()
r.HandleFunc("/file/*", func(w http.ResponseWriter, r *http.Request) {

    // Prepare file path
    pathFile := strings.ReplaceAll(r.RequestURI, "/file/", "./my_path/")
    f, err := os.Open(pathFile)
    if f == nil || err != nil {
        return
    }

    // Read file into memory
    fileBytes, err := ioutil.ReadAll(f)
    if err != nil {
        log.Println(err)
        _, _ = fmt.Fprintf(w, "Error file bytes")
        return
    }

    // Check mime type
    mime := http.DetectContentType(fileBytes)
    if mime != "audio/mpeg" {
        log.Println("Error file type")
        _, _ = fmt.Fprintf(w, "Error file type")
        return
    }

    // Custom headers
    r.Header.Add("Content-Type", "audio/mpeg")
    r.Header.Add("Cache-Control", "must-revalidate, post-check=0, pre-check=0")
    r.Header.Add("Content-Description", "File Transfer")
    r.Header.Add("Content-Disposition", "attachment; filename=file.mp3")
    r.Header.Add("Content-Transfer-Encoding", "binary")
    r.Header.Add("Expires", "0")
    r.Header.Add("Pragma", "public")
    r.Header.Add("Content-Length", strconv.Itoa(len(fileBytes)))
    http.ServeFile(w, r, pathFile)
})
log.Fatal(http.ListenAndServe(":80", r))
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.