JavaScript에서 Blob을 파일로 변환하는 방법


111

NodeJS 서버의 일부 디렉토리에 이미지를 업로드해야합니다. 이를 connect-busboy위해 노드 모듈을 사용하고 있습니다.

나는 있었다 dataURL나는 다음과 같은 코드를 사용하여 블롭로 변환하는 이미지를 :

dataURLToBlob: function(dataURL) {
    var BASE64_MARKER = ';base64,';
    if (dataURL.indexOf(BASE64_MARKER) == -1) {
        var parts = dataURL.split(',');
        var contentType = parts[0].split(':')[1];
        var raw = decodeURIComponent(parts[1]);
        return new Blob([raw], {type: contentType});
    }
    var parts = dataURL.split(BASE64_MARKER);
    var contentType = parts[0].split(':')[1];
    var raw = window.atob(parts[1]);
    var rawLength = raw.length;
    var uInt8Array = new Uint8Array(rawLength);
    for (var i = 0; i < rawLength; ++i) {
        uInt8Array[i] = raw.charCodeAt(i);
    }
    return new Blob([uInt8Array], {type: contentType});
}

이미지를 업로드하려면 blob을 파일로 변환하는 방법이 필요합니다.

누군가 나를 도울 수 있습니까?


4
파일은 Blob이며, 메타 속성에 고정하기 만하면됩니다.
dandavis 2014

1
Blob을 업로드 할 때의 기본값은 blob. 그래서, 내가 먼저 같은 준 다음 내가 자르기 된 파일의 이름을 추출 filename수행하여 서버에 업로드하면서 자른 파일 있도록 form.append("blob",blob, filename);.
건너 뛰기

@skip 아래 내 대답이 도움이 되었습니까? 그렇기 때문에 정답으로 표시하십시오.
CBarr

답변:


149

이 함수는 a Blob를 a 로 변환하고 File저에게 잘 작동합니다.

바닐라 자바 ​​스크립트

function blobToFile(theBlob, fileName){
    //A Blob() is almost a File() - it's just missing the two properties below which we will add
    theBlob.lastModifiedDate = new Date();
    theBlob.name = fileName;
    return theBlob;
}

TypeScript (적절한 타이핑 포함)

public blobToFile = (theBlob: Blob, fileName:string): File => {
    var b: any = theBlob;
    //A Blob() is almost a File() - it's just missing the two properties below which we will add
    b.lastModifiedDate = new Date();
    b.name = fileName;

    //Cast to a File() type
    return <File>theBlob;
}

용법

var myBlob = new Blob();

//do stuff here to give the blob some data...

var myFile = blobToFile(myBlob, "my-image.png");

3
anyTypeScript 에서 사용할 필요가 없도록 캐스트가 먼저 발생해야한다고 생각합니다 . 예를 참조하십시오 .
styfle 16.04.13

2
이것은 모든 목적으로 작동하지 않습니다. 이 "File"을 ajax 호출에 추가하면 파일 이름이 올바르게 설정되지 않습니다.
Jacob Poul Richardt

12
이것은 좋은 해결책이 아니며 생성 된 개체는 여전히 얼룩입니다.
czupe 2017

4
그냥 추가 b.__proto__ = File.prototype및 솔루션 꿈이된다 심지어 트릭 b instanceOf Filetrue
manuelnaranjo

3
이것은 허용되는 대답이 아니 어야합니다. stackoverflow.com/a/53205768/2557517 또는 stackoverflow.com/a/31663645/2557517 이어야합니다.
Kira

204

File 생성자를 사용할 수 있습니다.

var file = new File([myBlob], "name");

w3 사양에 따라 이것은 blob에 포함 된 바이트를 새 File 객체의 바이트에 추가하고 지정된 이름 http://www.w3.org/TR/FileAPI/#dfn-file로 파일을 만듭니다 .


2
이것이 제가 찾던 것입니다. 첫 번째 인수는 실제로 배열이므로 다음과 같이 사용했습니다. var file = new File ([myBlob], "name");
Michaeldcooney

1
예. 이 솔루션도 찾고 있습니다. Stamplay 서버가 Blob 개체에서 파일 이름을 가져올 수 없습니다. 그래서 다시 파일로 변환해야합니다. 그러나 사파리 :( 이제 다시 0 ... 파일 API를 지원하지 않습니다
휴 허우

4
예를 들어 PhantomJS에서 파일 생성자가 작동하지 않습니다.TypeError: FileConstructor is not a constructor (evaluating 'new File([''], 'file.pdf', {'size': 1000, 'type': 'application/pdf'})')
bkimminich

7
Edge는 현재 (2017-10-04)이 생성자의 사용을 방해하는 버그가 있습니다. developer.microsoft.com/en-us/microsoft-edge/platform/issues/…
Rik Martins

8
파일 형식을 추가해야합니다. 그렇지 않으면 제대로 작동하지 않습니다. new File ([myBlob], "이름", {유형 : "이미지 / jpeg",});
BernardA

34

Joshua P Nixon 의 대답은 정확하지만 마지막 수정 날짜도 설정해야했습니다. 그래서 여기에 코드가 있습니다.

var file = new File([blob], "file_name", {lastModified: 1534584790000});

1,534,584,790,000는 "의 유닉스 타임 스탬프입니다 : 2018년 8월 18일 (토요일) 그리니치 표준시 오전 9시 33분 10초 "


3
instanceof허용 된 답변처럼 깨지지 않는 포인트
Matt Jensen

15

작업 하려면 blob에 포함되어 있지만 유형명시 적으로 제공해야 했습니다.

const file = new File([blob], 'untitled', { type: blob.type })

14

현대 변형 :

function blob2file(blobData) {
  const fd = new FormData();
  fd.set('a', blobData);
  return fd.get('a');
}

2
: 결과 파일 사용에 파일 이름을 추가하려면fd.set('a', blobData, 'filename')
joaoguerravieira

그것은 때 일부 IOS 장치에서 실패합니다fd.set
Sing

감사. 이것은 작동합니다. 이제 blob을 파일로 변환 할 필요가 없습니다.
xreyc_developer22

2

FileSaver.js github 프로젝트 saveAs에서 사용하십시오 .

FileSaver.jssaveAs()기본적으로 지원하지 않는 브라우저 에서 FileSaver 인터페이스를 구현합니다 .


2

타이프 스크립트

public blobToFile = (theBlob: Blob, fileName:string): File => {       
    return new File([theBlob], fileName, { lastModified: new Date().getTime(), type: theBlob.type })
}

자바 스크립트

function blobToFile(theBlob, fileName){       
    return new File([theBlob], fileName, { lastModified: new Date().getTime(), type: theBlob.type })
}

산출

스크린 샷

File {name: "fileName", lastModified: 1597081051454, lastModifiedDate: Mon Aug 10 2020 19:37:31 GMT+0200 (Eastern European Standard Time), webkitRelativePath: "", size: 601887, …}
lastModified: 1597081051454
lastModifiedDate: Mon Aug 10 2020 19:37:31 GMT+0200 (Eastern European Standard Time) {}
name: "fileName"
size: 601887
type: "image/png"
webkitRelativePath: ""
__proto__: File
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.