我在用java调用云开发HTTPAPI上传文件时,总返回400错误,麻烦大神帮忙看下问题出在哪?
import cn.hutool.json.JSONObject;
import com.dimon.cloud.commons.rest.ApiResponse;
import com.dimon.cloud.customize.feign.WechatApi;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.mime.MultipartEntityBuilder;
import org.apache.http.impl.client.HttpClientBuilder;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import javax.validation.constraints.NotNull;
import java.io.IOException;
/**
* @Author: He Zhigang
* @Date: 2019/10/12 18:00
* @Description:
*/
@RestController
public class BackendController {
@Autowired
String accessToken;
@Autowired
WechatApi wechatApi;
@PostMapping("/upload/prod/img")
public ApiResponse uploadFile(@NotNull MultipartFile file) throws IOException {
String dir = "p_cust/prod/img/";
String path = dir + file.getOriginalFilename();
JSONObject reqBody = new JSONObject();
reqBody.put("env", "dev-4cs4fs");
reqBody.put("path", path);
JSONObject respJson = wechatApi.uploadFile(accessToken, reqBody);
String url = respJson.getStr("url");
// HttpResponse httpResponse = HttpRequest.post(url)
// .contentType("multipart/form-data")
// .header("Content-Type", "multipart/form-data")
// .form("key", path)
// .form("Signature", respJson.getStr("authorization"))
// .form("x-cos-security-token", respJson.getStr("token"))
// .form("x-cos-meta-fileid", respJson.getStr("cos_file_id"))
// .form("file", file)
// .execute();
HttpClient httpClient = HttpClientBuilder.create().build();
HttpPost httpPost = new HttpPost(url);
httpPost.setHeader("Content-Type", "multipart/form-data");
MultipartEntityBuilder builder = MultipartEntityBuilder.create();
builder.addBinaryBody("file", file.getBytes())
.addTextBody("key", path)
.addTextBody("Signature", respJson.getStr("authorization"))
.addTextBody("x-cos-security-token", respJson.getStr("token"))
.addTextBody("x-cos-meta-fileid", respJson.getStr("cos_file_id"));
httpPost.setEntity(builder.build());
org.apache.http.HttpResponse res = httpClient.execute(httpPost);
return ApiResponse.ok().setBody(res);
}
}
上面我用了两种不同的HTTP client 都是返回同样的错误。
请问这个问题后面有解决吗
String fileName= (String) params.get("fileName"); //获取上传连接 String url="https://api.weixin.qq.com/tcb/uploadfile?access_token="+ URLEncoder.encode(URLEncoder.encode(Constants.getAccessToken())); JsonObject param=new JsonObject(); param.addProperty("env",Constants.wx_config_env); param.addProperty("path",(String)params.get("path")); String result=new HttpRequestUtil().request(url,"post",param); System.out.println(result); final JsonObject resJson=new Gson().fromJson(result,JsonObject.class); if(resJson.get("errcode")!=null && resJson.get("errcode").getAsInt()==0){//获取上传链接成功 String uploadUrl=resJson.get("url").getAsString(); String TYPE = "application/octet-stream"; // byte file[]=Base64Utils.decodeFromString(base64.substring(base64.indexOf(",")+1)); RequestBody fileBody = RequestBody.create(MediaType.parse(TYPE), file); okhttp3.MultipartBody.Builder builder = new okhttp3.MultipartBody.Builder(); MultipartBody multipartBody = builder.setType(MultipartBody.FORM) .addFormDataPart("key",param.get("path").getAsString()) .addFormDataPart("Signature",resJson.get("authorization").getAsString()) .addFormDataPart("x-cos-security-token",resJson.get("token").getAsString()) .addFormDataPart("x-cos-meta-fileid",resJson.get("cos_file_id").getAsString()) .addFormDataPart("file",URLEncoder.encode(fileName),fileBody).build(); Request request1= (new Request.Builder()).url(uploadUrl).post(multipartBody).build(); OkHttpClient.Builder b=new okhttp3.OkHttpClient.Builder(); OkHttpClient okHttpClient=b.build();
Response response1 = okHttpClient.newCall(request1).execute();
老兄,最后这个问题怎么解决的
这问题解决了吗?