1. 程式人生 > >multipart/form-data圖片上傳實現方法(上傳檔案到Nimg)

multipart/form-data圖片上傳實現方法(上傳檔案到Nimg)

        在實現multipart/form-data的圖片上傳時,需要用\r\n來分隔每一行,在JAVA中實現multipart/form-data的圖片上傳時則可以使用System.getProperty("line.separator")來進行每一行的分割。但是如果要將程式碼用於Android中,則切記不能使用System.getProperty("line.separator")來進行每一行的分割,因為在Android中System.getProperty("line.separator")的結果是\n,在JAVA中則是\r\n。

        故不推薦大家使用System.getProperty("line.separator"),會出現一些意想不到的問題,並且出現這些問題還不易追溯到System.getProperty("line.separator")的使用上來。

        下面貼上JAVA和Android都可使用的上傳程式碼,改程式碼是針對Nimg實現,如需要使用與其他環境,則針對環境更改“上傳引數”處程式碼即可。

UploadImage.java

package cloud.test;
import java.io.BufferedReader;
import java.io.ByteArrayOutputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import
 java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.URL; import java.util.UUID; /**  * 圖片上傳  * @author Cloud  * @version 1.0  */ public class UploadImage {    private static final String MULTIPART_FORM_DATA="multipart/form-data";    private static final String TWOHYPHENS = "--"
;     private static final String BOUNDARY = "---------------------------"+UUID.randomUUID();     private static final String LINEEND = "\r\n";     private static final String FORMNAME="userfile";          private String actionUrl;     private int timeout;          private String fileName;     private byte[] data;     private String imageType;          /**      * 初始化圖片上傳工具      * @param actionUrl - 圖片儲存地址      * @param timeout - 圖片上傳超時時間 (毫秒)      */     public UploadImage(String actionUrl,int timeout){        this.actionUrl=actionUrl;        this.timeout=timeout;     }          /**      * 設定上傳內容      * @param fileName - 圖片名稱      * @param data - 圖片內容      * @param imageType - 圖片格式      */     public void setData(String fileName,byte[] data,ImageType imageType) throws Exception{        this.fileName=fileName;        this.data=data;        this.imageType=imageType.getValue();                if(imageType!=null){           String extension =imageType.getValue().substring(imageType.getValue().indexOf("/")+1, imageType.getValue().length());           this.fileName=fileName+"."+extension;        }     }          /**      * 上傳      * @return - 格式<br/>      * {<br/>      * &nbsp;&nbsp;&nbsp;&nbsp;"code": 200,<br/>      * &nbsp;&nbsp;&nbsp;&nbsp;"msg": "upload success!",<br/>      * &nbsp;&nbsp;&nbsp;&nbsp;"data": {<br/>      * &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"t": "png",<br/>      * &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"userpath": "01",<br/>      * &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"md5": "6f8b47ec3b8ea08335cb6e13cbbe96dc",<br/>      * &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"url": "01/6f8b47ec3b8ea08335cb6e13cbbe96dc.png"<br/>      * &nbsp;&nbsp;&nbsp;&nbsp;}<br/>      * }<br/>      */     public String upload(){        return upload(null,null);     }               /**      * 上傳      * @param actType - 圖片處理命令      * @param param - 圖片處理引數      * @return - 格式<br/>      * {<br/>      * &nbsp;&nbsp;&nbsp;&nbsp;"code": 200,<br/>      * &nbsp;&nbsp;&nbsp;&nbsp;"msg": "upload success!",<br/>      * &nbsp;&nbsp;&nbsp;&nbsp;"data": {<br/>      * &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"t": "png",<br/>      * &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"userpath": "01",<br/>      * &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"md5": "6f8b47ec3b8ea08335cb6e13cbbe96dc",<br/>      * &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"url": "01/6f8b47ec3b8ea08335cb6e13cbbe96dc.png"<br/>      * &nbsp;&nbsp;&nbsp;&nbsp;}<br/>      * }<br/>      */     public String upload(ActType actType,String param){        HttpURLConnection conn = null;         DataOutputStream output = null;         BufferedReader input = null;                 try {           URL url = new URL(actionUrl);             conn = (HttpURLConnection) url.openConnection();             conn.setConnectTimeout(timeout);             conn.setDoInput(true);             conn.setDoOutput(true);             conn.setUseCaches(false);             conn.setRequestMethod("POST");             conn.setRequestProperty("Connection""keep-alive");             conn.setRequestProperty("Content-Type", MULTIPART_FORM_DATA + "; boundary=" + BOUNDARY);             conn.connect();             output = new DataOutputStream(conn.getOutputStream());                          StringBuilder sb = new StringBuilder();             if(actType!=null&&param!=null){              /**                * 上傳引數                */               sb.append(TWOHYPHENS + BOUNDARY + LINEEND);               sb.append("Content-Disposition: form-data; name=\"act\"" + LINEEND);               sb.append(LINEEND);               sb.append(actType.getValue() + LINEEND);               output.writeBytes(sb.toString());                              sb = new StringBuilder();               sb.append(TWOHYPHENS + BOUNDARY + LINEEND);               sb.append("Content-Disposition: form-data; name=\"param\"" + LINEEND);               sb.append(LINEEND);               sb.append(param + LINEEND);               output.writeBytes(sb.toString());             }                       /**            * 上傳圖片            */           sb = new StringBuilder();           sb.append(TWOHYPHENS + BOUNDARY + LINEEND);           sb.append("Content-Disposition: form-data; name=\"" + FORMNAME + "\"; filename=\"" + fileName + "\"" + LINEEND);           sb.append("Content-Type: " + imageType + LINEEND);           sb.append(LINEEND);            output.writeBytes(sb.toString());            output.write(data, 0, data.length);            output.writeBytes(LINEEND);                /**             * 上傳結束             */            output.writeBytes(TWOHYPHENS + BOUNDARY + TWOHYPHENS + LINEEND);            output.flush();                        /**            * 返回資訊            */            int code = conn.getResponseCode();            System.out.println(code);            if (code != 200) {                throw new RuntimeException("請求'" + actionUrl + "'失敗!");            }            input = new BufferedReader(new InputStreamReader(conn.getInputStream()));            StringBuilder response = new StringBuilder();            String oneLine;            while ((oneLine = input.readLine()) != null) {                response.append(oneLine + LINEEND);            }            return response.toString();        } catch (IOException e) {             throw new RuntimeException(e);         } finally {             try {                 if (output != null) {                     output.close();                 }                 if (input != null) {                     input.close();                 }             } catch (IOException e) {                 throw new RuntimeException(e);             }             if (conn != null) {                 conn.disconnect();             }         }     } }

 ActType.java

package cloud.test;
/**
 * 影象上傳命令
 * @author Cloud
 * @version 1.0
 */
public enum ActType {
   /**
    * 旋轉
    */
   ROTATE("rotate"),
   /**
    * 裁剪
    */
   CROP("crop"),
   /**
    * 縮放
    */
   RESIZE("resize");
   
   private String value;
   
   privateActType(String value{
      this.value=value;
   }
   public String getValue({
      return value;
   }
}

ImageType.java

package cloud.test;

/**
 * 圖片格式
 * @author Cloud
 * @version 1.0
 */
public enum ImageType {
   /**
    * JPG格式
    */
   JPG("image/jpg"),
   /**
    * PNG格式
    */
   PNG("image/png"),
   /**
    * GIF格式
    */
   GIF("image/gif"),
   /**
    * JPEG格式
    */
   JPEG("image/jpeg");
   
   private String value;
   
   privateImageType(String value{
      this.value=value;
   }

   public String getValue({
      return value;
   }
}

相關推薦

multipart/form-data圖片實現方法(檔案Nimg)

        在實現multipart/form-data的圖片上傳時,需要用\r\n來分隔每一行,在JAVA中實現multipart/form-data的圖片上傳時則可以使用System.getProperty("line.separator")來進行每一行的分割。但是如果要將程式碼用於Android中

Android模擬 HTTP multipart/form-data 請求協議資訊實現圖片

轉自:http://www.linuxidc.com/Linux/2011-08/41944.htm 問題: Android應用中,當遇到填寫使用者資訊、發表評論等操作,不可避免會遇到“form表單操作”(類似web form操作)上傳圖片的功能。 在這種情況下,使用

Android HTTP multipart/form-data 請求協議資訊實現圖片

問題: Android應用中,當遇到填寫使用者資訊、發表評論等操作,不可避免會遇到“form表單操作”(類似web form操作)上傳圖片的功能。 在這種情況下,使用Android的HTTPConnection/ ApacheHTTP 通過POST 和GET的方式就實現不了

騰訊雲OCR身份證識別 multipart/form-data和application/json 格式方法實現

鑑權簽名方法類: package com.x.common.utils; import javax.crypto.Mac; import javax.crypto.spec.SecretKeySpec; import java.util.Base64; import java.util.R

Atitit 檔案功能的實現 圖片 視訊 目錄 1. 原理 1 1.1. http post編碼 multipart / form-data 1 1.2. 臨時檔案模式 最簡單 2 1.3

Atitit 檔案上傳功能的實現 圖片 視訊   目錄 1. 上傳原理 1 1.1. http post編碼 multipart / form-data 1 1.2. 臨時檔案模式  最簡單 2 1.3. 位元組陣列模式  簡單 2

[寫著玩]理解multipart/form-data,構造http表單實現android圖片

關於multipart/form-data,可參考https://blog.csdn.net/zshake/article/details/77985757 客戶端  引數解釋,上傳主方法 private void submit() { Map<String, Obj

<form> multipart/form-data 圖片

mbo tar nco 報錯 dial kit [] zip bbc 1 <form method="post" enctype="multipart/form-data" id="fileinfo" name="fileinf

WebApi實現Ajax模擬Multipart/form-data方式多文件

vid 基本 rip err tps del 多文件 delete back 前端頁面代碼: <input type="file" class="file_control" /><br /> <input type="file" cla

新浪釋出帶圖片的微博[multipart/form-data格式檔案]

在使用新浪微博的API更新一條帶圖片的微博時,需要使用multipart/form-data風格的POST 需要在request頭設定Content-type Content-type = multipart/form-data; boundary=xxxx 其中 bou

關於ajax 圖片 enctype="multipart/form-data"的問題

該屬性為提交表單瀏覽器對資料的編碼方式,常用有兩種:application/x-www-form-urlencoded和multipart/form-data,預設為application/x-www-form-urlencoded。 當action為get時候,瀏覽器用x-www-form-urlencod

python通過http(multipart/form-data)檔案方法

之前寫過一篇部落格,說的如何python如何通過http下載檔案,今天寫一篇部落格來介紹如下,python如何通過request庫實現上傳檔案 這裡主要是解決multipart/form-data這種格式的檔案上傳,基本現在http協議上傳檔案基本上都是通過這種格式上傳 一、思路 一般情況下,如果我們往一個地

HTTP multipart/form-data 方式說明(有8個註意點)

ria ubi reference 就會 ros pda www tran cep ( From: http://home.meegoq.com/home-space-do-blog-uid-17-id-81.html ) HTTP multipart/form-data

HTTP使用 multipart/form-data 多個字段(包括文件字節流 octet-stream)

sprintf logs pcs cer lpstr struct written all normal 自己用到的一個向服務器上傳多個字段的實例,代碼不全,僅做參考。 用的是WinINet,上傳的字段中包括文件字節流 /* PHttpRequest中自行組裝body

使用python或robotframework調multipart/form-data接口文件

multipart 比較 分享圖片 方法 更強 構造 ima force ann 這幾天調一個multipart/form-data類型的接口,遇到點小阻礙。之前同事有使用urllib庫寫了個類似的方法實現,比較長,想要改的時候發現不太好使。在網上查找發現用request

PHP中以multipart/form-data文件流

Curl multipart/form-data 上傳類 class UploadPart { protected static $url; protected static $delimiter; protected static $instance; pub

檔案下載時,在form表單中設定屬性enctype=“multipart/form-data”的情況下,如何獲取表單提交的值?

一、問題描述 檔案上傳下載時,在form表單中設定屬性enctype=“multipart/form-data”的情況下,如何獲取表單提交的有關使用者資訊的值?(比如:textfield、radio等屬性中的值) 二、解決方法 1、情況一:沒有對user物件進行封裝 方法:

Multipart/form-data POST檔案

Multipart/form-data POST檔案上傳 簡單的HTTP POST 大家通過HTTP向伺服器傳送POST請求提交資料,都是通過form表單提交的,程式碼如下: <form method="post"action="http://w.sohu.com" >

multipart/form-data檔案

form表單的enctype屬性:規定了form表單資料在傳送到伺服器時候的編碼方式 application/x-www-form-urlencoded:預設編碼方式 multipart/form-data:指定傳輸資料為二進位制資料,例如圖片、mp3、檔案 text/plain:純文字的傳輸

Nginx檔案413錯誤Processing of multipart/form-data request failed. Unexpected EOF read on the socket

問題描述: 利用ajax通過nginx上傳檔案到tomcat時,前端url報413http錯誤。 後臺tomcat控制檯也輸出對應的異常資訊,如下。 解決方法: 新增上傳檔案大小的最大值。 修改nginx的配置檔案:nginx.conf。目錄一般在 /usr/local/n

檔案為什麼要用 enctype="multipart/form-data" ???

在檔案上傳的過程中發現,HTML表單需要設定enctype="multipart/form-data"這個屬性,雖然不這麼設定的確無法上傳,但這是為什麼呢? HTML表單如何打包資料檔案是由enctype這個屬性決定的。enctype有以下幾種取值: application/x-ww