使用carrierwave-base64上传画布图像

时间:2017-06-19 02:45:57

标签: javascript ruby-on-rails base64 carrierwave image-uploading

我正在尝试从中获取dataUrl javascript  http://rohitrox.github.io/2013/07/19/canvas-images-and-rails/ 工作 我的javascript代码

var dataURL =  canvas.toDataURL('image/png');
window.location = dataURL;

我根据最后的建议添加了一个带有html按钮的javascript函数 来自[Rails Carrierwave Base64 image upload

// Upload the dataurl to carrierwave
function uploadUrl() {
    Attachment.create(image: params[:image]);
}

<input type="submit" value="Upload Image" id="clearbutton" 
onclick="uploadUrl();">
</div>

在我的gemfile中我安装了两个不同版本的carrierwave gem 载波的常规版本和base 64 version 。 我的宝石文件包含

gem 'carrierwave', '~> 1.0'
gem 'carrierwave-base64'

在我的listing.rb文件中,这是我的上传器与carrierwave-base64 gem关联的地方

mount_base64_uploader :image, ImageUploader

我不了解carrierwave的一个方面是如何添加文件扩展名。 在关于carrierwave-base64 gem的网页上,这是一个段落。文件扩展名 对于上传的base64字符串,使用mime-types gem和content_type自动识别 从上传的字符串。我不明白该怎么做。

此外,我曾经有一个图像上传器,用户可以将图像上传到我的rails应用程序 他们在那里保存的图像。为了删除我改变了我的两个文件。

在一个名为_form.html.erb的部分形式中,我改变了

<div class="form-group">
<%= f.label :name %>
<%= f.text_field :name, class: "form-control" %>
</div>
<div class="form-group">
<%= f.label :description %>
<%= f.text_area :description, class: "form-control" %>
</div>
<div class="form-group">
<%= f.label :price %>
<%= f.text_field :price, class: "form-control" %>
</div>
<div class="form-group">
<%= f.label :image %>
<%= f.file_field :image, class: "form-control" %>
</div>

<div class="form-group">
<%= f.label :name %>
<%= f.text_field :name, class: "form-control" %>
</div>
<div class="form-group">
<%= f.label :description %>
<%= f.text_area :description, class: "form-control" %>
</div>
<div class="form-group">
<%= f.label :price %>
<%= f.text_field :price, class: "form-control" %>
</div>

在我的listings_controller.rb中我改变了

def listing_params
  params.require(:listing).permit(:name, :description, :price, :image)
end

def listing_params
  params.require(:listing).permit(:name, :description, :price,)
end

以下是我用于画布上传的javascript,css和html

<html>
<head>
<title>Sketchpad</title>
<script type="text/javascript">
// Variables for referencing the canvas and 2dcanvas context
var canvas,ctx;
// Variables to keep track of the mouse position and left-button status 
var mouseX,mouseY,mouseDown=0;
// Variables to keep track of the touch position
var touchX,touchY;
var dataURL =  canvas.toDataURL('image/png');
window.location = dataURL;
// Upload the dataurl to carrierwave
function uploadUrl() {
    Attachment.create(image: params[:image]);
}
// Draws a dot at a specific position on the supplied canvas name
// Parameters are: A canvas context, the x position, the y position, the 
size of the dot
function drawDot(ctx,x,y,size) {
    // Let's use black by setting RGB values to 0, and 255 alpha (completely 
opaque)
    r=0; g=0; b=0; a=255;

    // Select a fill style
    ctx.fillStyle = "rgba("+r+","+g+","+b+","+(a/255)+")";

    // Draw a filled circle
    ctx.beginPath();
    ctx.arc(x, y, size, 0, Math.PI*2, true); 
    ctx.closePath();
    ctx.fill();
} 

// Clear the canvas context using the canvas width and height
function clearCanvas(canvas,ctx) {
    ctx.clearRect(0, 0, canvas.width, canvas.height);
}

// Keep track of the mouse button being pressed and draw a dot at current location
function sketchpad_mouseDown() {
    mouseDown=1;
    drawDot(ctx,mouseX,mouseY,4);
}

// Keep track of the mouse button being released
function sketchpad_mouseUp() {
    mouseDown=0;
}

// Keep track of the mouse position and draw a dot if mouse button is currently pressed
function sketchpad_mouseMove(e) { 
    // Update the mouse co-ordinates when moved
    getMousePos(e);

    // Draw a dot if the mouse button is currently being pressed
    if (mouseDown==1) {
        drawDot(ctx,mouseX,mouseY,4);
    }
}

// Get the current mouse position relative to the top-left of the canvas
function getMousePos(e) {
    if (!e)
        var e = event;

    if (e.offsetX) {
        mouseX = e.offsetX;
        mouseY = e.offsetY;
    }
    else if (e.layerX) {
        mouseX = e.layerX;
        mouseY = e.layerY;
    }
 }

// Draw something when a touch start is detected
function sketchpad_touchStart() {
    // Update the touch co-ordinates
    getTouchPos();

    drawDot(ctx,touchX,touchY,4);

    // Prevents an additional mousedown event being triggered
    event.preventDefault();
}

// Draw something and prevent the default scrolling when touch movement is detected
function sketchpad_touchMove(e) { 
    // Update the touch co-ordinates
    getTouchPos(e);

    // During a touchmove event, unlike a mousemove event, we don't need to check if the touch is engaged, since there will always be contact with the screen by definition.
    drawDot(ctx,touchX,touchY,4); 

    // Prevent a scrolling action as a result of this touchmove triggering.
    event.preventDefault();
}

// Get the touch position relative to the top-left of the canvas
// When we get the raw values of pageX and pageY below, they take into account the scrolling on the page
// but not the position relative to our target div. We'll adjust them using "target.offsetLeft" and
// "target.offsetTop" to get the correct values in relation to the top left of the canvas.
function getTouchPos(e) {
    if (!e)
        var e = event;

    if(e.touches) {
        if (e.touches.length == 1) { // Only deal with one finger
            var touch = e.touches[0]; // Get the information for finger #1
            touchX=touch.pageX-touch.target.offsetLeft;
            touchY=touch.pageY-touch.target.offsetTop;
        }
    }
}


// Set-up the canvas and add our event handlers after the page has loaded
function init() {
    // Get the specific canvas element from the HTML document
    canvas = document.getElementById('sketchpad');

    // If the browser supports the canvas tag, get the 2d drawing context for this canvas
    if (canvas.getContext)
        ctx = canvas.getContext('2d');

    // Check that we have a valid context to draw on/with before adding event handlers
    if (ctx) {
        // React to mouse events on the canvas, and mouseup on the entire document
        canvas.addEventListener('mousedown', sketchpad_mouseDown, false);
        canvas.addEventListener('mousemove', sketchpad_mouseMove, false);
        window.addEventListener('mouseup', sketchpad_mouseUp, false);

        // React to touch events on the canvas
        canvas.addEventListener('touchstart', sketchpad_touchStart, false);
        canvas.addEventListener('touchmove', sketchpad_touchMove, false);
    }
}
</script>
<style>
/* Some CSS styling */
#sketchpadapp {
/* Prevent nearby text being highlighted when accidentally dragging mouse 
outside confines of the canvas */
-webkit-touch-callout: none;
-webkit-user-select: none;
-khtml-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
}
.leftside {
float:left;
width:220px;
height:285px;
background-color:#def;
padding:10px;
border-radius:4px;
}
.rightside {
float:left;
margin-left:10px;
}
#sketchpad {
float:left;
height:300px;
width:400px;
border:2px solid #888;
border-radius:4px;
position:relative; /* Necessary for correct mouse co-ords in Firefox */
}
#clearbutton {
font-size: 15px;
padding: 10px;
-webkit-appearance: none;
background: #eee;
border: 1px solid #888;
}
</style>
</head>
<body onload="init()">
<div id="sketchpadapp">
    <div class="leftside">
         Touchscreen and mouse support HTML5 canvas sketchpad.<br/><br/>
         Draw something by tapping or dragging.<br/><br/>
         Works on iOS, Android and desktop/laptop touchscreens using 
Chrome/Firefox/Safari.<br/><br/>
         <input type="submit" value="Clear Sketchpad" id="clearbutton" 
onclick="clearCanvas(canvas,ctx);">
    </div>
    <input type="submit" value="Upload Image" id="clearbutton" 
onclick="uploadUrl();">
    </div>
    <div class="rightside">
        <canvas id="sketchpad" height="300" width="400">
        </canvas>
    </div>
</div>
</body>
</html>

0 个答案:

没有答案