背景
用户頭像上傳功能中,服務端上傳流程如下:
base64解碼成字符串- 圖片寫入服務器本地臨時目錄
- 上傳到
阿里雲OSS/七牛雲存儲 - 圖片審核
代碼如下
type Parms struct {
Head string //客户端發送base64字符串
}
func Upload(p Params){
if p.Head == ""{
return errors.New("img is empty")
}
str,err := Base64Decode(p.Head)
if err != nil{
return err
}
filename := makeUniqueName()
if err := FileWrite(filename,str);err != nil{
return err
}
err := UploadAliOss(filename)
if err != nil{
return err
}
err := VerifyImg(filename)
if err != nil{
return err
}
}
問題
以前多個項目通過jenkins發佈不同的上線指令,每新建一個項目,運維需要單獨寫一套shell命令,無法複用之前的,維護成本比較高。後來我們升級部署方式,只需要修改項目部署目錄配置文件,具體後續再介紹。
一直以來穩定運行,週末收到反饋出現問題,用户無法上傳頭像。
- 檢查代碼的
git歷史提交記錄,近期沒有修改代碼,排除代碼bug - 報錯提示只在調用
FileWrite和UploadAliOss兩個方法時出現 - 在打包鏡像的時候沒有在容器中創建臨時目錄,所以無法寫入文件,用户頭像無法上傳
臨時解決
手動在容器中創建一個臨時目錄,保存圖片文件。
完全解決
我認為,圖片文件全部保存在第三方對象存儲中,服務器保存一份是完全沒必要的,只會佔用磁盤空間。
我們可以創建Reader對象把圖片文件讀取到緩衝區,再上傳到第三方對象存儲。
代碼如下
func Upload(p Params){
if p.Head == ""{
return errors.New("img is empty")
}
str,err := Base64Decode(p.Head)
if err != nil{
return err
}
filename := makeUniqueName()
buf := bytes.NewReader([]byte(str))
err := UploadAliOssBuff(filename,buf)
if err != nil{
return err
}
err := VerifyImg(filename)
if err != nil{
return err
}
}
總結
在接手維護老項目時候,避免不了遇到坑。除了吐槽前人寫的糟糕外,我們可以盡我所能提升代碼維護質量,讓後來者更容易維護。
一片空地,可能開始只有幾片垃圾。如果一直不清理,你來丟,他也丟,很快就會變成垃圾堆。