httputil.go 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. package util
  2. import (
  3. "io"
  4. "mime/multipart"
  5. "net/http"
  6. "os"
  7. )
  8. /**
  9. http-server 响应file流
  10. */
  11. func ResponseFile(writer http.ResponseWriter, fileName string, body io.Reader) error {
  12. writer.Header().Set("Content-Type", "application/octet-stream")
  13. writer.Header().Set("Content-Disposition", "attachment; filename="+fileName)
  14. writer.Header().Set("Content-Transfer-Encoding", "binary")
  15. _, err := io.Copy(writer, body)
  16. return err
  17. }
  18. func ResponseFileV2(writer http.ResponseWriter, fileName string) {
  19. writer.Header().Set("Content-Type", "application/octet-stream")
  20. writer.Header().Set("Content-Disposition", "attachment; filename="+fileName)
  21. writer.Header().Set("Content-Transfer-Encoding", "binary")
  22. }
  23. /**
  24. http-client 请求文件流
  25. */
  26. type FileForm struct {
  27. filedName string
  28. fileName string
  29. // form file
  30. filePath string
  31. // form stream
  32. reader io.Reader
  33. }
  34. func NewFileFormFromFile(fieldName, fileName, filePath string) FileForm {
  35. return FileForm{
  36. filedName: fieldName,
  37. fileName: fileName,
  38. filePath: filePath,
  39. }
  40. }
  41. func NewFileFormFromStream(fieldName, fileName string, reader io.Reader) FileForm {
  42. return FileForm{
  43. filedName: fieldName,
  44. fileName: fileName,
  45. reader: reader,
  46. }
  47. }
  48. /**
  49. 创建 Content-Type: multipart/form-data 的请求
  50. 返回参数1是 请求体
  51. 返回参数2是 Content-Type的value ,记得设置请求header Content-Type:参数2
  52. 返回参数3是 异常
  53. */
  54. func NewMultiFormRequest(params map[string]string, fileTypeParams []FileForm) (_ io.Reader, _ string, err error) {
  55. requestBody := newRequestBody()
  56. bodyWriter := multipart.NewWriter(requestBody)
  57. defer func() {
  58. err = bodyWriter.Close()
  59. }()
  60. writeFile := func(file FileForm) (err error) {
  61. fileWriter, err := bodyWriter.CreateFormFile(file.filedName, file.fileName)
  62. if err != nil {
  63. return err
  64. }
  65. if file.reader == nil {
  66. fileReader, err := os.Open(file.filePath)
  67. if err != nil {
  68. return err
  69. }
  70. defer func() {
  71. err = fileReader.Close()
  72. }()
  73. file.reader = fileReader
  74. }
  75. _, err = io.Copy(fileWriter, file.reader)
  76. if err != nil {
  77. return err
  78. }
  79. return nil
  80. }
  81. writeParams := func(key, value string) error {
  82. return bodyWriter.WriteField(key, value)
  83. }
  84. for key, value := range params {
  85. if err := writeParams(key, value); err != nil {
  86. return nil, "", err
  87. }
  88. }
  89. for _, file := range fileTypeParams {
  90. if err := writeFile(file); err != nil {
  91. return nil, "", err
  92. }
  93. }
  94. contentType := bodyWriter.FormDataContentType()
  95. return requestBody, contentType, nil
  96. }