SpringBoot 대용량 파일 업로드 및 자세한 코드 예제

큰 파일 조각화 문제를 요약하고 깨진 업로드를 재개합니다. 파일이 (1G 이상 등)이 너무 크기 때문에, 당신은 네트워크 중단 업로드 과정의 경우를 고려해야합니다. 자체 네트워크 HTTP 요청은 이미 파일 전송이 상대적으로 큰 경우 자동으로 HTTP 프로토콜을 조각 업로드 기능이있는 파일 섹션 (블록)으로 이동, 그러나 이것은 우리의 초점이 무엇에 관해 얘기하는지, 우리가 할 필요가없는 네트워크 중단이 다음 번에 네트워크 연결을 재전송하지 않고 올린 후 1G 파일의 일부를 보장한다. 그래서 우리는 예를 들어, 1024 * 1024B으로 나누어 져, 조각화 큰 파일로, 지역 업로드하면, 1M 업로드, 서버가 수신 조각으로 큰 파일에 관한 다음 조각화되어 원래의 파일로이 조각을 결합 기본 원칙. HTTP는, 내가 네트워크 중단이 다시 연결 세 가지 상태, 브레이크 포인트에서 업로드를 통해 (대기 로딩 마감) 태그 각 조각의 상태를 기록하는 지역 업로드가 필요합니다. 파일 이름으로 서버, 정제의 총 수는 파일이 모두 완성 업로드가 있는지 여부를 확인합니다.

        다음은 세부 사항입니다 :

  1, 먼저 파일을 가져 (오디오 및 비디오, 사진)

두 경우, 하나는 직접 앨범 라이브러리에, 하나는 카메라를 호출한다. 그것을 얻을 경우 (세부 사항은 상세하게 설명되지 않는, 인터넷의 많은) UIImagePickerView에 의해, 우리는 당신이 비디오를 선택하면, 그림 1의 페이지가 압축됩니다 것을 발견 할 것이다, 그리고 마지막으로 우리는 응용 프로그램이 압축 후이 비디오입니다 얻을 동영상이 안 UIImagePickerView에 의해 다음 (원본 비디오가 아닌 비디오 라이브러리는 압축 된 비디오 릴리스의 동작을 기억 한 후 포인트가, 시스템이 수동으로 작동하려면, 우리는 아래에 논의 필요, 당신은 해제 도움이되지 않습니다 메모가) 프로토콜 방법 - ( 무효 ) :( imagePickerController UIImagePickerController를  *) :( 피커 didFinishPickingMediaWithInfo 있는 NSDictionary  *) 정보를 정보 취득 비디오

FILEINFO = {

    UIImagePickerControllerMediaType는 "public.movie을"=;

    UIImagePickerControllerMediaURL = "파일 : ///private/var/mobile/Containers/Data/Application/2AAE9E44-0E6D-4499-9AC3-93D44D8342EA/tmp/trim.F36EC46C-4219-43C8-96A7-FA7141AB64D2.MOV";

    UIImagePickerControllerReferenceURL = "자산 라이브러리 : //asset/asset.MOV ID = DEDA9406-3223-4F87 - ABB2-98FB5F5EB9C4 및 내선 = MOV";

}

UIImagePickerControllerMediaType는 KUTTypeImage, KUTTypeMovie 등의 파일 형식을 선택합니다. 여기에 영화와 비디오의 차이를주의 및 비디오 파일의 소리가, 비디오 파일은 물론, 오디오 만 소리가 더 비디오없고, 아무 소리도 없다. (카메라는,이 영상에 의해 캡처 된 원본인지,이 앨범 라이브러리 후에 생성되는 비디오 압축을 선택한 경우) UIImagePickerControllerMediaURL 비디오의 URL 인 주목하라 URL이 URL을 통해 앨범 라이브러리 점하지 않도록. 당신은 압축 된 비디오의 크기를 얻을 수 있습니다, 등, 복사, 삭제로 비디오를 조작 할 수 있습니다. UIImagePickerControllerReferenceURL 앨범의 URL에 대한 포인터, 공식 설명하고 있음을 NSURL 모든 AssetsLibrary 프레임 워크의 자산이 참조하는 정보 , 이 URL을 통해, 당신은에 (ALAssetsLibrary 등에 의해 파일 이름, 미리보기, 기간, 포함하여 영상을 얻을 수 있습니다 assetsLibrary assetForURL : referenceURL resultBlock :).

만약 두 개의 저장 장치에 카메라, 임금주의 : 앨범에 저장 사진 assetsLibrary writeImageDataToSavedPhotosAlbum : UIImageJPEGRepresentation ([정보 valueForKey : UIImagePickerControllerOriginalImage] (CGFloat) 1.0 ) 메타 데이터 : 전무 completionBlock : failureBlock를 :

고성능 압축 방법을 NSData * UIImageJPEGRepresentation 그림 (이미지를 UIImage *, CGFloat compressionQuality)

: 비디오는 앨범에 저장 assetsLibrary  writeVideoAtPathToSavedPhotosAlbum : mediaUrl completionBlock : failureBlock :

 

여기, 우리는 필요한 모든 문서 및 파일 정보를 얻을 수 있습니다. 다음 일은 파일 조각화이다.

 

2, 획득 된 파일 조각

첫째,이 클래스에 저장됩니다 이러한 파일을 얻을 것이다

CNFile를 @interface :  NSObject의를

@property  ( 비 원자 , 사본 ) 는 NSString *의 fileType; // 이미지 나 동영상

@Property  ( 비 원자 , 복사 ) 는 NSString *적인 filePath; // 에서 파일 응용 프로그램 경로

@Property  ( 비 원자 , 복사 ) 는 NSString * fileName에; // 파일 이름

@Property  ( 비 원자 , ASSIGN ) NSInteger  이는 파일 크기; // 파일 크기

@property (비 원자, ASSIGN)  NSInteger  트렁크; // 시트의 총 수

@property  ( 비 원자 , 복사 ) 는 NSString * FILEINFO;

@Property  ( 비 원자 , 강력한 ) 있는 UIImage * fileImage; // 파일 미리보기

@property  ( 비 원자 , 강한 ) * NSMutableArray를 fileArr; // 각 부분의 태그 업로드 상태

@종료

그래서 우리는 모든 CNFile 객체까지 작동 할 수있다.

 

- ( 무효 ) readDataWithChunk :( NSInteger ) 청크 파일 :( CNFile *) 파일 {

  시트의 총 수를 획득하는 방법에있어서,

    int입니다  오프셋 = 1,024 * 1,024 (크기 1M 각)

    NSInteger의  청크 = (파일. 이는 파일 크기의 % 1,024 == 0 ) ((? INT ) (파일. 이는 파일 크기 / 1,024 * 1,024 )) : (( INT .) (파일 이는 파일 크기 / ( 1024 * 1024 ) +  1 ));

    NSLog (@ "덩어리 = % ld 개"( ) 덩어리);

    파일 조각화, 데이터는 각각 읽습니다

    을 NSData * 데이터;

    NSFileHandle  * readHandle = [ NSFileHandle  fileHandleForReadingAtPath : 파일. 여기서 filePath ];

    [readHandle  seekToFileOffset : * 청크 오프셋];

    데이터 = readHandle  readDataOfLength : 오프셋];

}

 

그래서 우리는 데이터의 모든 조각을 얻을 업로드 할 다음 영화는 이미 있는지 여부, 서버를 물어

(方法- ( 공극 ) :( ifHaveData 을 NSData *) :( 데이터 WithChunk NSInteger ) 청크 파일 :( CNFile *) 파일)

본 청크 + 1 그래서, 서버는 시트를 나타내지 때까지 다음의 하나를 판독하는 상기 방법을 반복하는 경우, 상기 시트는 데이터를 업로드한다. 파일이 모두 완성 업로드가 있는지 여부를 현지 심사 위원과 관련이있을 것이다이 방법에서는 (대기 로딩 마무리)의 덩어리의 주 설정 업로드 상태.

 

다음 단계는 업로드하는 과정입니다 :

- ( 공극 ) :( uploadData 을 NSData *) :( 데이터 WithChunk NSInteger ) 청크 파일 :( CNFile *) 파일;

업로드에 성공한 서버가 영화를 반환 한 후, 우리는 할 수있는 여지가 :

1) 먼저 성공적으로 영화의 업로드 된 플래그 배치 마무리

[파일. fileArr  replaceObjectAtIndex : 덩어리 withObject : @ "마침" ];

 

의 모든 조각 경우 2) 볼 플래그가 배치 된 마무리를 이미 finishi 경우 파일 업로드가 완료되었음을 알리는, 다음, 파일을 삭제 파일 또는 다음의 끝을 업로드 할 수 있습니다.

 ( NSInteger의  J = 0 ; J <청크, J ++) {

만약  (j == 청크 || ((j == 덩어리 - 1 ) && ([파일. fileArr [J] isEqualToString : @ "마침" ])))

     [나  DeleteFile을 : 파일. 여기서 filePath ];

     [저  readNextFile ];

}

당신은 마무리가없는 경우 3) 후 대기 여부와 로컬 플래그의 다음 청크를 보면

 NSLog (@ " 보기 %의 LD의 시트 상태 "청크 + 1이다. );

 위한 ( NSInteger  난 청크 = + 1 ; I <청크; I ++)

  {

     는 NSString * 플래그 = 파일. fileArr objectAtIndex : I];

      경우  ([플래그 isEqualToString : @ "대기" {])

             [나  readDataWithChunk : 내가 파일 이름 : fileName에의 파일 : 파일]

               휴식 ;

          }

   }

) 2.5 단계를 가질 수있다 (2, 3) 사이에 휴지기 업로드 여부를 판정한다

경우 (me.isPause == YES )

  {

  // 현재는 여러 파일의 처음 몇 개는 로컬에 저장 읽기

     [ 자기  saveProgressWithChunk : 청크 파일 : 파일]

      반환  ;

   }

이 작업은 업로드 프로세스가 중단 HTTP를 위해 네트워크, 단선 또는 일시 정지이기 때문에, 우리가 마무리 업로드 앞에 배치 된 다음 조각으로 건너 뛰 저장 현재 진행하려는 거의 동일합니다.

우리가 실제로 업로드 된 조각의 의미를 잃어, 선형의 조각을 업로드하면 다음 문제가있다, 그것은과 결합되어야한다 멀티 스레드, 그 부분 업로드 프로세스가 동시에 동시에, 따라서 효율성 업로드를 개선, 여러 조각을 업로드 할 수 있도록 네트워크 대역폭의 전체를 사용합니다.

    dispatch_async (dispatch_queue_t 큐 ^ {

        [나  readDataWithChunk : 청크];

    })

마지막으로, 노트, 각각의 앱이 차지하는 공간의 크기를 찾을 수 있습니다, 당신은 압축 된 비디오 생성을 처리하지 않는 경우, 오 증가하지 않는 저장 공간의 크기에 앱 설정을 참조 가서 비디오를 업로드하는 것은 매우되어 완료 큰.

자세한 사항은이 문서를 참조하십시오 http://blog.ncmem.com/wordpress/2019/08/12/%e5%a4%a7%e6%96%87%e4%bb%b6%e6%96%ad%e7 % 82 % B9 % E7 % BB % 광고 % E4 % BC % a0-2 /

추천

출처www.cnblogs.com/songsu/p/12540096.html