第一个go的web程序;调用七牛云存储的音频api问题解决;条件搜寻文件里的内容

package main

import (

"html/template"

"io"

"io/ioutil"

"log"

"net/http"

"os"

"path"

"runtime/debug"

)

const (

ListDir      = 0x0001

UPLOAD_DIR   = "./uploads"

TEMPLATE_DIR = "./views"

)

//cache storage all template

var templates = make(map[string]*template.Template)

func init() {

fileInfoArr, err := ioutil.ReadDir(TEMPLATE_DIR)

check(err)

var templateName, templatePath string

for _, fileInfo := range fileInfoArr {

templateName = fileInfo.Name()

if ext := path.Ext(templateName); ext != ".html" {

continue

}

templatePath = TEMPLATE_DIR + "/" + templateName

//log.Println(templateName)

log.Println("Loading template:", templatePath)

t := template.Must(template.ParseFiles(templatePath))

templates[templateName] = t

}

//if const template

/*for _, tmpl := range []string{"upload", "list"} {

//Must ensure in case can‘t analytic will do error operate,If the template loading is not successful, the program will exit

t := template.Must(template.ParseFiles(tmpl + ".html"))

templates[tmpl] = t

}*/

}

func check(err error) {

if err != nil {

panic(err)

}

}

func renderHtml(w http.ResponseWriter, tmpl string, locals map[string]interface{}) {

/*tt := templates[tmpl]

log.Println("xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", templates, tmpl, tt)*/

log.Println(locals)

err := templates[tmpl].Execute(w, locals)

check(err)

}

func isExists(path string) bool {

_, err := os.Stat(path)

//log.Println(err)

if err == nil {

return true

}

return os.IsExist(err)

}

//Callback method,

func uploadHandler(w http.ResponseWriter, r *http.Request) {

//log.Println(r.Method)

if r.Method == "GET" {

renderHtml(w, "upload.html", nil)

}

if r.Method == "POST" {

f, h, err := r.FormFile("image")

//log.Println(f, h, err)

check(err)

filename := h.Filename

defer f.Close()

//log.Println(UPLOAD_DIR, filename)

t, err := ioutil.TempFile(UPLOAD_DIR, filename)

//log.Println(t)

check(err)

defer t.Close()

_, err = io.Copy(t, f) //dst src

check(err)

http.Redirect(w, r, "/view?id="+filename, http.StatusFound)

}

}

func viewHandler(w http.ResponseWriter, r *http.Request) {

imageId := r.FormValue("id")

imagePath := UPLOAD_DIR + "/" + imageId

log.Println(imageId, imagePath)

if exists := isExists(imagePath); !exists {

http.NotFound(w, r)

return

}

//log.Println("222222222222")

w.Header().Set("Content-Type", "image")

http.ServeFile(w, r, imagePath)

}

func listHandler(w http.ResponseWriter, r *http.Request) {

fileInfoArr, err := ioutil.ReadDir("./uploads")

//log.Println(fileInfoArr)

check(err)

if err != nil {

http.Error(w, err.Error(), http.StatusInternalServerError)

return

}

locals := make(map[string]interface{})

images := []string{}

for _, fileInfo := range fileInfoArr {

//log.Println(fileInfo)

images = append(images, fileInfo.Name())

}

locals["images"] = images //这里map的key是images,对应list.html里面的$.images

renderHtml(w, "list.html", locals)

}

//巧用闭包避免运行时错误崩溃

func safeHandler(fn http.HandlerFunc) http.HandlerFunc {

return func(w http.ResponseWriter, r *http.Request) {

defer func() {

log.Println("can‘t past execute or finished execute")

if e, ok := recover().(error); ok {

log.Println("50x error")

//50x error

http.Error(w, e.Error(), http.StatusInternalServerError)

log.Println("Warn : panic in %v. - %v", fn, e)

log.Println(string(debug.Stack()))

}

}()

log.Println("if no panic then first execute")

fn(w, r)

}

}

func staticDirHandler(mux *http.ServeMux, prefix string, staticDir string, flags int) {

mux.HandleFunc(prefix, func(w http.ResponseWriter, r *http.Request) {

file := staticDir + r.URL.Path[len(prefix)-1:]

if (flags & ListDir) == 0 {

if exists := isExists(file); !exists {

http.NotFound(w, r)

return

}

}

http.ServeFile(w, r, file)

})

}

func main() {

mux := http.NewServeMux()

staticDirHandler(mux, "/assets/", "./public", 0)

mux.HandleFunc("/", safeHandler(listHandler))

mux.HandleFunc("/view", safeHandler(viewHandler))

mux.HandleFunc("/upload", safeHandler(uploadHandler))

err := http.ListenAndServe(":8080", mux)

if err != nil {

log.Fatal("ListenAndServe:", err.Error())

}

}

uoload.html

<html>

<head>

<meta charset="utf-8">

<title>upload</title>

</head>

<body>

<form method="POST" action="/upload" enctype="multipart/form-data">

choosing an image to upload :<br>

<input name="image" type="file">

<input type="submit" value="Upload">

</form>

</body>

</html>

list.html

<html>

<head>

<meta charset="utf-8">

<title>list</title>

</head>

<body>

<ol>

{{range $.images}}

<li><a href="/view?id={{.|urlquery}}">{{.|html}}</a></li>

{{end}}

</ol>

</body>

</html>

注意文件结构

photoweb

-photoweb.go

-public

-js

-css

-images

-uploads

-views

-upload.html

-list.html

解决调用七牛音频问题

示例只提供代码方式调用api,不能够像图片处理直接在url中添加参数进行修改

若强用url会提示要预处理音频转码,一般转码采用异步方式

OK,在go的SDK代码中进行,结果发现api给的参数只是个大概,go的api里面的对应参数,不完全和官网贴出来的一样

我们搜需PutPolicy

在rs/token.go 中,看到对应deadline;grep ‘xx‘ *  -R查看文件里内容

package main

import (

"fmt"

. "github.com/qiniu/api/conf"

"github.com/qiniu/api/fop"

"github.com/qiniu/api/io"

"github.com/qiniu/api/rs"

"log"

)

func init() {

ACCESS_KEY = "自己的ak"

SECRET_KEY = "自己sk"

}

//GET upload access token

func uptoken(bucketName string) string {

putPolicy := rs.PutPolicy{

Scope: bucketName,

//CallbackUrl: callbackUrl,

//CallbackBody:callbackBody,

//ReturnUrl: returnUrl,

//ReturnBody: returnBody,

//AsyncOps: asyncOps,

//EndUser: endUser,

//Expires: expires,

Expires:             1406555272, //截止时间戳

PersistentOps:       "avthumb/mp3",

PersistentNotifyUrl: "http://fake.com/qiniu/notify",

}

return putPolicy.Token(nil)

}

func main() {

//上传本地文件

upload("a")

//5.1 获取文件信息

//getFileInfo()

//6.1.1 查看图像属性

//imageAttr()

//5.2 删除文件

//delFile()

}

//6.1.1 查看图像属性

func imageAttr() {

var imageUrl = "http://needkane.qiniudn.com/kane2.jpg"

ii := fop.ImageInfo{}

infoRet, err := ii.Call(nil, imageUrl)

if err != nil {

// 产生错误

log.Println("fop getImageInfo failed:", err)

return

}

log.Println(infoRet.Height, infoRet.Width, infoRet.ColorModel, infoRet.Format)

}

func makeImageInfoUrl(imageUrl string) string {

ii := fop.ImageInfo{}

return ii.MakeRequest(imageUrl)

}

//5.2 删除文件

func delFile() {

bucket := "needkane"

key := "goupload.jpg"

var rsCli = rs.New(nil)

err := rsCli.Delete(nil, bucket, key)

if err != nil {

// 产生错误

log.Println("rs.Copy failed:", err)

return

}

}

//5.1 获取文件信息

func getFileInfo() {

var ret rs.Entry

bucket := "needkane"

key := "kane3.jpg"

var rsCli = rs.New(nil)

var err error

ret, err = rsCli.Stat(nil, bucket, key)

if err != nil {

// 产生错误

log.Println("rs.Stat failed:", err)

return

}

// 处理返回值

log.Println(ret)

}

//上传本地文件

func upload(key string) {

uptoken := uptoken("needkane")

fmt.Printf("uptoken:%s\n", uptoken)

var err error

var ret io.PutRet

var extra = &io.PutExtra{

//Params: params,

//MimeType: mieType,

//Crc32: crc32,

//CheckCrc: CheckCrc,

}

var localFile = "/home/qboxtest/Downloads/a.wav"

// ret 变量用于存取返回的信息,详情见 io.PutRet

// uptoken 为业务服务器生成的上传口令

// key 为文件存储的标识

// localFile 为本地文件名

// extra 为上传文件的额外信息,详情见 io.PutExtra,可选

err = io.PutFile(nil, &ret, uptoken, key, localFile, extra)

if err != nil {

//上传产生错误

log.Print("io.PutFile failed:", err)

return

}

//上传成功,处理返回值

log.Print(ret.Hash, ret.Key)

}

用 file 命令查看文件

第一个go的web程序;调用七牛云存储的音频api问题解决;条件搜寻文件里的内容,布布扣,bubuko.com

时间: 2024-10-02 06:39:47

第一个go的web程序;调用七牛云存储的音频api问题解决;条件搜寻文件里的内容的相关文章

小程序对接七牛云存储

前言: 做小程序有一段时间了,总结一下做过的技术点,特此贡献给小伙伴们!项目中,有图片存储.视频存储.录音存储这三个需要云对接存储. 一.图片/视频/录音上传七牛对接 准备工作: a.你要有一个七牛账号,实名认证后,在七牛的个人中心,有个秘钥管理-里面有一对秘钥,是上传必须的.这对秘钥,配置在后端,配置时可以设置允许上传格式,也可以设置为任何格式都可上传,让我们的后端大哥去慢慢弄吧.另外,还需要在七牛的对象存储里新建一个存储空间,所要上传的文件就是存储在你创建的空间里,如果你为了方便管理,也可以

ueditor上传图片到七牛云存储(form api,java)

转:http://my.oschina.net/duoduo3369/blog/174655 ueditor上传图片到七牛云存储 ueditor结合七牛传图片 七牛的试炼 开发前的准备与注意事项说明 Let's rock 与ueditor结合前的准备工作 首先从表单开始 生成token 建立图片空间 生成token 上传流程 集成ueditor 将ueditor中的图片模块的在线管理功能和七牛结合 ueditor上传图片到七牛云存储 重要说明,本人已不做java多年,请不要加qq再问我java的

我为什么选择七牛云存储

在写这篇文章之前先给大家分享一个小福利:2017最新七牛云存储九折优惠券:61d1fd4d 接下来给大家谈一下我用七牛云存储的原因,从七牛一开始的时候我就开始用了,刚开始的时候七牛好像只是做静态存储,那时候我把自己的网站放在七牛上,当然只是一些静态的页面,但是对于一个初中生来说,能做出一个能访问的网站已经很高兴了,当然,那个网站是我自己用记事本一个一个打出来的代码.当时满满的自豪感. 经过了好几年,七牛已经迅速发展成国内数一数二的云存储服务商了.目前的七牛不知在云存储方面位居国内前列,在cdn加

七牛云存储android客户端及java服务端代码编写

前一篇博客提到让我很伤心的c应用,由于是一款供用户上传图片的应用,因此必须解决图片存储问题,如果直接将图片存储至服务器,当用户上传图片较多,服务器空间将很快吃紧,同时也没有那么大的带宽,现实中我买的阿里云服务器是最低配置,数据盘才20G,带宽才1M,如果用这样配置的服务器做图片存储,那实在太扯了.于是很自然的想到用图片云存储服务器,通过不断查找资料,最后将目标定位在七牛云和又拍云.在做选择时,主要对比了两者之间的价格及技术优势,也看了很多相关话题讨论,个人认为这两者无论从技术方案还是产品价格,都

《Go语言入门》第一个Go语言Web程序——简单的Web服务器

概述 上一篇讲了 <Go语言入门>第一个Go语言程序--HelloWorld,接下来讲一下Go语言Web开发入门必修课:第一个Go语言Web程序--简单的Web服务器. 与其它Web后端语言不同,Go语言需要自己编写Web服务器. 有关本地环境的搭建与基础学习,请参考: <Go语言入门>如何在Windows下安装Go语言编程环境 Go语言Web应用:IBM的云平台Bluemix使用初体验--创建Go语言 Web 应用程序,添加并使用语言翻译服务 Web服务器代码 Google在ht

Java及Web程序调用hadoop2.6

1. hadoop集群: 1.1 系统及硬件配置: hadoop版本:2.6 :三台虚拟机:node101(192.168.0.101).node102(192.168.0.102).node103(192.168.0.103): 每台机器2G内存.1个CPU核: node101: NodeManager. NameNode.ResourceManager.DataNode: node102: NodeManager.DataNode .SecondaryNameNode.JobHistoryS

WEB程序调用客户端程序

最近一个项目中要点击WEB页面上的链接启动自己编写的程序,而且还要接收参数,google了1.5小时,终于初步试验通过了. 尝试google了:web send message windows form, bs call cs program, custom protocol...多个关键字组合,发现这种技术叫 registered URL protocol,在这篇文章里介绍得比较详细: http://msdn.microsoft.com/en-us/library/aa767914(v=vs.

七牛云存储还有一个独一无二的特性——支持用户将文件从客户端直传到云服务器中

目前七牛已经拥有数千家客户,你会发现其中有很多都是像知乎.Weico.Camera360.美图秀秀.蝉游记和Vida等UGC(用户产生内容)类产品,尤其是在图片社交领域.这是因为,除了我在前面所说的“云存储”比传统方案更节省成本外,七牛云存储还有一个独一无二的特性——支持用户将文件从客户端直传到云服务器中.因为我看过蝉游记CTO Quake撰文写过这一特性,所以就直接引用他的原文来做说明: 常见的云存储上传文件流程一般如下: 用户 =>应用服务器 =>云存储提供商 这样多了一次上传的流程,和本

CodeIgniter - 集成七牛云存储

最近有一个项目需要集成七牛云存储的图片存储和调用功能,程序是基于CodeIgniter2.1.3的PHP框架.刚拿到手完全无从下手的感觉,因为像框架这种东西,想从官方的PHPSDK集成进去,需要改动很多地方.还好,有前辈蹚水,我等后辈直接参考或者说是拿来用了.上传插件采用的是plupload. plupload:www.plupload.com/ 多附件上传控件plupload的使用心得:www.cnblogs.com/luckybird/archive/2013/01/15/2861072.h