Firebug에서 조사중인 약간의 정보를 얻을 수있는 기본 HTML 양식이 있습니다.
내 유일한 문제는 데이터베이스에 저장하기 위해 해당 형식으로 있어야하는 서버로 전송되기 전에 파일 데이터 를 base64로 인코딩 하려고한다는 것 입니다.
<input type="file" id="fileupload" />
그리고 Javascript + jQuery에서 :
var file = $('#fileupload').attr("files")[0];
사용 가능한 자바 스크립트를 기반으로 몇 가지 작업이 있습니다. .getAsBinary (), .getAsText (), .getAsTextURL
그러나 이들 중 어느 것도 사용할 수없는 ‘문자’ 를 포함하고 있기 때문에 삽입 할 수있는 사용 가능한 텍스트를 반환 하지 않습니다. 업로드 된 파일에 ‘포스트 백’이 발생하지 않도록하고 특정 개체를 대상으로하는 여러 양식이 필요하므로 중요합니다. 이 방법으로 파일을 얻고 Javascript를 사용하십시오.
널리 사용되는 Javascript base64 인코더 중 하나를 사용할 수 있도록 파일을 어떻게 가져와야합니까!?
감사
업데이트-여기에서 현상금을 시작하려면 브라우저 간 지원이 필요합니다 !!!
내가있는 곳은 다음과 같습니다.
<input type="file" id="fileuploadform" />
<script type="text/javascript">
var uploadformid = 'fileuploadform';
var uploadform = document.getElementById(uploadformid);
/* method to fetch and encode specific file here based on different browsers */
</script>
크로스 브라우저 지원과 관련된 몇 가지 문제 :
var file = $j(fileUpload.toString()).attr('files')[0];
fileBody = file.getAsDataURL(); // only would works in Firefox
또한 IE는 다음을 지원하지 않습니다.
var file = $j(fileUpload.toString()).attr('files')[0];
그래서 다음으로 교체해야합니다.
var element = 'id';
var element = document.getElementById(id);
IE 지원용.
이것은 Firefox, Chrome 및 Safari에서 작동합니다 (하지만 파일을 올바르게 인코딩하지 않거나 적어도 게시 된 후에 파일이 제대로 나오지 않음)
var file = $j(fileUpload.toString()).attr('files')[0];
var encoded = Btoa(file);
또한,
file.readAsArrayBuffer()
HTML5에서만 지원되는 것 같습니까?
많은 사람들이 제안했습니다 : http://www.webtoolkit.info/javascript-base64.html
그러나 이것은 base64로 인코딩하기 전에 UTF_8 메서드에서 오류 만 반환합니까? (또는 빈 문자열)
var encoded = Base64.encode(file);
답변
브라우저 측 자바 스크립트에서는 전적으로 가능합니다.
쉬운 방법 :
readAsDataURL () 메소드는 이미 당신을위한베이스 64로 인코딩 할 수 있습니다. 아마도 처음부터 제거해야 할 필요가있을 것입니다 (첫 번째까지). 그러나 그것은 큰 문제가 아닙니다. 이것은 모든 재미를 가져갈 것입니다.
어려운 방법:
어려운 방법으로 시도하고 싶다면 (또는 작동하지 않는 경우) readAsArrayBuffer()
. 그러면 Uint8Array가 제공되고 지정된 메서드를 사용할 수 있습니다. 이것은 업로드하기 전에 이미지 데이터를 조작하거나 다른 부두 마술을하는 것과 같이 데이터 자체를 엉망으로 만들고 싶을 때만 유용 할 것입니다.
두 가지 방법이 있습니다.
- 문자열로 변환하고 내장 된 사용
btoa
또는 유사 사용- 모든 경우를 테스트하지는 않았지만 나를 위해 작동합니다. 문자 코드 만 가져옵니다.
- Uint8Array에서 base64로 직접 변환
최근 에 브라우저에서 tar를 구현 했습니다 . 이 프로세스의 일부로 직접 Uint8Array-> base64 구현을 만들었습니다. 나는 당신이 그것을 필요로하지 않을 것이라고 생각하지만, 당신이보고 싶다면 여기 에 있습니다. 꽤 깔끔합니다.
내가 지금하는 일 :
Uint8Array에서 문자열로 변환하는 코드는 매우 간단합니다 (buf는 Uint8Array 임).
function uint8ToString(buf) {
var i, length, out = '';
for (i = 0, length = buf.length; i < length; i += 1) {
out += String.fromCharCode(buf[i]);
}
return out;
}
거기에서 다음을 수행하십시오.
var base64 = btoa(uint8ToString(yourUint8Array));
Base64는 이제 base64로 인코딩 된 문자열이되며 복숭아 만 업로드해야합니다. 푸시하기 전에 다시 확인하려면 다음을 시도하십시오.
window.open("data:application/octet-stream;base64," + base64);
파일로 다운로드됩니다.
기타 정보 :
데이터를 Uint8Array로 가져 오려면 MDN 문서를 참조하십시오.
답변
내 해결책은 사용 readAsBinaryString()
과 btoa()
그 결과였습니다.
uploadFileToServer(event) {
var file = event.srcElement.files[0];
console.log(file);
var reader = new FileReader();
reader.readAsBinaryString(file);
reader.onload = function() {
console.log(btoa(reader.result));
};
reader.onerror = function() {
console.log('there are some problems');
};
}
답변
Ajax 요청을 사용하지 않고 파일 업로드 버튼을 클릭하면 FileReader를 사용하여 이미지를 표시했습니다. 다음은 코드가 도움이 될 수 있기를 바랍니다.
$(document).ready(function($) {
$.extend( true, jQuery.fn, {
imagePreview: function( options ){
var defaults = {};
if( options ){
$.extend( true, defaults, options );
}
$.each( this, function(){
var $this = $( this );
$this.bind( 'change', function( evt ){
var files = evt.target.files; // FileList object
// Loop through the FileList and render image files as thumbnails.
for (var i = 0, f; f = files[i]; i++) {
// Only process image files.
if (!f.type.match('image.*')) {
continue;
}
var reader = new FileReader();
// Closure to capture the file information.
reader.onload = (function(theFile) {
return function(e) {
// Render thumbnail.
$('#imageURL').attr('src',e.target.result);
};
})(f);
// Read in the image file as a data URL.
reader.readAsDataURL(f);
}
});
});
}
});
$( '#fileinput' ).imagePreview();
});
답변
이 문제를 직접 해결 한 후,이를 지원하는 브라우저 (Chrome, Firefox 및 아직 출시되지 않은 Safari 6)를위한 FileReader를 구현하고, POST 된 파일 데이터를 Base64로 인코딩 된 데이터로 다시 에코하는 PHP 스크립트를 구현했습니다. 브라우저.
답변
Ajax 스타일 업로드에 ‘iframe’을 사용하는 것이 HTML5 가 완전히 원을 그리며 내 앱에서 레거시 브라우저를 지원할 필요가 없을 때까지 내 상황에 훨씬 더 나은 선택이 될 것이라고 생각하기 시작했습니다 !
답변
@Josef의 답변에서 영감을 얻었습니다.
const fileToBase64 = async (file) =>
new Promise((resolve, reject) => {
const reader = new FileReader()
reader.readAsDataURL(file)
reader.onload = () => resolve(reader.result)
reader.onerror = (e) => reject(e)
})
const file = event.srcElement.files[0];
const imageStr = await fileToBase64(file)