zoukankan      html  css  js  c++  java
  • Go实现上传下载功能

    `
    package main

    import (
    "crypto/md5"
    "encoding/hex"
    "fmt"
    "io"
    "io/ioutil"
    "log"
    "mime"
    "net/http"
    "path/filepath"
    )
    const saveDir = "./uploads"
    const maxUploadSize = 1024 * 1024 * 1024 * 2

    func ApiErrorResult(writer io.Writer, code int , msg string) {
    s := fmt.Sprintf({"code": %d, "msg": %s}, code, msg)
    _, _ = writer.Write([]byte(s))

    }

    func ApiResult(writer io.Writer, code int , msg string) {
    s := fmt.Sprintf({"code": %d, "msg": %s}, code, msg)
    _, _ = writer.Write([]byte(s))

    }

    func handleFileUpload(resp http.ResponseWriter, req *http.Request) {
    // 设置最大读取
    req.Body = http.MaxBytesReader(resp, req.Body, maxUploadSize)
    if err := req.ParseMultipartForm(maxUploadSize); err != nil {
    ApiErrorResult(resp,-1, "上传文件太大")
    return
    }

    uploadFile, _, err := req.FormFile("file")
    if err != nil {
    	ApiErrorResult(resp, -1, err.Error())
    	return
    }
    var fileType string
    fileData, err := ioutil.ReadAll(uploadFile);
    if err != nil {
    	ApiErrorResult(resp,-1, err.Error())
    	return
    } else {
    	// 从文件中读取类型
    	fileType = http.DetectContentType(fileData)
    }
    // 检测是否支持的类型
    fileEndings, err := mime.ExtensionsByType(fileType)
    if err != nil {
    	ApiErrorResult(resp,-1, err.Error())
    	return
    }
    if len(fileEndings) == 0 {
    	ApiErrorResult(resp,-1, "不支持此文件类型上传")
    	return
    }
    fileMd5 := md5.New()
    fileMd5.Write(fileData)
    fileName := filepath.Join(saveDir,hex.EncodeToString(fileMd5.Sum(nil))+ fileEndings[0])
    if err := ioutil.WriteFile(fileName, fileData, 0777); err == nil {
    	ApiResult(resp, 0, "上传成功")
    	return
    } else {
    	ApiErrorResult(resp, -1, err.Error())
    }
    

    }
    func main() {
    http.HandleFunc("/upload", handleFileUpload)
    http.Handle("/files/", http.StripPrefix("/files/", http.FileServer(http.Dir(saveDir))))
    log.Print("正在监听:8080服务")
    http.ListenAndServe(":8080", nil)
    }
    `

  • 相关阅读:
    sql server 如何查看这个数据库有多少张表并具体显示出来
    SQL Server2008 SP1安装 查找安装媒体怎么解决
    检测到在集成的托管管道模式下不适用的 ASP.NET 设置。
    sql不记得用户名跟密码怎么办
    必背系列之数据库常用语法
    select * from 多张表的用法
    SAP与Oracle ERP
    with as的用法
    IIS启动网站--HTTP错误500.21
    SqlServer2012--备份介质集不完整 ,介质集有2个介质簇但只提供了1个
  • 原文地址:https://www.cnblogs.com/pengshaomin/p/13081047.html
Copyright © 2011-2022 走看看