亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何檢查通過多部分形式發布的文件是否為圖像類型,并且它是否小于 Go 中的給定 maxsize?

如何檢查通過多部分形式發布的文件是否為圖像類型,并且它是否小于 Go 中的給定 maxsize?

Go
慕工程0101907 2021-11-08 15:37:29
我想知道是否有辦法在將其上傳到服務器之前檢查大小和類型。我擔心人們試圖上傳非常大的文件來故意降低服務器的速度。我只知道如何在將文件復制到服務器后檢查文件的大小。我不知道如何檢查文件類型。我想在必須上傳 2 GB 數據然后驗證文件之前執行此操作。這是我到目前為止所擁有的,但這首先將文件復制到服務器,這不是我想要的。func userUploadImage(w http.ResponseWriter, r *http.Request, _ httprouter.Params) error {    mpf, mpfh, err := r.FormFile("file")    if err != nil {        return nil    }    defer mpf.Close()    dstFile, err := os.Create(config.UploadDir + "/img/" + mpfh.Filename)    if err != nil {        return err    }    defer dstFile.Close()    size, err := io.Copy(dstFile, mpf)    if err != nil {        return err    }    spew.Dump(size)    return nil}
查看完整描述

1 回答

?
智慧大石

TA貢獻1946條經驗 獲得超3個贊

為了避免將大量數據上傳到您的服務器,我建議將您的 包裝起來multipart.File,這本質上是一個io.Reader帶有io.LimitedReader,例如

wrapped := io.LimitReader(mpf,10*1024*1024)    //10 MiB

然后在wrapped閱讀器上工作。這將讀取指定數量的字節,然后返回 EOF,因此任何大于 10 MiB 的內容都將被截斷。

要檢查接收到的數據是否為圖像,您有兩種選擇:

  1. 使用 解析數據image.Decode(io.Reader),如果無法將數據解析為圖像,則會拋出錯誤 - 這還允許您檢查接收到的數據是否完整和正確。但是請注意,這需要一些時間/竊取性能。也許你想避免這種情況,如果你之后只是丟棄解碼的圖像。請務必檢查圖像包的godoc,因為您必須導入您希望解碼的任何格式。

  2. 檢查幻數,例如 PNG 文件89 50 4e 47 0d 0a 1a 0a作為它們的幻數。然而,正確的幻數并不意味著正確的圖像。特別是如果您將較大的圖像截斷為 10 MiB。

如果您有能力解碼手頭的每張圖像,那就去做吧——結果應該更精確,但這只是一個建議。

我寧愿不檢查文件類型的 FileHeader (pkg/mime/multipart/#FileHeader),我希望它不可靠。但是,您可能會在其中找到有關(原始)文件大小的信息,我建議您只為某些請求轉儲 FileHeaders。


查看完整回答
反對 回復 2021-11-08
  • 1 回答
  • 0 關注
  • 254 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號