2014-09-10 1 views
0

현재 2 개의 멀티 파트 요청을 개별적으로 스트리밍하고 있습니다. Golang이 http 멀티 파트 요청에 여러 파일 추가

  1. 가 BLOB에 대한 설명으로 JSON 파일이 포함 된 BLOB으로 파일을 포함

어떻게 다중와 동시에 업로드 할 수 있습니까?

이것은 2 번 실행되는 요청입니다. 나는이 일 개 요청

func(c *Client) Upload(h *UploadHandle) (*PutResult, error) { 
     bodyReader, bodySize, err := h.Read() 
     if err != nil { 
      return nil, fmt.Errorf("Failed to peek the body size %v", err) 
     } 

     if bodySize > constants.MaxDropSize { 
      return nil, errors.New("The size of the body is to big") 
     } 

     pipeReader, pipeWriter := io.Pipe() 
     writer := multipart.NewWriter(pipeWriter) 

     errChan := make(chan error, 1) 
     go func() { 
      defer pipeWriter.Close() 
      part, err := writer.CreateFormFile(h.DropRef, h.DropRef) 
      if err != nil { 
       errChan <- err 
       return 
      } 
      _, err = io.Copy(part, bodyReader) 
      if err == nil { 
       err = writer.Close() 
      } 
      errChan <- err 
     }() 

     uploadUrl := fmt.Sprintf("%s/drops/upload", c.Server) 
     req, err := http.NewRequest("POST", uploadUrl, pipeReader) 
     if err != nil { 
      return nil, err 
     } 
     req.Header.Add("Content-Type", writer.FormDataContentType()) 
     req.Body = ioutil.NopCloser(pipeReader) 

     resp, err := c.Do(req) 
     if err != nil { 
      return nil, fmt.Errorf("Failed doing request: %v", err) 
     } 
     defer resp.Body.Close() 

     // Handling the error the routine may caused 
     if err := <-errChan; err != nil { 
      return nil, err 
     } 
     if resp.StatusCode != 200 { 
      return nil, fmt.Errorf("The server responded with a status %d", resp.StatusCode) 
     } 
    return &PutResult{h.DropRef, bodySize}, nil 
} 

답변

1
당신은 단순히 다시 CreateFormFile 전화

(또는 CreateFormField)에이 개 파일을 추가하고 작가가 반환하는 JSON을 쓰고 싶어요.

CreatePart를 호출 한 후, 이전 부분은 더 이상 기록 할 수 없습니다 다음 docs에 따라 때문에

j, err := writer.CreateFormFile("meta", h.DropRef + ".json") 
enc := json.NewEncoder(j) 
enc.Encode(some-struct-you-want-to-write-as-json) 

그냥, 당신은 새로운 하나를 만들기 전에 첫 번째 파일을 작성 완료해야합니다.