난 당신이 조금 복잡한 문제를 잊고 생각? 이미지를 업로드하지 않고 실제 미리보기를 만들고 싶다면이 기능이 필요합니다.
저는이 문제를 해결하고 많은 시간을 낭비합니다. 자바 스크립트에서 경로를 얻는 것이 거의 불가능합니다. 그러나 마지막으로 실제 미리보기를 얻을 수있는 방법을 찾았습니다.
코드에서 충분히 유효성을 검사하므로 코드를 여기에서 공유 할 것입니다. 그래서 끝났습니다.
클라이언트 쪽에서 파일 관리자 나 exporer를 사용하여 이미지를 선택하면 임시 경로가 생성되어 액세스 할 수 있습니다. 따라서 "URL.createObjectURL()"메서드를 사용하여 해당 경로에서 객체를 만든 다음 < img/> 요소의 "src"속성에 추가해야합니다. 여기에 은 샘플 코드 스 니펫입니다.
1. a small styles sheet to easy encode
// myStyles.css
// ...
.collapsed-element { diplay: none; }
// ...
2. A hidden container element to prepare the previewed image
<!-- my html page !-->
<!-- the workhorse in a hidden container -->
<div id="canvas-container" class="collapsed-element">
<img src="" class="canvas" id="canvas-input">
</div><div class="clear-block"></div>
3. The widget to have a working input set
<!-- The imput set: a table-row with a file input and a related img-preview element -->
<table id="my-image-getter-widget">
<tr>
<td style="width: 15%" id="prw-container">
<!-- fibopad.gif is a transparent pad using Fibonacci numbers as dimentions (a personal preference) -->
<!-- graphema will be the file input name; so I asign it as a class-prefix attribute in the related viewer -->
<img src="/path_to_a_transparent_image_pad/fibopad.gif" alt="" title="" width="46" height="75" class="graphema-vwr"/>
</td>
<td id="the-input-set-column" style="width: 85%">
<!-- a text input to show the old path if you are editing and have an older loaded image -->
<!-- note the "graphema" word used elsewhere to relate elements and get a way to easy encode -->
<div class="container-inline">
<div class="form-item" id="edit-graphema-txt-wrapper">
<label for="edit-graphema-txt">Image File:</label>
<input type="text" maxlength="255" name="graphema_txt" id="edit-graphema-txt" size="45" value="" class="form-text"/>
</div>
</div>
<!-- The image input note the name="files[graphema]" attribute as array item -->
<!-- the class "enabled-prvw" will be added to inputs at onload event and will be used by javascript code to bind behaviors and get the preview -->
<div class="container-inline">
<div class="form-item" id="edit-graphema-wrapper">
<label for="edit-graphema">Load a image:</label>
<input type="file" name="files[graphema]" class="form-file" id="edit-graphema" size="60"/>
</div>
</div>
<!-- A helper tip for users -->
<div class="description">
<br/>Blah, blah ... blah ...
</div>
</td>
</tr>
</table><!-- widget end -->
4. Finaly! the javascript
// Filename: myimage-preview.js
// a function to properly hall the preview image with a good container's resizing
function set_dimentions_for_previewer(curwidth, curheight, standarlimit, targetid){
var nw = standarlimit;
if(curheight > 10){ nw = parseInt((curwidth * standarlimit)/curheight); }
$(targetid).attr('height', standarlimit); $(targetid).attr('width', nw);
}
// a function to bind events and show selections (do not performs validation, so you must add it)
// I'd commented my debug lines cause my modal dialog is not present
function enable_preview_for_imageinput(){
// var ondebug = Settings.lgq_debug_js_enabled;
$("input:file").each(function(){
var id = '' + $(this).attr('id');
var idselector = '#'+id;
// if(ondebug === 1){ estatus_add('binded change event<br>'); }
if(!$(idselector).hasClass('enabled-prvw')){
$(idselector).bind("change", function(event){
var chunk = id.split('-', 2);
var imgclass = '.'+chunk[1]+'-vwr';
// /*
$('img.canvas').bind('load', function(){
// if(ondebug === 1){ status_add('Image added to canvas <br>'); }
var curheight = $('img.canvas').attr('height'), curwidth = $('img.canvas').attr('width');
// if(ondebug === 1){ status_add('dimentions width ='+curwidth+', height ='+curheight+' <br>'); }
set_dimentions_for_previewer(curwidth, curheight, 75, imgclass);
$('img.canvas').unbind('load');
});
$('.canvas').attr('src',URL.createObjectURL(event.target.files[0]));
$(imgclass).fadeIn("fast").attr('src',URL.createObjectURL(event.target.files[0]));
// var tit = 'Change event at '+id;
// var msg = ''+$(idselector).val();
// message_sys(tit, msg);
});
$(idselector).addClass('enabled-prvw')
}
// if(ondebug === 1){ estatus_add('Binded input: '+id+' \n'); }
});
// if(ondebug === 1){ message_sys('Load success', get_status()); }
}
// an onload call to enable all
$(document).ready(function(){
enable_preview_for_imageinput();
});
고맙습니다. :) .match()가 '... 일치 (/ http : \/\/\ S + (\ .png | \ .jpg | \ .gif)/g); '? 또한 이미지를 미리 보려고하지만 이미지 미리보기가 나타나는 것처럼 보입니다. 콘솔에 '리소스는 이미지로 해석되었지만 MIME 유형 application/json으로 전송되었습니다.'오류가 표시됩니다. [Chrome에서] – Tom
즉 [ /educ661-373wikiarticle.wikispaces.com/file/view/test.jpg/149584695/test.jpg]? 또한 입력 링크를 제거하면 미리보기가 유지됩니까? – Tom
제가 보겠습니다.파이어 폭스를 사용하고 있었는데, 다른 것을 시도하려고 생각하지 않았습니다. – Henry