javaアナログフォーム方式でアップロードファイルを提出します。


テンセントのWeChatを開発する時、マルチメディアのファイルのアップロードとダウンロードに出会います。
http    : POST/FORM
http://file.api.weixin.qq.com/cgi-bin/media/upload?access_token=ACCESS_TOKEN&type=TYPE
    (  curl  , FORM             ):
curl -F [email protected] "http://file.api.weixin.qq.com/cgi-bin/media/upload?access_token=ACCESS_TOKEN&type=TYPE"
はjspページでフォームを作り、formで画像ファイルを提出します。提出したurlは上のurlで、木の問題をテストします。
このようにして、鍵情報accessTokenはページに露出し、アップロード成功後のメディアIDも取得できない。
解決方法:まずファイルをサーバーにアップロードして、サーバーからファイルを取得して、次のurlとHttpURLConnectionで接続を作ります。
http://file.api.weixin.qq.com/cgi-bin/media/upload?access_token=ACCESS_TOKEN&type=TYPE
を選択して、出力ストリームの形式でファイルを上記のurlに書き込み、ファイルをWeChatサーバにアップロードすることができます。
ネットでいくつかのコードを検索して、いくつかの改造をしました。
public class FileUpload{
/**
*フォームをシミュレートし、ファイルをアップロードし、出力ストリームとしてファイルをurlに書き込み、入力ストリームでurlの応答を取得します。
* 
*@param url住所formフォームurlアドレスを要求します。
*@param filePathファイルはサーバでパスを保存します。
*@return String urlの応答情報戻り値
*@throws IOException
*/
public String send(String url,String filePath)throws IOException{
Stering result=null;
File file=new File(filePath)
if(file.exists()124file.isfile(){
throw new IOException(「ファイルは存在しません」);
)
/**
*第一部
*/
URL urlObj=new URL(url);
//接続
HttpURLConnection con=(HttpURLConnection)urlObj.openConnection()
/**
*キー値の設定
*/
con.set Request Method(「POST」);Post形式でフォームを提出し、デフォルトget方式
con.set DoInput(true);
con.set Douutput(true);
con.setUseCaches(false)//ポスト方式ではキャッシュは使えません。
//設定要求ヘッダ情報
コンサート.set Request Property(「Connection」、「Keep-Alive」);
con.set Request Property(「Charest」、「UTF-8」);
//境界の設定
String BOUNDARY=「--」+System.current TimeMillis();
con.set Request Property(「Content-Type」、「multiipad/form-data」)boundary="+BOUNDARY";
//本文情報の要求
//第一部:
StringBuider sb=new StringBuider()
sb.apped(「-」)//二つの線を多く持たなければなりません
sb.apped(BOUNDARY);
sb.apped(「\r」)
sb.apped("Conttentt Dispposition:form-data;name=\"file\"filename=\"
+file.getName()+「\」\r";;
sb.apped(「Content-Type:aplication/octet stream\r」);
byte[]head=sb.toString().getBytes("utf-8")
//取得出力ストリーム
OutputStream out=new Data Output Stream(con.get Output Stream);
//出力ヘッダ
out.write(head)
//ファイル本体
//ファイルを流したままurlに押し込む
Data InputStream in=new Data InputStream(new FileInputStream);
int bytes=0
byte[]bufferOut=new byte[1024];
while((bytes=in.read)!=-1){
out.write(bufferOut,0,bytes);
)
i.close()
//末尾
byte[/]foot=(\\r-」+BOUNDARY+「-\r」).getByttes(「utf-8」)//最後のデータ分離線を指定します。
out.write(foot)
out.flush()
out.close()
StringBurer buffer=new StringBurer()
BufferedReader reader=null;
try{
//BufferedReader入力ストリームを定義し、URLの応答を読み出す。
reader=new BufferedReader(new InputStream Reader(con.get InputStream);
String ling=null;
while(line=reader.readline)!null){
//System.out.println;
buffer.apped;
)
if(result==null){
result=buffer.toString()
)
}catch(IOException e){
System.out.println(「POSTリクエスト送信で異常!」+e):
e.print StockTrace();
throw new IOException(「データ読み出し異常」);
}finally{
if(reader!=null){
reader.close()
)
)
return relt;
)
public static void main(String[]args)throws IOException{
String filePath="C:/Dockments and Settings/user/My Dockments/Downloads/qrch ode_for_gh_.d 62 ce 15 fc 448_430.jpg";
String sendUrl="http://file.api.weixin.qq.com/cgi-bin/media/upload?access_token=Access Token&type=イメージ";
Stering result=null;
FileUpload fileUpload=new FileUpload()
result=fileUpload.send(sendUrl,filePath)
System.out.println(result);
)
出力結果
{「type」:「イメージ」、「media_」id":"XXXX-7 nM 6 VE 4 j","created_"at「1384934358」