2016-09-25 50 views
0

好吧,这是我正在尝试acchomplish,(截至现在)我有用户选择图像和图像的大小,并上传到服务器。我想要做的是在图像被选择并调整大小后停止脚本。然后,我想创建一个函数来上传我选择时调整大小的图像。原因是我打算在我的表单中添加更多输入文本,并且用户已完成完成,然后我想要使用这些文件上传图像。注:我还没有添加文字输入会做后只是希望能够sepearate上传functions..I我不知道如何单独的FORMDATA后部分发送表单数据分开

JAVASCRIPT

<script> 
function ResizeMe(){ 
var dataurl = null; 
var uniq = 'id' + (new Date()).getTime(); 
var filesToUpload = document.getElementById('input').files; 
var file = filesToUpload[0]; 

// Create an image 
var img = document.createElement("img"); 
// Create a file reader 
var reader = new FileReader(); 
// Set the image once loaded into file reader 
reader.onload = function(e) 
{ 
    img.src = e.target.result; 

    img.onload = function() { 
     var canvas = document.createElement("canvas"); 
     var ctx = canvas.getContext("2d"); 
     ctx.drawImage(img, 0, 0); 

     var MAX_WIDTH = 200; 
     var MAX_HEIGHT = 400; 
     var width = img.width; 
     var height = img.height; 

     if (width > height) { 
      if (width > MAX_WIDTH) { 
      height *= MAX_WIDTH/width; 
      width = MAX_WIDTH; 
      } 
     } else { 
      if (height > MAX_HEIGHT) { 
      width *= MAX_HEIGHT/height; 
      height = MAX_HEIGHT; 
      } 
     } 
     canvas.width = width; 
     canvas.height = height; 
     var ctx = canvas.getContext("2d"); 
     ctx.drawImage(img, 0, 0, width, height); 
     dataurl = canvas.toDataURL("image/jpeg",.2); 
     var blobBin = atob(dataurl.split(',')[1]); 
     var array = []; 
     for(var i = 0; i < blobBin.length; i++) { 
     array.push(blobBin.charCodeAt(i)); 
     } 
     var files = new Blob([new Uint8Array(array)], {type: 'image/jpg', name: "ddd"}); 
     // Post the data 
     var fd = new FormData(); 
     fd.append("image", files, uniq); 
     $.ajax({ 
      url: 'http:///www.***/upload.php', 
      data: fd, 
      cache: false, 
      contentType: false, 
      processData: false, 
      type: 'POST', 
      success: function(data){ 
       $('#form_input')[0].reset(); 
       location.reload(); 
      } 
     }); 
    } // img.onload 
} 
// Load files into file reader 
reader.readAsDataURL(file); 
} 
</script> 
+1

调用'ResizeMe()'多少次?是否会有多个画布等待一次发送? – Howzieky

+0

只有一次在应用程序结束。它会发送1张图片和所收集的所有表格数据 – INOH

+0

只有1张画布将它发送给我,因为用户可能会选择拍摄不同的图片。但在应用程序结束时,我希望从表单中上传所有数据,并将1图像/画布全部上传到图像以将文件夹和数据上传到mySQL – INOH

回答

1

代码发送形式数据是

$.ajax({ 
    url: 'http:///www.***/upload.php', 
    data: fd, 
    cache: false, 
    contentType: false, 
    processData: false, 
    type: 'POST', 
    success: function(data){ 
     $('#form_input')[0].reset(); 
     location.reload(); 
    } 
}); 

该代码是您将要放在一个单独的函数中的代码。要将它移动到其他地方,您必须确保它仍然可以访问所有要发送的变量,即fdfd连接到几个变量,全部返回到canvas。你说一次只能有一个画布,所以我们可以使canvas成为一个全局变量,然后从任何地方得到fd都很容易。

<script> 
    //Moved to global so that sendFormStuff will see it 
    var canvas = document.createElement("canvas"); 
    var ctx = canvas.getContext("2d"); 
    function ResizeMe(){ 
    var dataurl = null; 
    var uniq = 'id' + (new Date()).getTime(); 
    var filesToUpload = document.getElementById('input').files; 
    var file = filesToUpload[0]; 

    // Create an image 
    var img = document.createElement("img"); 
    // Create a file reader 
    var reader = new FileReader(); 
    // Set the image once loaded into file reader 
    reader.onload = function(e) 
    { 
     img.src = e.target.result; 

     img.onload = function() { 

     ctx.drawImage(img, 0, 0); 

     var MAX_WIDTH = 200; 
     var MAX_HEIGHT = 400; 
     var width = img.width; 
     var height = img.height; 

     if (width > height) { 
      if (width > MAX_WIDTH) { 
      height *= MAX_WIDTH/width; 
      width = MAX_WIDTH; 
      } 
     } else { 
      if (height > MAX_HEIGHT) { 
      width *= MAX_HEIGHT/height; 
      height = MAX_HEIGHT; 
      } 
     } 
     canvas.width = width; 
     canvas.height = height; 
     ctx.drawImage(img, 0, 0, width, height); 
     } // img.onload 
    } 
    function sendFormStuff() { 
     var dataurl = canvas.toDataURL("image/jpeg",.2); 
     var blobBin = atob(dataurl.split(',')[1]); 
     var array = []; 
     for(var i = 0; i < blobBin.length; i++) { 
     array.push(blobBin.charCodeAt(i)); 
     } 
     var files = new Blob([new Uint8Array(array)], {type: 'image/jpg', name: "ddd"}); 
     // Post the data 
     var fd = new FormData(); 
     fd.append("image", files, uniq); 
     $.ajax({ 
     url: 'http:///www.***/upload.php', 
     data: fd, 
     cache: false, 
     contentType: false, 
     processData: false, 
     type: 'POST', 
     success: function(data){ 
      $('#form_input')[0].reset(); 
      location.reload(); 
     } 
     }); 
    } 
    // Load files into file reader 
    reader.readAsDataURL(file); 
    } 
</script> 

所以真的所有我们在这里所做的就是移动请求代码到一个单独的功能,使canvasctx(你被宣布两次,顺便说一句),通过该功能进行访问。

+0

我应该从上面的代码中删除代码,并将其放置在具有函数'sendTheForm()' – INOH

+0

的代码之间我试着复制上面的脚本并调用'function sendFormStuff()',但是出现错误,那么我试图删除脚本标签内的那部分地方,但没有上传 – INOH

+1

它给你什么错误? – Howzieky