The combination of Paperclip and xhr.sendAsBinary is a powerful duo

Lately, I've been exploring a new method to add files to my model using paperclip.

I came across the feature of Firefox 3.6 called xhr.sendAsBinary which allows sending a file with an ajax request.

This is how I construct my request :

var xhr = new XMLHttpRequest();


xhr.open("POST", "/photos?authenticity_token=" + token 
                        + "&photo[name]=" + img.name
                        + "&photo[size]=" + img.size);

xhr.overrideMimeType('text/plain; charset=x-user-defined-binary');
xhr.sendAsBinary(bin);

The issue I'm facing is that while name and size get saved in my model, the file itself doesn't get captured by paperclip.

Here's my model:

class Photo < ActiveRecord::Base
  has_attached_file :photo, :styles => { :medium => "300x300>", :thumb => "100x100>" }
end

And this is the migration script:

def self.up
  add_column :photos, :photo_file_name,     :string
  add_column :photos, :photo_content_type,  :string
  add_column :photos, :photo_file_size,     :integer
  add_column :photos, :photo_updated_at,    :datetime
end

Finally, here's a snippet from my controller:

  # POST /photos
  # POST /photos.xml
  def create
    @photo = Photo.new(params[:photo])

    respond_to do |format|
      if @photo.save
        format.html { redirect_to(@photo, :notice => 'Photo was successfully created.') }
        format.xml  { render :xml => @photo, :status => :created, :location => @photo }
      else
        format.html { render :action => "new" }
        format.xml  { render :xml => @photo.errors, :status => :unprocessable_entity }
      end
    end
  end

Anyone have any suggestions on how to resolve this dilemma?

Thanks!

Answer №1

At last, I got it to function!

This is how my javascript file sending code appears:

 send : function() {
     try {
         var xhr = new XMLHttpRequest;
         //var url = this.form.action;
         var url = '/photos';

         var boundary    = this.generateBoundary();
         var contentType = "multipart/form-data; boundary=" + boundary;

         this.filesToUpload.forEach(function(file, index, all) {

             xhr.open("POST", url, true);
             xhr.setRequestHeader("Content-Type", contentType);

             for (var header in this.headers) {
                 xhr.setRequestHeader(header, headers[header]);
             }


             var CRLF  = "\r\n";
             var request = "--" + boundary  + CRLF;

             request += 'Content-Disposition: form-data; ';
             request += 'name="' + 'photo[name]' + '"' + CRLF + CRLF;
             request += file.name + CRLF;

             request += "--" + boundary + CRLF;

             request += 'Content-Disposition: form-data; ';
             request += 'name="' + 'photo[photo]' + '"; ';
             request += 'filename="'+ file.fileName + '"' + CRLF;

             request += "Content-Type: application/octet-stream" + CRLF + CRLF;
             request += file.value + CRLF;
             request+= "--" + boundary + "--" + CRLF;

             xhr.sendAsBinary(request);
         });
         // finally send the request as binary data
         //xhr.sendAsBinary(this.buildMessage(this.filesToUpload, boundary));
     } catch(e) {
         alert('send Error: ' + e);
     }
 }

Now Paperclip treats the file like a standard input file

Similar questions

If you have not found the answer to your question or you are interested in this topic, then look at other similar questions below or use the search

Connecting two tables in an express API

Currently, I am in the process of developing an API using Express.js. At this stage, my initial tests are functioning correctly. My goal now is to retrieve values from two separate tables. For example, consider the following 2 tables: Table_A Id: 1, Name: ...

What is the best way to make IE 10 display a pointer instead of an I-bar for a select list?

Is there a way to make IE 10 display a pointer instead of an I-bar when selecting from a list? Despite trying various methods found in similar questions, I have been unable to resolve this issue. The cursor: pointer property works as expected on other br ...

Tips for incorporating animation when opening a Jquery SimpleModal

The SimpleModal website features an animation-enabled example with the following sequence: 1. Display modal only 2. Fade in the overlay The code snippet for this animation is as follows: $("#the-div").modal({ onOpen: function (dialog) { dialog.overl ...

JavaScript API for Facebook

I've been attempting to retrieve my status from Facebook using the JavaScript API. Below is the code I have been using: <div id="fb-root"></div> <div id="data"></div> <script src="http://connect.facebook.net/en_US/all.j ...

ngDraggable does not function properly when the dropzone is larger and includes a scrollbar on the body

Here is a demo showing the issue: The current version 0.1.11 does not support drag and drop functionality. This is how I have implemented the code: <uib-accordion-group is-open="category.open" name="category-{ ...

Switching over the database for a session away from using ajax

I am currently working with an XML API that interacts with a database. My website utilizes the functions of this XML API to retrieve data from the database. I am facing a challenge where I need to update the database based on the user's selection on t ...

Establish a Connection Between Local Mongo Database and Your Application

I have successfully set up a local MongoDB connection with a React, GraphQL application. All configurations are in place and functioning properly as far as I can tell. To visually view my MongoDB databases, I have installed Compass. The content of the Ser ...

Angular module malfunction

Striving to adhere to the best coding practices, I ventured into developing an Angular app and arrived at the following setup: The index.html file includes: <!DOCTYPE html> <html ng-app='hrsApp'> <head> <title>Hrs app& ...

Having trouble parsing the get request using supertest

When testing get requests to my mLab app using supertest, I noticed an issue with the response. The regular GET request from Postman returns this: {"_id":"5b169a9951573c50d9682d52","text":"First test note","title":"Test1"} However, the response received ...

The script I added is malfunctioning when I utilize laravel/ui

Recently, I started using a template from node js during a course. While reading various posts, I learned that bootstrap utilizes jquery. It dawned on me that the script placed in the head section was causing issues when inserting scripts in other views. ...

Creating an art piece on canvas using Javascript based on an image selection

Using the webpage below, I am attempting to draw a photo selected with an iPhone on the canvas so that it can be later uploaded to a webpage via ajax. The code includes downsampling, which has been omitted for simplicity. While this code works perfectly i ...

An unexpected error event occurred while using gulp uglify

My current approach involves using gulp-uglify and gulp-concat to minify and concatenate my JavaScript files. The specific code for this process is outlined below: gulp.task('scripts', function() { gulp.src([ './development/ ...

Trouble with AJAX/PHP form failing to transmit data

Hello everyone, I have created a form that is designed to send messages without reloading the page. I followed a tutorial from and adapted it to fit my requirements. Here is the PHP code: <?php session_start(); // Define some constants define( "RECIPI ...

There seems to be nothing in the request.body that was sent

I've encountered an issue with my code - whenever I use postman or cURL to send a post request, the body is empty. const express= require('express'); const app = express(); app.use(express.json()) app.post('/',(req,res)=>{ ...

Acquire the <li> element when it is clicked using vanilla JavaScript

Whenever a user enters a value in an input field, my function automatically adds a <li> element to a <ul>. Additionally, the function assigns the attribute ( onclick="doneToggle" ) to the created <li>. function createListElement() { ...

Utilize jQuery to disable additional checkboxes when two are chosen

Presented here are 4 checkboxes. <input type="checkbox" id="41" name="4[]" value="abc" style="width:10px"></td> <input type="checkbox" id="42" name="4[]" value="qwe" style="width:10px"></td> <input type="checkbox" id="43" name=" ...

Error encountered in Ionic Angular: Camera-Injection-Error provider is missing in Module.ts

Having some trouble while trying to develop an app with ionic-angular using the Ionic/ngx camera. I keep encountering this error even after adding the camera provider in the module.ts section. View the error here Below is my module.ts file content: impo ...

Alerts for drop down menu validation with multiple buttons

My goal is to design a multi-step form that collects user information. This form consists of 5 stages: Step 1: User details (Name, email, phone, age, gender) Step 2: Yes or No question Step 3: Yes or No question Step 4: Yes or No question Step 5: Yes o ...

Explore the rear of the mapped material using a combination of Three.js and Physijs technology

I am currently working on a project in which I have created a simple cube using Three.js and Physijs. The issue I am facing is related to mapping a texture that contains transparency. I want to be able to see the texture on both sides of the cube through t ...

What is the best way to implement a delay before calling the owlCarousel function?

Is there a way to delay calling the owlCarousel function for 5 seconds? I attempted the following: $(document).ready(function(){ setInterval(function(){ $(".demo-slide").owlCarousel(); },5000); }); However, I encountered ...