안드로이드 앱에서 스프링 시큐리티(SPRING SECURITY)로 파일 올리기
스프링 세팅을 해주어야 합니다.
rest로 이미지를 받을때 스프링 시큐리티에서 접근을 허가 안합니다. 웹브라우저로 했을땐 잘되었는데요.
이문제를 모르고 안드로이드 앱이 문제인줄 알았습니다.
rest는 패턴을 지정해주지 않아도 기본적으로 보안 체크를 합니다. 그래서 security-context.xml 파일에
이값을 추가합니다.
<http security="none" pattern="/android/**"/>
저는 ANDROID로 파일을 받을 예정이라 ANDROID하위는 모두 패스 하도록 설정했습니다.
소스는 간단합니다.
@REQUESTMAPPING(VALUE = "POSTFORMDATA", METHOD=REQUESTMETHOD.POST,
PRODUCES = "APPLICATION/JSON;CHARSET=UTF-8")
PUBLIC @RESPONSEBODY STRING HANDLEFORMUPLOAD(MULTIPARTFILE FILE,HTTPSERVLETREQUEST REQUEST) THROWS IOEXCEPTION, EXCEPTION {
여기에 DB에 저장하든 파일로 저장하든 로직 이 구현되면 됩니다.
}
안드로이드 소스를 살펴보겠습니다.
private class uploadImageTask extends AsyncTask<Void, Void, String> {
private String url_address;
private MultiValueMap<String, Object> formData;
public uploadImageTask(String url, String values) {
deviceInfo();
this.url_address = url;
FileSystemResource file = new FileSystemResource( values );
formData = new LinkedMultiValueMap<String, Object>();
try {
formData.add("description", "meseoul");
formData.add("file", file);
formData.add("user_name", Global.User_name.getBytes("UTF-8"));
formData.add("s00741", "s00741");
formData.add("good", "good");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
@Override
protected String doInBackground(Void... params) {
String result = "";
Util.Log( "url:> " + url_address );
HttpHeaders requestHeaders = new HttpHeaders();
requestHeaders.setContentType( MediaType.MULTIPART_FORM_DATA);
HttpEntity<MultiValueMap<String, Object>> requestEntity = new HttpEntity<MultiValueMap<String, Object>>(
formData, requestHeaders );
RestTemplate restTemplate = new RestTemplate( true );
restTemplate.getMessageConverters()
.add(0, new StringHttpMessageConverter( Charset.forName("UTF-8")));
ResponseEntity<String> response = restTemplate.exchange( url_address, HttpMethod.POST, requestEntity,
String.class );
result= response.getBody().toString();
return result;
}
@Override
protected void onPostExecute(String result) {
if(result.equals("YES"))
{
Toast.makeText(mContext, "서버에 저장되었습니다."+Global.User_name, Toast.LENGTH_LONG).show();
}
else
{
Toast.makeText(mContext, "저장을 실패했습니다."+Global.User_name, Toast.LENGTH_LONG).show();
}
}
}
uploadImageTask a = new uploadImageTask( Global.UrlAddress + "/android/postformdata", saveFilePath );
a.execute();
안드로이드 스프링을 사용하였는데요.
세팅법은 최신버전을 찾아서 하시면 됩니다.
BUILD.GRADLE 파일에
dependencies {
implementation fileTree(include: ['*.jar'], dir: 'libs')
//noinspection GradleCompatible
implementation 'com.android.support:appcompat-v7:26.1.0'
implementation 'com.android.support.constraint:constraint-layout:1.0.2'
testImplementation 'junit:junit:4.12'
compile 'org.springframework.android:spring-android-rest-template:1.0.1.RELEASE'
compile 'org.codehaus.jackson:jackson-mapper-asl:1.9.11'
compile 'com.fasterxml.jackson.core:jackson-databind:2.3.2'
androidTestImplementation 'com.android.support.test:runner:1.0.1'
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.1'
implementation files('libs/jsoup-1.11.2.jar')
implementation files('libs/json-simple-1.1.1.jar')
implementation files('libs/sdk-v1.0.0.jar')
}
안드로이드 UTF-8 전송시 한글 깨지는데 저는 저렇게 해줬습니다.
formData.add("user_name", Global.User_name.getBytes("UTF-8"));