这一篇是我在HTTP Post multipart file upload with J2ME的中文翻译,网址在使用J2ME的HTTP Post方式之多段文件上传!
为了备份,并转贴在此:
这里有个J2ME类别用来透过HTTP POST多段请求方式处理档案上传。
程式码:HttpMultipartRequest类别
import java.io.ByteArrayOutputStream; import java.io.InputStream; import java.io.OutputStream; import java.util.Enumeration; import java.util.Hashtable; import javax.microedition.io.Connector; import javax.microedition.io.HttpConnection; public class HttpMultipartRequest { static final String BOUNDARY = "----------V2ymHFg03ehbqgZCaKO6jy"; byte[] postBytes = null; String url = null; public HttpMultipartRequest(String url, Hashtable params, String fileField, String fileName, String fileType, byte[] fileBytes) throws Exception { this.url = url; String boundary = getBoundaryString(); String boundaryMessage = getBoundaryMessage(boundary, params, fileField, fileName, fileType); String endBoundary = "\r\n--" + boundary + "--\r\n"; ByteArrayOutputStream bos = new ByteArrayOutputStream(); bos.write(boundaryMessage.getBytes()); bos.write(fileBytes); bos.write(endBoundary.getBytes()); this.postBytes = bos.toByteArray(); bos.close(); } String getBoundaryString() { return BOUNDARY; } String getBoundaryMessage(String boundary, Hashtable params, String fileField, String fileName, String fileType) { StringBuffer res = new StringBuffer("--").append(boundary).append("\r\n"); Enumeration keys = params.keys(); while(keys.hasMoreElements()) { String key = (String)keys.nextElement(); String value = (String)params.get(key); res.append("Content-Disposition: form-data; name=\"").append(key).append("\"\r\n") .append("\r\n").append(value).append("\r\n") .append("--").append(boundary).append("\r\n"); } res.append("Content-Disposition: form-data; name=\"").append(fileField).append("\"; filename=\"").append(fileName).append("\"\r\n") .append("Content-Type: ").append(fileType).append("\r\n\r\n"); return res.toString(); } public byte[] send() throws Exception { HttpConnection hc = null; InputStream is = null; ByteArrayOutputStream bos = new ByteArrayOutputStream(); byte[] res = null; try { hc = (HttpConnection) Connector.open(url); hc.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + getBoundaryString()); hc.setRequestMethod(HttpConnection.POST); OutputStream dout = hc.openOutputStream(); dout.write(postBytes); dout.close(); int ch; is = hc.openInputStream(); while ((ch = is.read()) != -1) { bos.write(ch); } res = bos.toByteArray(); } catch(Exception e) { e.printStackTrace(); } finally { try { if(bos != null) bos.close(); if(is != null) is.close(); if(hc != null) hc.close(); } catch(Exception e2) { e2.printStackTrace(); } } return res; } }
范例使用
这里有个程式码片段用来透过HttpMultipartRequest类别来上传一个档案:
byte[] fileBytes = getFileBytes(); //retrieve file bytes with your own code Hashtable params = new Hashtable(); params.put("custom_param", "param_value"); params.put("custom_param2", "param_value2"); HttpMultipartRequest req = new HttpMultipartRequest( "http://www.server.com/uploadScript.php", params, "upload_field", "original_filename.png", "image/png", fileBytes ); byte[] response = req.send();
伺服器范例程式码(PHP)
这个PHP范例程式用来处理上传,它不会真正储存上传档案,只会显示一些关于上传档案的大小及参数的讯息。
<?php $filesize = filesize($_FILES['upload_field']['tmp_name']); echo "The uploaded file size is " . $filesize . " bytes\n"; foreach($_POST as $key => $value) { echo "Parameter name: " . $key . ", value: " . $value . "\n"; } ?>