原生 选择图片并上传

IOS:

step1
在RootViewController.mm脚本中引入

step2
在 RootViewController.mm 在loadView方法中定义一个静态变量供后文使用
static UIImagePickerController *selectImage = nullptr;
并且在viewDidLoad()方法中设置代理
_picker = [[UIImagePickerController alloc]init];
//遵守代理
_picker.delegate = self;
selectImage = _picker;

step3
在 RootViewController.mm中定义一个静态方法,供js调用
+(void) openPhoto{
[[RootViewController alloc] init];
[[RootViewController alloc] selectPhoto]; //打开相册
}

step4
在 RootViewController.mm中定义一个打开相册方法
-(void)selectPhoto{
selectImage.sourceType =UIImagePickerControllerSourceTypePhotoLibrary;
//是否允许编辑
selectImage.allowsEditing = NO;
UIViewController *topRootViewController = [[UIApplication sharedApplication] keyWindow].rootViewController;
// 在这里加一个这个样式的循环
while (topRootViewController.presentedViewController) {
// 这里固定写法
topRootViewController = topRootViewController.presentedViewController;
}
// 然后再进行present操作
[topRootViewController presentViewController:selectImage animated:YES completion:nil];
}

step5
在 RootViewController.mm中设置选择图片完成后的回调方法
-(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary<NSString *,id> )info{
NSLog(@“info—>成功:%@”, info);
char temp[255] = {0};
NSString * code = [[NSString alloc] initWithFormat:@"%@", info[UIImagePickerControllerImageURL]];
const char
tcode = [code UTF8String];
sprintf(temp,“cc.vv.anysdk.setPhotoPath(’%s’)”,tcode);
se::ScriptEngine::getInstance()->evalString(temp);
}

step6
在 RootViewController.mm中定义上传图片到服务器的函数
+(void) uploadFileAgain :(NSString *) paramString { //paramString 是一个JSO格式
// NSMutableDictionary *params = [paramString JSONValue];
NSMutableDictionary *params = [NSJSONSerialization JSONObjectWithData:[paramString dataUsingEncoding:NSUTF8StringEncoding] options:NSJSONReadingAllowFragments error:0];
NSString *urlString=[params objectForKey:@“sendUrl”];
NSURL *url = [NSURL URLWithString:urlString];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
request.HTTPMethod = @“POST”;
NSString *boundary = @“wfWiEWrgEFA9A78512weF7106A”;
request.allHTTPHeaderFields = @{
@“Content-Type”:[NSString stringWithFormat:@“multipart/form-data; boundary=%@”,boundary]
};
NSMutableData *postData = [[NSMutableData alloc]init];//请求体数据
NSArray *arrayQuery = @[];//空数组
arrayQuery = @[@“clubId”,@“token”];
for (NSString *key in params) {
//循环参数按照部分1、2、3那样循环构建每部分数据
NSString *pair = [NSString stringWithFormat:@"–%@\r\nContent-Disposition: form-data; name="%@"\r\n\r\n",boundary,key];
[postData appendData:[pair dataUsingEncoding:NSUTF8StringEncoding]];

    id value = [params objectForKey:key];
    if ([value isKindOfClass:[NSString class]]) {
        [postData appendData:[value dataUsingEncoding:NSUTF8StringEncoding]];
    }else if ([value isKindOfClass:[NSData class]]){
        [postData appendData:value];
    }
    [postData appendData:[@"\r\n" dataUsingEncoding:NSUTF8StringEncoding]];
}
NSString *imageDirectory = [params objectForKey:@"path"];
NSData *Imagedata = [NSData dataWithContentsOfURL:[NSURL URLWithString:imageDirectory]];
UIImage *image = [UIImage imageWithData:Imagedata];
//    NSLog(@"开始上传2");
//添加image并转成二进制
NSData* data = UIImagePNGRepresentation(image);
//文件部分

// NSString *filename = [filePath lastPathComponent];
NSString *filename = @“test.png”;
NSString *fileKey = @“file”;
NSString *contentType = @“application/octet-stream”;
NSString *filePair = [NSString stringWithFormat:@"–%@\r\nContent-Disposition: form-data; name="%@"; filename="%@" ; ContentType=%@\r\n\r\n",boundary,fileKey,filename,contentType];
[postData appendData:[filePair dataUsingEncoding:NSUTF8StringEncoding]];
[postData appendData:data]; //加入文件的数据
[postData appendData:[@"\r\n" dataUsingEncoding:NSUTF8StringEncoding]];
//设置结尾
[postData appendData:[[NSString stringWithFormat:@"–%@–\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]];
request.HTTPBody = postData;
//设置请求头总数据长度
[request setValue:[NSString stringWithFormat:@"%lu",(unsigned long)postData.length] forHTTPHeaderField:@“Content-Length”];
NSData *returnData = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];
}

赞一个,如果也有安卓端的就更好了

安卓端下午发上来

android:

step1
引入上传图片类 //自己编写实现的
import com.xx.xx.UploadUtil; //自己的包名 UploadUtil.java 与 appAcitivity同目录
在appAcitivity.java文件中定义一个私有变量 app
private static AppActivity app = null;
在onCreate函数中进行赋值
app = this;

step2
定义一个静态方法供js调用
public static void selectImage (String str){
Intent intent = new Intent();
intent.setAction(Intent.ACTION_PICK);
app.startActivityForResult(intent, 1);
}

step3
给图片选择添加回调方法
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if(resultCode==Activity.RESULT_OK)
{
Uri uri = data.getData();
Log.e(TAG, "uri = "+ uri);
try {
String[] pojo = {MediaStore.Images.Media.DATA};

            Cursor cursor = managedQuery(uri, pojo, null, null,null);
            if(cursor!=null)
            {
                ContentResolver cr = this.getContentResolver();
                int colunm_index = cursor.getColumnIndexOrThrow(pojo[0]);
                
                cursor.moveToFirst();
                String path = cursor.getString(colunm_index);
                if(path.endsWith("jpg")||path.endsWith("png"))
                {
                    picPath = path;
                    File file = new File(picPath);
                    final Map<String, String> params = new HashMap<String, String>();  //需要传给后台的参数
                    params.put("key",value);  //  根据自己项目自行更改key与value值
                    params.put("key", value); //  根据自己项目自行更改key与value值
                    String request = UploadUtil.uploadFile( file,params ,requsetUrl);
                    
                }else{
                    Toast.makeText(this, "不支持的文件类型", Toast.LENGTH_SHORT).show();
                }
            }else{

            }
            
        } catch (Exception e) {
            Log.e(TAG, "报错 = " + e);
        }
    }
    
    super.onActivityResult(requestCode, resultCode, data);
}

step6
编写上传的类 UploadUtil.java
package com.xx.xx;
import java.io.DataOutputStream;
import java.io.File;
import java.util.HashMap;
import java.util.Map;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.UUID;

import android.util.Log;

/**
*

  • �ϴ�������
  • @author spring sky
  • Email:vipa1888@163.com
  • QQ:840950105
  • MyName:ʯ����
    /
    public class UploadUtil {
    private static final String TAG = “uploadImage”;
    private static final int TIME_OUT = 10
    1000; //��ʱʱ��
    private static final String CHARSET = “utf-8”; //���ñ���
    /**
    • android�ϴ��ļ���������

    • @param file ��Ҫ�ϴ����ļ�

    • @param RequestURL �����rul

    • @return ������Ӧ������
      */
      public static String uploadFile(File file,Map<String, String> params,String RequestURL)
      {
      Log.e(TAG, “开始去上传------------”);
      String result = null;
      String BOUNDARY = UUID.randomUUID().toString(); //�߽��ʶ �������
      String PREFIX = “–” , LINE_END = “\r\n”;
      String CONTENT_TYPE = “multipart/form-data”; //��������

      try {
      URL url = new URL(RequestURL);
      HttpURLConnection conn = (HttpURLConnection) url.openConnection();
      conn.setReadTimeout(TIME_OUT);
      conn.setConnectTimeout(TIME_OUT);
      conn.setDoInput(true); //����������
      conn.setDoOutput(true); //���������
      conn.setUseCaches(false); //������ʹ�û���
      conn.setRequestMethod(“POST”); //����ʽ
      conn.setRequestProperty(“Charset”, CHARSET); //���ñ���
      conn.setRequestProperty(“connection”, “keep-alive”);
      conn.setRequestProperty(“Content-Type”, CONTENT_TYPE + “;boundary=” + BOUNDARY);
      StringBuilder sb2 =new StringBuilder();
      for( Map.Entry<String, String> entry : params.entrySet()) {
      sb2.append(PREFIX);
      sb2.append(BOUNDARY);
      sb2.append(LINE_END);
      sb2.append(“Content-Disposition: form-data; name=”"+ entry.getKey() + “”"+ LINE_END);
      sb2.append(“Content-Type: text/plain; charset=”+ CHARSET + LINE_END);
      sb2.append(“Content-Transfer-Encoding: 8bit”+ LINE_END);
      sb2.append(LINE_END);
      sb2.append(entry.getValue());
      sb2.append(LINE_END);
      }
      DataOutputStream dos =new DataOutputStream(conn.getOutputStream());
      dos.write(sb2.toString().getBytes());
      Log.e(TAG, “属性添加完毕-------------”);
      if(file!=null)
      {
      StringBuffer sb = new StringBuffer();
      sb.append(PREFIX);
      sb.append(BOUNDARY);
      sb.append(LINE_END);
      /**
      * �����ص�ע�⣺
      * name�����ֵΪ����������Ҫkey ֻ�����key �ſ��Եõ���Ӧ���ļ�
      * filename���ļ������֣�������׺���� ����:abc.png
      */

       	sb.append("Content-Disposition: form-data; name=\"file\"; filename=\""+file.getName()+"\""+LINE_END); 
       	sb.append("Content-Type: application/octet-stream; charset="+CHARSET+LINE_END);
       	sb.append(LINE_END);
       	dos.write(sb.toString().getBytes());
       	InputStream is = new FileInputStream(file);
       	byte[] bytes = new byte[1024];
       	int len = 0;
       	while((len=is.read(bytes))!=-1)
       	{
       		dos.write(bytes, 0, len);
       	}
       	is.close();
       	dos.write(LINE_END.getBytes());
       	byte[] end_data = (PREFIX+BOUNDARY+PREFIX+LINE_END).getBytes();
       	dos.write(end_data);
       	dos.flush();
       	/**
       	 * ��ȡ��Ӧ��  200=�ɹ�
       	 * ����Ӧ�ɹ�����ȡ��Ӧ����  
       	 */
       	int res = conn.getResponseCode();  
       	Log.e(TAG, "response code:"+res);
      

// if(res==200)
// {
Log.e(TAG, “request success”);
InputStream input = conn.getInputStream();
StringBuffer sb1= new StringBuffer();
int ss ;
while((ss=input.read())!=-1)
{
sb1.append((char)ss);
}
result = sb1.toString();
Log.e(TAG, "result : "+ result);
// }
// else{
// Log.e(TAG, “request error”);
// }
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return result;
}
}

1赞

安卓端可以用第三方库~
简单方便

还需要引入
import android.content.ContentResolver;
import android.database.Cursor;
import java.util.HashMap;
import android.net.Uri;

1赞

主要是ios及android端的动作统一比较好

mark