onlyoffice具有文档转换的功能,就是你给一个文档的地址,以及一些参数,post给document server,它会转换成你要的,然后返回一个文件地址,你收到这个地址,把文件下载下来保存,提供用户下载。
它官网也讲的比较清楚,这个没有历史版本难度大,最新的API里说可以支持返回json格式,前提是post发生参数的时候,要设定head参数,可惜beego没有试验成功,反正xml用golang也可以很方便解析出struct,不去折腾了。
测试代码如下:
//文档格式转换
type Conversionsend struct {
Async bool `json:"async"`
Filetype string `json:"filetype"`
Key string `json:"key"`
Outputtype string `json:"async"`
Thumbnail Nail `json:"thumbnail"`
Title string `json:"title"`
Url string `json:"url"`
}
type Nail struct {
Aspect int `json:"aspect"`
First bool `json:"first"`
Height int `json:"height"`
Width int `json:"width"`
}
type Conversionresponse struct {
EndConvert bool `json:"endconvert"`
FileUrl string `json:"fileurl"`
Percent int `json:"percent"`
}
// @Title post conversion doc
// @Description post doc to onlyoffice conversion
// @Success 200 {object} models.AddArticle
// @Failure 400 Invalid page supplied
// @Failure 404 articl not found
// @router /conversion [post]
func (c *OnlyController) Conversion() {
var nail Nail
nail.Aspect = 0
nail.First = true
nail.Height = 850
nail.Width = 600
var conversionsend Conversionsend
conversionsend.Async = false
conversionsend.Filetype = "docx"
conversionsend.Key = "Khirz6zTPdfd7"
conversionsend.Outputtype = "pdf"
conversionsend.Thumbnail = nail
conversionsend.Title = "Example Document Title.docx"
conversionsend.Url = "http://192.168.99.1/attachment/onlyoffice/111历史版本试验v4.docx"
req := httplib.Post("http://192.168.99.100:9000/convertservice.ashx")
// req.Header("contentType", "application/json")
req.Header("Content-Type", "application/json")
// bt,err:=ioutil.ReadFile("hello.txt")
// if err!=nil{
// log.Fatal("read file err:",err)
// }
beego.Info(conversionsend)
b, err := json.Marshal(conversionsend)
req.Body(string(b))
beego.Info(string(b))
var conversionresponse Conversionresponse
jsonstring, err := req.String()
if err != nil {
beego.Error(err)
} else {
//json字符串解析到结构体,以便进行追加
beego.Info(jsonstring)
// err = json.Unmarshal([]byte(jsonstring), &conversionresponse)
err = xml.Unmarshal([]byte(jsonstring), &conversionresponse)
// fmt.Println(s)
if err != nil {
beego.Error(err)
}
resp, err := http.Get(conversionresponse.FileUrl)
if err != nil {
beego.Error(err)
}
beego.Info(resp)
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
beego.Error(err)
}
defer resp.Body.Close()
if err != nil {
beego.Error(err)
}
f, err := os.Create("./attachment/onlyoffice/" + "Example Document Title.pdf")
if err != nil {
beego.Error(err)
}
defer f.Close()
_, err = f.Write(body)
// _, err = f.WriteString(str)
// _, err = io.Copy(body, f)
if err != nil {
beego.Error(err)
}
filePath := "attachment/onlyoffice/Example Document Title.pdf"
c.Ctx.Output.Download(filePath) //这个能保证下载文件名称正确
c.Data["json"] = conversionresponse
c.ServeJSON()
}
}